php中文件上传的安全问题


Posted in PHP onOctober 09, 2006

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

 

PHP 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
PHP 批量删除 sql语句
Jun 05 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
YII路径的用法总结
Jul 09 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PDO::beginTransaction讲解
Jan 27 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 PHP
ftp类(example.php)
Oct 09 #PHP
PHP概述.
Oct 09 #PHP
PHP安装问题
Oct 09 #PHP
提问的智慧
Oct 09 #PHP
DOMXML函数笔记
Oct 09 #PHP
一个很方便的 XML 类!!原创的噢
Oct 09 #PHP
提问的智慧(2)
Oct 09 #PHP
You might like
提取HTML标签
2006/10/09 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
运动检测ViBe算法python实现代码
2018/01/09 Python
Python操作json的方法实例分析
2018/12/06 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
《听鱼说话》教学反思
2014/02/15 职场文书
大学生暑期实践感言
2014/02/26 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
学校端午节活动总结
2015/02/11 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书