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 相关文章推荐
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
组合算法的PHP解答方法
Feb 04 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
浅谈如何提高PHP代码的质量
May 28 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 高手之路(三)
2006/10/09 PHP
php模板函数 正则实现代码
2012/10/15 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
javascript类型转换示例
2014/04/29 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
js随机生成一个验证码
2017/06/01 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
JS如何把字符串转换成json
2020/02/21 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
python 判断一个进程是否存在
2009/04/09 Python
python概率计算器实例分析
2015/03/25 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
python 生成器协程运算实例
2017/09/04 Python
Python实现Linux监控的方法
2019/05/16 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
this关键字的作用
2016/01/30 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书