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开发文件系统实例讲解
Oct 09 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
thinkphp实现图片上传功能
Jan 13 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
PHP运行模式汇总
Nov 06 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
基于swoole实现多人聊天室
Jun 14 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php session和cookie使用说明
2010/04/07 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
js中url对象化管理分析
2017/12/29 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现Linux命令xxd -i功能
2016/03/06 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
.NET概念性的面试题
2012/02/29 面试题
C#笔试题
2015/07/14 面试题
会计自荐书
2013/12/02 职场文书
小学少先队活动方案
2014/02/18 职场文书
潘婷洗发水广告词
2014/03/14 职场文书
亲子活动总结
2014/04/26 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
2015年小学开学寄语
2015/02/27 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
MySQL Shell的介绍以及安装
2021/04/24 MySQL