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令牌 Token改进版
Jul 18 PHP
flash用php连接数据库的代码
Apr 21 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 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 strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
应届生求职推荐信
2013/10/28 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
付款委托书范本
2014/04/04 职场文书
工商管理本科生求职信
2014/07/13 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
同意迁入证明模板
2014/10/26 职场文书