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下MAIL的另一解决方案
Oct 09 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php二维数组排序方法(array_multisort usort)
Dec 25 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
使用php实现从身份证中提取生日
May 09 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
PHP操作路由器实现方法示例
Apr 27 PHP
php模式设计之观察者模式应用实例分析
Sep 25 PHP
php给数组赋值的实例方法
Sep 26 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
mysql limit查询优化分析
2008/11/12 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
python利用platform模块获取系统信息
2020/10/09 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
九年级物理教学反思
2014/01/29 职场文书
物业总经理岗位职责
2014/02/28 职场文书
浪漫婚礼主持词
2014/03/14 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
教育合作协议范本
2014/10/17 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
通知函格式范文
2015/04/27 职场文书
道歉短信大全
2015/05/12 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
分家协议书范本
2016/03/22 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书