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

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

缺陷编号:wooyun-2015-0143843

漏洞标题:kppw最新版一处函数五处注入

相关厂商:keke.com

漏洞作者: 路人甲

提交时间:2015-10-07 09:26

修复时间:2016-01-11 15:32

公开时间:2016-01-11 15:32

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

SQL

详细说明:

问题函数在 \lib\sys\keke_task_release_class.php
filerPic函数
具体代码如下:

public function filerPic($file_ids){
global $_K;
if($file_ids){
$exts = array('gif','jpg','jpeg','png');
$info = db_factory::query(' select file_name,save_name from '.TABLEPRE.'witkey_file where file_id in ('.$file_ids.')');
$pic = array();
foreach($info as $v){
$t = explode('.',$v['file_name']);
$ext = strtolower($t[sizeof($t)-1]);
if(in_array($ext,$exts)){
$pic[] = $_K['siteurl'].'/'.$v['save_name'];
}
}
return implode(',',$pic);
}else{
return NULL;
}
}


$info = db_factory::query(' select file_name,save_name from '.TABLEPRE.'witkey_file where file_id in ('.$file_ids.')');


此处$file_ids无单引号保护,无过滤,向上跟踪。

$3~`91G)%IU6}GWMS](23`1.png


来到lib\sys\keke_task_release_class.php 的public_pubtask函数。
部分代码如下:

public function public_pubtask() {
$this->submit_check ();
$std_obj = $this->_std_obj;
$release_info = $std_obj->_release_info;
$task_obj = $this->_task_obj;
$user_info = $this->_user_info;
$task_obj->setModel_id ( $this->_model_id );
$task_obj->setIndus_id ( $release_info ['indus_id'] );
$task_obj->setIndus_pid ( $release_info ['indus_pid'] );
$task_obj->setProvince ( $release_info ['province'] );
$task_obj->setCity ( $release_info ['city'] );
$task_obj->setArea ( $release_info ['area'] );
$task_obj->setTask_title ( kekezu::str_filter ( kekezu::escape($release_info ['txt_title']) ) );
$task_obj->setTask_desc ( kekezu::str_filter ( kekezu::escape($release_info ['tar_content'] ) ) );
$strFileIds = implode ( ',', array_filter ( explode ( '|', $release_info ['file_ids'] ) ) );
$task_obj->setTask_file ( $strFileIds );
$task_obj->setTask_pic($this->filerPic($strFileIds));
$task_obj->setContact ( $release_info['txt_mobile'] );
$task_obj->setProfit_rate ( $this->_task_config ['task_rate'] );
$task_obj->setTask_fail_rate ( $this->_task_config ['task_fail_rate'] );
$task_obj->setTask_cash ( $release_info ['txt_task_cash']);
$task_obj->setReal_cash ( $release_info ['txt_task_cash'] * (100 - $this->_task_config ['task_rate']) / 100);
$task_obj->setStart_time ( time () );
$time_arr = getdate ();


可以看到代入filterPic函数的变量:

$strFileIds = implode ( ',', array_filter ( explode ( '|', $release_info ['file_ids'] ) ) );
$task_obj->setTask_file ( $strFileIds );
$task_obj->setTask_pic($this->filerPic($strFileIds));


简单的进行了字符串拆分和组合成数组然后将数组连接为字符串。并无判断和过滤。
接下来进一步跟踪看$release_info形成时有无过滤。

64%QI1OGSZ[%Z7U1$J9W2HT.png


有五处引用public_pubtask()
选取第一处进行跟踪
来到 task\dtender\lib\dtender_release_class.php pub_task()函数
再继续跟进
最终引用地为 task\dtender\control\pub.php
具体代码如下:

case 'step3':
$intFileCount = 0;
if($arrPubInfo['file_ids']){
$intFileCount = count(explode('|',$arrPubInfo['file_ids']));;
}
if (isset($formhash)&&kekezu::submitcheck($formhash)) {
$arrPayitems = array(
'urgent'=>intval($txt_urgent),
'tasktop'=>intval($txt_tasktop)&&intval($text_tasktop) ?intval($text_tasktop):0,
'workhide'=>intval($txt_workhide),
'seohide'=>intval($txt_seohide),
);
$arrPayitems = array_filter($arrPayitems);
PayitemClass::validPayitemCount($arrPayitems, $arrPubInfo['txt_task_day']);
$_POST['payitem'] = $arrPayitems;
$arrPubInfo and $_POST = array_merge ( $arrPubInfo, $_POST );
$objRelease->save_task_obj ( $_POST, $stdCacheName );
$intTaskId = $objRelease->pub_task ();
$objRelease->update_task_info ( $intTaskId, $stdCacheName );
kekezu::show_msg($tips,$strUrl.'&step=step4&taskId='.$intTaskId,NULL,NULL,'ok');
}else{
!$_SESSION[$stdCacheName] and kekezu::show_msg($_lang ['friendly_notice'],"index.php?do=pubtask&id=$id",2,"任务已提交,不可再返回修改!","warning");
$objRelease->check_access($step, $id, $arrPubInfo);
$strTarComment = htmlspecialchars_decode($arrPubInfo['tar_content']);
$strCommentLen = strlen($strTarComment);
if($strCommentLen > 1000 ){
$strPartComment = kekezu::cutstr($strTarComment,1000);
}
}
break;


并没有对fileids做特别过滤处理
因为生成fileids在step2,并且并没有严格的判断。
来实际操作演示一下,首先登录,选择发布任务

~H}LFZMMT`N%[0IL~(HY9O7.png


到step2提交的时候抓包,如果上传了附件则会产生fileids,此处直接替换成我们要注入的脚本

FXF7UK{7AQ4]2KGB`RN8AUR.png


因为函数是在step3提交时调用。
所以直接step3提交,

9]MV$BS3KZ4~0HCRR)TCGB8.png


成功注入盲注语句延时。
其余四处原理一样,就不一一演示了。

漏洞证明:

如上。

修复方案:

同在武汉,求请吃饭

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-10-11 16:20

厂商回复:

感谢您的关注和支持,我们会尽快修复

最新状态:

暂无


漏洞评价:

评价