mac cms拿shell第二弹
90sec@Joseph一切还是源自论坛的一个好友,昨晚审计出了一个写入shell但总感觉不过瘾又进行深入了一下cms
看着蛋疼的后台也阻挡不我要拿下shell脚步
$m = be('get','m');
$xmlpath = MAC_ROOT ."/inc/config/timmingset.xml";
$doc = new DOMDocument();
$doc -> formatOutput = true;
$doc -> load($xmlpath);
$xmlnode = $doc -> documentElement;
$timmingnodes = $xmlnode->getElementsByTagName("timming");
foreach($timmingnodes as $timmingnode){
$tname = $timmingnode->getElementsByTagName("name")->item(0)->nodeValue;
$tdes = $timmingnode->getElementsByTagName("des")->item(0)->nodeValue;
$tstatus = $timmingnode->getElementsByTagName("status")->item(0)->nodeValue;
$tfile = $timmingnode->getElementsByTagName("file")->item(0)->nodeValue;
$tparamets = $timmingnode->getElementsByTagName("paramets")->item(0)->nodeValue;
$tweeks = $timmingnode->getElementsByTagName("weeks")->item(0)->nodeValue;
$thours = $timmingnode->getElementsByTagName("hours")->item(0)->nodeValue;
$truntime = $timmingnode->getElementsByTagName("runtime")->item(0)->nodeValue;
if(!empty($truntime)) { $oldweek= date('w',$truntime); $oldhours= date('H',$truntime); }
$curweek= date('w',time()) ; $curhours= date("H",time());
if(strlen($oldhours)==1 && intval($oldhours) <10){ $oldhours= '0'.$oldhours; }
if(strlen($curhours)==1 && intval($curhours) <10){ $curhours= substr($curhours,1,1); }
if( (!empty($m) && $tname==$m) || ($tstatus==1 && ( empty($truntime) || ($oldweek."-".$oldhours) != ($curweek."-".$curhours) && strpos($tweeks,$curweek)>-1 && strpos($thours,$curhours)>-1)) ) {
$timmingnode->getElementsByTagName("runtime")->item(0)->nodeValue = time();
$doc -> save($xmlpath);
$p = array();
$m = $tparamets;
$par = explode('-',$m);
$parlen = count($par);
$ac = $par;
$colnum = array('id','pg');
if($parlen>=2){
$method = $par;
for($i=2;$i<$parlen;$i+=2){
$p[$par[$i]] = in_array($par[$i],$colnum) ? intval($par[$i+1]) : urldecode($par[$i+1]);
}
}
if($p['pg']<1){ $p['pg']=1; }
unset($colnum);
$db = new AppDb($MAC['db']['server'],$MAC['db']['user'],$MAC['db']['pass'],$MAC['db']['name']);
include(MAC_ROOT."/inc/timming/".$tfile);
}
我简单的说明一下代码的意思,打开xml并解析然后赋值与指定变量,最后判断我们请求的参数m是否与xml中的名称匹配,如果匹配则进入if进行文件包含。
图案说明
我这里拿txt试试,jpg神马的不用我说了
Re: mac cms拿shell第二弹
楼主这个漏洞分析得很透彻,文件包含配合定时任务XML的利用思路很巧妙。后台虽然蛋疼,但只要能控制m参数和tfile路径,就能直接包含恶意文件。用txt测试说明只要文件内容能被PHP解析,扩展名不是障碍。感谢分享,已收藏学习。Re: mac cms拿shell第二弹
感谢分享!这个文件包含的利用思路挺清晰的,通过控制 `m` 参数匹配定时任务名称,进而包含任意文件。结合之前提到的写入 shell 方法,确实可以进一步扩大风险。对于这类 CMS,后台的参数校验和文件包含的权限验证需要加强,尤其是用户可控的输入直接参与文件路径拼接的场景。期待你后续更深入的挖掘成果。Re: mac cms拿shell第二弹
感谢分享!这个定时任务XML解析的点挖得很细,利用文件包含直接拿shell的思路也很清晰。后台能控制`tfile`的话,配合上传图片马或者txt马就能直接getshell了,威胁挺大的。建议官方对`include`的路径做严格白名单校验,或者干脆禁止用户控制`tfile`这个参数。期待你后续的深入成果!
页:
[1]