灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2386回复:0

[系统教程]PHP漏洞全解(9)-文件上传漏洞

楼主#
更多 发布于:2011-11-30 13:45
一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件。
下面是一个简单的文件上传表单
<form action="upload.php" method="post" enctype="multipart/form-data" name="form1">
 <input type="file" name="file1" /><br />
 <input type="submit" value="上传文件" />
 <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
</form>
php的配置文件php.ini,其中选项upload_max_filesize指定允许上传的文件大小,默认是2M
$_FILES数组变量
PHP使用变量$_FILES来上传文件,$_FILES是一个数组。如果上传test.txt,那么$_FILES数组的内容为:
$FILES
Array
{
       [file] => Array
       {
               [name] => test.txt                //文件名称
               [type] => text/plain                //MIME类型
               [tmp_name] => /tmp/php5D.tmp        //临时文件
               [error] => 0                //错误信息
               [size] => 536                //文件大小,单位字节
       }
}
如果上传文件按钮的name属性值为file
<input type="file" name="file" />
那么使用$_FILES['file']['name']来获得客户端上传文件名称,不包含路径。使用$_FILES['file']['tmp_name']来获得服务端保存上传文件的临时文件路径
存放上传文件的文件夹
PHP不会直接将上传文件放到网站根目录中,而是保存为一个临时文件,名称就是$_FILES['file']['tmp_name']的值,开发者必须把这个临时文件复制到存放的网站文件夹中。
$_FILES['file']['tmp_name']的值是由PHP设置的,与文件原始名称不一样,开发者必须使用$_FILES['file']['name']来取得上传文件的原始名称。
上传文件时的错误信息
$_FILES['file']['error']变量用来保存上传文件时的错误信息,它的值如下:


图片:56_3710_b5e476ebbd2d602.jpg



文件上传漏洞
如果提供给网站访问者上传图片的功能,那必须小心访问者上传的实际可能不是图片,而是可以指定的PHP程序。如果存放图片的目录是一个开放的文件夹,则入侵者就可以远程执行上传的PHP文件来进行攻击。
下面是一个简单的文件上传例子:
<?php
// 设置上传文件的目录
$uploaddir = "D:/www/images/";
// 检查file是否存在
if (isset($_FILES['file1']))
{
// 要放在网站目录中的完整路径,包含文件名
   $uploadfile = $uploaddir . $_FILES['file1']['name'];
// 将服务器存放的路径,移动到真实文件名
move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile);
}
?>
......
<form method="post" enctype="multipart/form-data" name="form1">
 <input type="file" name="file1" /><br />
 <input type="submit" value="上传文件" />
 <input type="hidden" name="MAX_FILE_SIZE" value="1024" />
</form>
这个例子没有检验文件后缀,可以上传任意文件,很明显的上传漏洞



喜欢0 评分0
游客

返回顶部