## 一、简介
- 文件上传攻击是一种利用系统的上传点,上传恶意文件,以此来获取系统信息或取得系统控制权的一种方式,这也是`WEB`攻击中常见的方式。
- 大多数的编码者本身没有太多的安全意识,更多是在前端通过`JS`对用户上传文件进行校验,但实际上前端的`JS校验`是比较容易绕过的。而后端校验则要麻烦很多,一般是基于黑白名单后缀来进行限制,但也是有机会绕过的!
## 二、前端绕过
- 对于前端`JS校验`而言,可以直接通过`F12`检查提交按钮的关联对象,将校验对象删除或在将文件提交后,通过`BP`修改文件名为`.php、.jsp`这些类型
![image-20240510173947329](https://picture.gotarget.top/202405101741667.png)
![image-20240510174117159](https://picture.gotarget.top/202405101741578.png)
## 二、后端绕过
### 2.1 简介
在服务器后端,通产对文件扩展进行黑白名单限制匹配,此外基于文件本身特征的`MIME`进行校验。示例代码如下:
```
// blacklist test
if (preg_match('/.+\.ph(p|ps|tml)/', $fileName)) {
echo "Extension not allowed";
die();
}
// whitelist test
if (!preg_match('/^.+\.[a-z]{2,3}g$/', $fileName)) {
echo "Only images are allowed";
die();
}
// type test
foreach (array($contentType, $MIMEtype) as $type) {
if (!preg_match('/image\/[a-z]{2,3}g/', $type)) {
echo "Only images are allowed";
die();
}
}
// size test
if ($_FILES["uploadFile"]["size"] > 500000) {
echo "File too large";
die();
}
```
### 2.2 绕过黑白名单限制:
- 第一步:使用潜在扩展名列表来模糊上传功能,并查看其中哪些返回之前的错误消息。任何不返回错误消息、返回不同消息或成功上传文件的上传请求都可能指示允许的文件扩展名。
- 列表示例-注意开发语言:[传送门](https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/web-extensions.txt)
- 找到能够执行代码的扩展名:诸如常见的`PHP`,其中`phtml`、`phar`也是可以执行`php`代码的。
- 采用双延伸后缀尝试绕过:诸如`shell.jpg.php`
- 采用反向双延伸后缀尝试绕过:诸如`shell.php.png`
- 尝试使用字符注入的方式绕过,使用`%20 、%0a 、%00 、%0d0a 、/ 、.\ 、. 、… 、:`这些字符进行绕过,方法是`:`在允许的文件扩展名(例如`shell.phar:.png`)之前插入冒号,这也应该将文件写为 `shell.phar`
![img](https://picture.gotarget.top/202405101757510.jpeg)
### 2.3 绕过`MIME`限制
通常是通过检查文件内容的前几个字节来完成的,其中包含[文件签名](https://en.wikipedia.org/wiki/List_of_file_signatures)或[魔字节](https://opensource.apple.com/source/file/file-23/file/magic/magic.mime)。
- 例如,如果文件以 (`GIF87a`或`GIF89a`) 开头,则表明它是`GIF`图像,而以纯文本开头的文件通常被视为文件`Text`。如果我们将任何文件的第一个字节更改为 `GIF` 魔术字节,则其 `MIME` 类型将更改为 `GIF` 图像,无论其剩余内容或扩展名如何。
- 对于大多数上传点而言,`MIME`基本不会限制`PNG`类型,因此可以通过插入`PNG`文件签名`89 50 4E 47 0D 0A 1A 0A`于伪造文件中,进而冒充`PNG`文件,以此来饶过相关限制。
- 示例:`echo -e "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" | cat a.png > tt && mv tt a.png`
![image-20240510175109763](https://picture.gotarget.top/202405101751316.png)
### 实验:
- [HTB-FileUpload-SkillAssessment](https://academy.hackthebox.com/module/136/section/1310)
- [Special.png](https://picture.gotarget.top/202405101708138.png)
- 使用补充:
- 将该图片保存下载,然后在上传文件时使用`BP`抓包,检查文件内容,添加攻击载荷于文件体末尾,修改文件名称,以此绕过黑白名单检查。
- 该图片本身具备`XXE`的功能,可以用于访问系统文件,在将[`base64`解码](https://tool.chinaz.com/tools/base64.aspx)后,可以查看指定代码的详细情况,诸如审计`upload.php`以此来查找文件的保存路径,以便于`WEBShell`连接
![image-20240510171416648](https://picture.gotarget.top/202405101714412.png)
- 最终效果:
![image-20240510171914415](https://picture.gotarget.top/202405101719413.png)
文件上传攻击