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 相关文章推荐
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php 生成文字png图片的代码
Apr 17 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
php自定义函数转换html标签示例
Sep 29 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 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无限分类(树形类)
2013/09/28 PHP
YII实现分页的方法
2014/07/09 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python队列的定义与使用方法示例
2017/06/24 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Form表单及django的form表单的补充
2019/07/25 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
解决Python安装cryptography报错问题
2020/09/03 Python
高校毕业生自我鉴定
2013/10/27 职场文书
工程项目经理岗位职责
2013/12/15 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
质量安全标语
2014/06/07 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
员工辞职信怎么写
2015/02/27 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
Python 数据可视化之Seaborn详解
2021/11/02 Python