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去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
php引用传值实例详解学习
Nov 06 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP单元测试配置与使用方法详解
Dec 27 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上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python如何读取、写入CSV数据
2020/07/28 Python
python ssh 执行shell命令的示例
2020/09/29 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
Delphi工程师笔试题
2013/09/21 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
班组长安全职责
2014/01/05 职场文书
《颐和园》教学反思
2014/02/26 职场文书
房产公证书范本
2014/04/10 职场文书
员工年终自我评价
2014/09/14 职场文书
公司经营目标责任书
2015/01/29 职场文书
护士年终个人总结
2015/02/13 职场文书
红色经典电影观后感
2015/06/18 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
Python中的pprint模块
2021/11/27 Python
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL