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

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

缺陷编号:wooyun-2015-0110354

漏洞标题:KPPW最新版SQL注入漏洞,修补不严

相关厂商:keke.com

漏洞作者: 命途多舛

提交时间:2015-05-04 11:40

修复时间:2015-08-03 16:26

公开时间:2015-08-03 16:26

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-05-04: 细节已通知厂商并且等待厂商处理中
2015-05-05: 厂商已经确认,细节仅向厂商公开
2015-05-08: 细节向第三方安全合作伙伴开放
2015-06-29: 细节向核心白帽子及相关领域专家公开
2015-07-09: 细节向普通白帽子公开
2015-07-19: 细节向实习白帽子公开
2015-08-03: 细节向公众公开

简要描述:

KPPW最新版SQL注入漏洞,修补不严

详细说明:

1.看了http://wooyun.org/bugs/wooyun-2010-086216。这篇帖子,正巧也在审计KPPW,也就去看了用一下最新版对于爆出问题的修补方式。最新版为了防止该漏洞,添加了一个验证。

if($gUserInfo['uid'] != $pk['uid']){
kekezu::show_msg('无权操作',NULL,NULL,NULL,'error');
return false;
}


2.$gUserInfo['uid']是用户id,是我们不可控的。所以这里不能再用xfkxfk大牛的方法构造uid了。那么我们再看一下save函数。

function save($fields, $pk = array()) {
foreach ( $fields as $k => $v ) {
$kk = ucfirst ( $k );
$set_query = "set" . $kk;
$this->_table_obj->$set_query ( $v );
}
$keys = array_keys ( $pk );
$key = $keys [0];//取$pk的第一个值
if (! empty ( $pk [$key] )) {
$this->_table_obj->setWhere ( " $key = '" . kekezu::escape($pk [$key]) . "'" );
$edit_query = "edit_" . $this->_pre . $this->_table_name;
$res = $this->_table_obj->$edit_query ();
} else {
$create_query = "create_" . $this->_pre . $this->_table_name;
$res = $this->_table_obj->$create_query ();
}
if ($res) {
return $res;
} else {
return false;
}
}


2.可以看出进行数据库操作的是$pk数组中的第一个键名,那么问题来了。如果在$pk['uid']之前就已经有了一个$pk[xxx],那么进入数据库查询的就应该是xxx,而不是uid了。构造我们的payload,如测试代码所示。
3.再来看MYSQL日志中的记录。

169 Query	UPDATE keke_witkey_space SET `sex`='-1',`birthday`='2015-04-02',`truename`='lijie1',`indus_id`='131',`indus_pid`='3',`is_perfect`='1' WHERE  uid=sleep(5) -- a = '1'
150425 19:20:02 169 Query UPDATE keke_witkey_space SET `email`='test1@163.com',`sex`='-1',`birthday`='2015-04-02',`truename`='lijie1',`qq`='445566798',`msn`='wer',`phone`='',`mobile`='13800000000',`indus_id`='131',`indus_pid`='3',`province`='0',`city`='0',`area`='0',`is_perfect`='1' WHERE uid=sleep(5) -- a = '1'


4.可以看到update处已经是注入了

漏洞证明:

1.注册两个用户test1和test2。在test2里面可以直接修改test1的内容。使用test2登录,到修改个人信息的页面。

2.jpg


2.抓包,修改报的内容为

3.jpg


3.再登录test1,可以看到test1的用户名已经被越权修改为pang0lin

5.jpg

修复方案:

$keys = array_keys ( $pk );
$key = $keys [0];//这里不应该取第一个
if (! empty ( $pk [$key] )) {
$this->_table_obj->setWhere ( " $key = '" . kekezu::escape($pk [$key]) . "'" );

版权声明:转载请注明来源 命途多舛@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2015-05-05 16:24

厂商回复:

谢谢提供信息

最新状态:

暂无


漏洞评价:

评论