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 文件状态缓存带来的问题
Dec 14 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
解析link_mysql的php版
Jun 30 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 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
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
判断用户是否在线的代码
2011/03/05 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python实现ftp文件传输功能
2020/03/20 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
什么是View State?
2013/01/27 面试题
校园新闻广播稿
2014/01/10 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
简单的项目建议书模板
2014/03/12 职场文书
培训感想范文
2015/08/07 职场文书