php文件上传:php中文件上传的安全问题




可以读/etc/passwd!

这段

[文件上载]
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还没有决定是否接受文件上载时文件已经被存在服务器上了

这里我就不讨论利用文件上载来对服务器进行DOS攻击可能性了

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

但是我们可以肯定问题还是存在大多数PHP还是使用老方式来处理上载文件PHP设置了 4个全局变量来描述上载文件比如说上面例子:

$hello = Filename _disibledevent=>$hello_name = The original name of the file _disibledevent=>
然后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\"

上面表单数据正好满足了PHP所期望变量但是这时PHP不再处理上载文件而是处理“/etc/passwd”(通常会导致内容暴露)这种攻击可以用于暴露任何敏感文件内容 

 

Tags:  大文件上传 asp文件上传 文件上传 php文件上传

延伸阅读

最新评论

发表评论