php中文件上传的安全问题

veklqcqd813460

veklqcqd813460

2016-02-19 12:10

今天图老师小编给大家精心推荐个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设置了四个全局变量来描述上载文件,比如说上面的例子:

$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”(通常会导致内容暴露)。这种攻击可以用于暴露任何敏感文件的内容。 

 
展开更多 50%)
分享

猜你喜欢

php中文件上传的安全问题

Web开发
php中文件上传的安全问题

ASP文件中的安全问题

ASP
ASP文件中的安全问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

理解PHP及其安全问题的入门知识

PHP
理解PHP及其安全问题的入门知识

6.4 ASP文件中的安全问题

Web开发
6.4 ASP文件中的安全问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

玩具的安全问题

育儿知识 怀孕 孕妇
玩具的安全问题

JSP应用的安全问题

Java JAVA基础
JSP应用的安全问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Beginner with c# 5

Beginner with c# 5

第四节 构造函数和析构函数 [4]

第四节 构造函数和析构函数 [4]
下拉加载更多内容 ↓