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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
php4的session功能评述(一)
Oct 09 PHP
php a simple smtp class
Nov 26 PHP
Windows下安装Memcached的步骤说明
Apr 25 PHP
PHP将XML转数组过程详解
Nov 13 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 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
简单的PHP缓存设计实现代码
2011/09/30 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
php实现微信模板消息推送
2018/03/30 PHP
javascript操作css属性
2013/12/30 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
Javascript的this用法
2017/01/16 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
JavaScript进制转换实现方法解析
2020/01/18 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
Django框架 querySet功能解析
2019/09/04 Python
Python 没有main函数的原因
2020/07/10 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
初中思想品德教学反思
2016/02/24 职场文书
公司与个人合作协议书
2016/03/19 职场文书
Python 制作自动化翻译工具
2021/04/25 Python