可以读 / etc/passwd!
这段
[文件上载]
PHP 自动支持基于 RFC 1867 的文件上载, 我们看下面的例子:
上面的代码让用户从本地机器选择一个文件, 当点击提交后, 文件就会被上载到服务器这显然是很有用的功能, 但是 PHP 的响应方式使这项功能变的不安全当 PHP 第一次接到这种请求, 甚至在它开始解析被调用的 PHP 代码之前, 它会先接受远程用户的文件, 检查文件的长度是否超过 $MAX_FILE_SIZE variable 定义的值, 如果通过这些测试的话, 文件就会被存在本地的一个临时目录中
因此, 攻击者可以发送任意文件给运行 PHP 的主机, 在 PHP 程序还没有决定是否接受文件上载时, 文件已经被存在服务器上了
这里我就不讨论利用文件上载来对服务器进行 DOS 攻击的可能性了
让我们考虑一下处理文件上载的 PHP 程序, 正如我们上面说的, 文件被接收并且存在服务器上 (位置是在配置文件中指定的, 一般是 / tmp), 扩展名一般是随机的, 类似 phpxXuoXG 的形式 PHP 程序需要上载文件的信息以便处理它, 这可以通过两种方式, 一种方式是在 PHP 3 中已经使用的, 另一种是在我们对以前的方法提出安全公告后引入的
但是, 我们可以肯定的说, 问题还是存在的, 大多数 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"
上面的表单数据正好满足了 PHP 程序所期望的变量, 但是这时 PHP 程序不再处理上载的文件, 而是处理 / etc/passwd(通常会导致内容暴露) 这种攻击可以用于暴露任何敏感文件的内容
来源: https://www.php1.cn/detail/php-54a1865e8f.html