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 相关文章推荐
真正的ZIP文件操作类(php)
Jul 21 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
关于js与php互相传值的介绍
Jun 25 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
浅谈PHP封装CURL
Mar 06 PHP
在laravel中实现将查询的对象转换为多维数组的函数
Oct 21 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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 VS ASP
2006/10/09 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
php链式操作的实现方式分析
2019/08/12 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python的randrange()方法使用教程
2015/05/15 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
pandas中ix的使用详细讲解
2020/03/09 Python
python 19个值得学习的编程技巧
2020/08/15 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
EJB的基本架构
2016/09/22 面试题
献爱心倡议书
2014/04/14 职场文书
副总经理任命书
2014/06/05 职场文书
2015年工会工作总结
2015/03/30 职场文书
亮剑观后感300字
2015/06/05 职场文书
js 实现验证码输入框示例详解
2022/09/23 Javascript