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

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

缺陷编号: WooYun-2014-67424

漏洞标题: Hdwiki最新版二次注入一枚

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

漏洞作者: ′雨。认证白帽子

提交时间: 2014-07-11 11:37

公开时间: 2014-10-06 11:38

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

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

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

Tags标签: 无

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-11: 细节已通知厂商并且等待厂商处理中
2014-07-16: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-09-09: 细节向核心白帽子及相关领域专家公开
2014-09-19: 细节向普通白帽子公开
2014-09-29: 细节向实习白帽子公开
2014-10-06: 细节向公众公开

简要描述:

上Hdwiki官网 发现更新日期一直都没变。
还以为一直都没更新了, 结果今天下载一个下来看看。
发现之前发的洞竟然都补掉了。

非盲注 直接出数据。

ps. 更新程序了应该还是把日期更新了一下 要不别人会一直以为没更新的。

详细说明:

在user/pms.php中

code 区域
function doblacklist(){
if(isset($this->post['blacklist'])){
$blacklist = htmlspecialchars(string::stripscript($this->post['blacklist']));
if(empty($blacklist)){
$result = $_ENV['pms']->remove_blacklist($this->user['uid']);
}else{
$result = $_ENV['pms']->add_blacklist($blacklist,$this->user['uid']);
}





add_blacklist($blacklist,$this->user['uid']);



$blacklist = htmlspecialchars(string::stripscript($this->post['blacklist'])



post 都会转义的。 来看看这函数 stripscript



code 区域
function stripscript($string){
$pregfind=array("/<script.*>.*<\/script>/siU",'/on(error|mousewheel|mouseover|click|load|onload|submit|focus|blur|start)="[^"]*"/i');
$pregreplace=array('','',);
$string=preg_replace($pregfind,$pregreplace,$string);
return $string;
}
}





这是过滤了一些xss常用的。



code 区域
function add_blacklist($blacklist,$uid){
return($this->db->query("REPLACE INTO ".DB_TABLEPRE."blacklist (uid,blacklist) VALUES('$uid','$blacklist')"));
}





然后直接入库, 虽然转义了 但是转义后入库之后转义符会被消除的。



来看看哪里出库了。



依旧在control/pms.php中



code 区域
function dobox(){
$this->get[3] = empty($this->get[3]) ? NULL : $this->get[3];
$page = max(1,isset($this->get[4]) ? $this->get[4] : $this->get[3]);
$num = isset($this->setting['list_prepage'])?$this->setting['list_prepage']:20;
$start_limit = ($page - 1) * $num;
$count = $_ENV['pms']->get_totalpms($this->user['uid'], $this->get[2]);





code 区域
function get_totalpms($uid, $type, $group=''){

$sqladd = '';
if($type == 'inbox'){
$blacklist = $this->get_blacklist($uid);
if($blacklist == '[ALL]'){
return '0';
}else{
$blackuser = str_replace(",","','",$blacklist);

if($group){
$sqladd = ($group == 'owner') ? 'AND og=0' : 'AND og=1';
}
$query = "SELECT COUNT(*) num FROM ".DB_TABLEPRE."pms WHERE toid='$uid' AND delstatus!=2 AND drafts!=1 $sqladd AND `from` NOT IN ('$blackuser')";

}
}else{
$sqladd = ($type == 'outbox') ? 'drafts!=1' : 'drafts=1';
$query = "SELECT COUNT(*) as num FROM ".DB_TABLEPRE."pms WHERE fromid='$uid' AND delstatus!=1 AND $sqladd";
}
$total = $this->db->fetch_first($query);
return $total['num'];
}





$blacklist = $this->get_blacklist($uid);



code 区域
function get_blacklist($uid){
$user = $this->db->fetch_first("SELECT blacklist FROM ".DB_TABLEPRE."blacklist WHERE uid='".$uid."'");
return $user['blacklist'];
}



这里把刚才入库的查询了出来 成功引入了单引号。



code 区域
$blackuser = str_replace(",","','",$blacklist);

if($group){
$sqladd = ($group == 'owner') ? 'AND og=0' : 'AND og=1';
}
$query = "SELECT COUNT(*) num FROM ".DB_TABLEPRE."pms WHERE toid='$uid' AND delstatus!=2 AND drafts!=1 $sqladd AND `from` NOT IN ('$blackuser')";



然后查询出来后赋值给$blackuser 然后带入了查询当中, 而且在最后

return $total['num'];

return回来后直接 $this->view->assign('count',$count); 输出来。



就可以直接出数据。

$blackuser = str_replace(",","','",$blacklist);

在这里会把逗号替换 然后就不用逗号来注入把。



漏洞证明:

h1.jpg





首先在忽略列表里面添加这样的语句



然后访问





h2.jpg





直接出数据。

修复方案:

转义一下。



挖洞不易 给个20分把。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

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

忽略时间:2014-10-06 11:38

厂商回复:

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-07-11 11:59 | 索马里的海贼 ( 普通白帽子 | Rank:264 漏洞数:25 | http://tieba.baidu.com/f?kw=WOW)
    0

    大圣收了神通吧

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