php中文件上传的安全问题
2023-06-13 09:13:42 时间
可以读/etc/passwd!
这段。。
[文件上载]
PHP自动支持基于RFC1867的文件上载,我们看下面的例子:
<FORMMETHOD="POST"ENCTYPE="multipart/form-data">
<INPUTTYPE="FILE"NAME="hello">
<INPUTTYPE="HIDDEN"NAME="MAX_FILE_SIZE"VALUE="10240">
<INPUTTYPE="SUBMIT">
</FORM>
上面的代码让用户从本地机器选择一个文件,当点击提交后,文件就会被上载到服务器。这显然是很有用的功能,但是PHP的响应方式使这项功能变的不安全。当PHP第一次接到这种请求,甚至在它开始解析被调用的PHP代码之前,它会先接受远程用户的文件,检查文件的长度是否超过“$MAX_FILE_SIZEvariable”定义的值,如果通过这些测试的话,文件就会被存在本地的一个临时目录中。
因此,攻击者可以发送任意文件给运行PHP的主机,在PHP程序还没有决定是否接受文件上载时,文件已经被存在服务器上了。
这里我就不讨论利用文件上载来对服务器进行DOS攻击的可能性了。
让我们考虑一下处理文件上载的PHP程序,正如我们上面说的,文件被接收并且存在服务器上(位置是在配置文件中指定的,一般是/tmp),扩展名一般是随机的,类似“phpxXuoXG”的形式。PHP程序需要上载文件的信息以便处理它,这可以通过两种方式,一种方式是在PHP3中已经使用的,另一种是在我们对以前的方法提出安全公告后引入的。
但是,我们可以肯定的说,问题还是存在的,大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件,比如说上面的例子:
$hello=Filenameonlocalmachine(e.g"/tmp/phpxXuoXG")
$hello_size=Sizeinbytesoffile(e.g1024)
$hello_name=Theoriginalnameofthefileontheremotesystem(e.g"c:\\temp\\hello.txt")
$hello_type=Mimetypeofuploadedfile(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”(通常会导致内容暴露)。这种攻击可以用于暴露任何敏感文件的内容。
这段。。
[文件上载]
PHP自动支持基于RFC1867的文件上载,我们看下面的例子:
<FORMMETHOD="POST"ENCTYPE="multipart/form-data">
<INPUTTYPE="FILE"NAME="hello">
<INPUTTYPE="HIDDEN"NAME="MAX_FILE_SIZE"VALUE="10240">
<INPUTTYPE="SUBMIT">
</FORM>
上面的代码让用户从本地机器选择一个文件,当点击提交后,文件就会被上载到服务器。这显然是很有用的功能,但是PHP的响应方式使这项功能变的不安全。当PHP第一次接到这种请求,甚至在它开始解析被调用的PHP代码之前,它会先接受远程用户的文件,检查文件的长度是否超过“$MAX_FILE_SIZEvariable”定义的值,如果通过这些测试的话,文件就会被存在本地的一个临时目录中。
因此,攻击者可以发送任意文件给运行PHP的主机,在PHP程序还没有决定是否接受文件上载时,文件已经被存在服务器上了。
这里我就不讨论利用文件上载来对服务器进行DOS攻击的可能性了。
让我们考虑一下处理文件上载的PHP程序,正如我们上面说的,文件被接收并且存在服务器上(位置是在配置文件中指定的,一般是/tmp),扩展名一般是随机的,类似“phpxXuoXG”的形式。PHP程序需要上载文件的信息以便处理它,这可以通过两种方式,一种方式是在PHP3中已经使用的,另一种是在我们对以前的方法提出安全公告后引入的。
但是,我们可以肯定的说,问题还是存在的,大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件,比如说上面的例子:
$hello=Filenameonlocalmachine(e.g"/tmp/phpxXuoXG")
$hello_size=Sizeinbytesoffile(e.g1024)
$hello_name=Theoriginalnameofthefileontheremotesystem(e.g"c:\\temp\\hello.txt")
$hello_type=Mimetypeofuploadedfile(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”(通常会导致内容暴露)。这种攻击可以用于暴露任何敏感文件的内容。
相关文章
- PHPanywhere:随时随地编辑 PHP 文件
- PHP文件上传
- PHP访问REST API上传文件的解决方案详解编程语言
- php上传Excel文件时如何判断文件中有图片详解编程语言
- php sleep在高并发下的问题详解编程语言
- Linux下搭建完善的PHP开发环境(linux搭建php环境)
- 的关系PHP与Oracle的良好结合(php和oracle)
- PHP向MySQL中安全插入数据(php插入mysql)
- PHP与MySQL结合使用实现关联查询的方法(php关联mysql查询)
- PHP快速获取MySQL数据库信息(php获取mysql信息)
- PHP编译Redis:提升网站性能的利器(php编译redis)
- MySQL与PHP的连接:实现快速数据库访问(mysql连接php)
- 使用PHP编辑器轻松编写Linux平台代码(php编辑器linux)
- PHP如何正确配置MongoDB数据库连接?(php配置mongodb)
- Linux环境下轻松配置PHP:简单指南(linux下配置php)
- PHP实现华丽丽的图片上传 MySQL储存精妙记录(php上传图片mysql)
- Oracle PHP扩展拓展你的开发空间(oracle php扩展)
- 内存Redis自动优化PHP内存管理(redis自动释放php)
- PHP文件上传实例详解!!!
- PHP图片文件上传实现代码
- php入门学习知识点六PHP文件的读写操作代码
- php下载文件的代码示例
- 使用PHP遍历文件目录与清除目录中文件的实现详解
- php上传文件,创建递归目录的实例代码
- PHP上传文件时文件过大$_FILES为空的解决方法
- php断点续传之如何分割合并文件
- PHP读取大文件的类SplFileObject使用介绍
- 使用ajaxfileupload.js实现ajax上传文件php版