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出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 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冒泡排序
2014/12/30 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
Python中List.index()方法的使用教程
2015/05/20 Python
python中reload(module)的用法示例详解
2017/09/15 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
python 实现兔子生兔子示例
2019/11/21 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
MYSQL支持事务吗
2013/08/09 面试题
教研活动主持词
2015/07/03 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
Python爬取某拍短视频
2021/06/11 Python
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang