### 文件上传漏洞绕过方法

**1. 客户端 JS 绕过**

这是最简单也是最常见的绕过方法。许多开发者为了方便，只在前端（浏览器）使用 JavaScript 脚本来检查文件类型，如 `.jpg`、`.png`、`.gif` 等

- **绕过方法：**
  - **禁用 JavaScript：** 在浏览器设置中直接禁用 JS，或者使用抓包工具（如 Burp Suite）拦截请求，修改文件名和内容后再发送
  - **抓包修改文件名：** 正常上传一个合法的图片文件（`1.jpg`），然后使用 Burp Suite 拦截数据包，将文件名修改为 `1.php`。由于服务器后端没有进行二次验证，就会直接上传成功

**2. MIME 类型绕过**

服务器有时会通过检查 HTTP 请求头中的 `Content-Type` 字段来验证文件类型。例如，一个图片的 `Content-Type` 通常是 `image/jpeg` 或 `image/png`

- **绕过方法：**
  - **修改 `Content-Type`：** 攻击者可以上传一个 `webshell.php` 文件，同时在抓包工具中将 `Content-Type` 字段从 `application/octet-stream`（默认值）修改为 `image/jpeg`。如果后端只依赖这个字段进行判断，恶意文件就会上传成功

**3. 文件头内容检测绕过（魔术字节）**

一些更安全的系统会检查文件的“魔术字节”（Magic Bytes），也就是文件头部的一串特定字节，用以识别文件类型。例如，JPEG 图片文件开头通常是 `FF D8 FF E0`

- **绕过方法：**
  - **“图片马”：** 攻击者可以将恶意代码嵌入到图片文件中，制作成一个“图片马”
  - **制作方法：**
    1. 准备一张正常的图片（`1.jpg`）和一个包含恶意代码的文本文件（`shell.php`），内容为 `<?php eval($_POST['cmd']);?>`
    2. 使用命令将两者合并：`copy 1.jpg/b + shell.php/a webshell.jpg`
  - **利用方式：**
    1. 上传 `webshell.jpg` 文件。如果服务器检查了文件头，但没有检查文件内容，就会上传成功。
    2. 然后，攻击者需要找到一种方法来解析这个图片文件，使其作为 PHP 代码执行。这通常需要结合 **文件包含漏洞（LFI）** 来实现，例如 `include('webshell.jpg')`，或者一些服务器配置错误（如 Apache 的 `.htaccess` 配置）

**4. 文件名、路径绕过**

服务器通常会有一份黑名单或白名单来限制可上传的文件扩展名。黑名单会阻止 `.php`, `.asp`, `.jsp` 等脚本文件，而白名单只允许 `.jpg`, `.png`, `.gif` 等图片文件

​	**a. 黑名单绕过**

- **大小写绕过：** `shell.Php`、`shell.pHP` 等
- **文件后缀名加空格或点：** 在 Windows IIS 服务器上，文件名末尾的空格或点会被自动去除
  - `shell.php `（空格）
  - `shell.php.`（点）
- **双重扩展名：** 某些服务器只检查最后一个扩展名
  - `shell.php.jpg`：上传后，如果服务器处理不当，可能会被当做 `shell.php` 来执行。
- **特殊字符绕过：** 利用一些特殊字符，如 `shell.php%00.jpg`（00 截断）
  - **00截断：** 在 PHP 5.3 之前，PHP 的 `move_uploaded_file()` 函数在处理文件名时，遇到 `0x00` 字节会截断后面的内容。攻击者可以在文件名中注入 `%00`，如 `shell.php%00.jpg`，上传时，服务器只检查 `.jpg`，但实际保存的文件名是 `shell.php`

​	**b. 白名单绕过**

- **服务器解析漏洞：**
  - **Apache：** 如果服务器配置了 `AddHandler php5-script .jpg`，那么所有 `.jpg` 文件都会被当作 PHP 脚本来解析
  - **IIS 6.0：** 目录解析漏洞，例如 `/xx.asp/shell.jpg`。服务器会把 `shell.jpg` 当作 ASP 脚本执行
  - **IIS 7.0/7.5：** `web.config` 配置文件解析漏洞。攻击者可以上传一个恶意的 `web.config` 文件来改变目录的解析规则
- **竞争条件（Race Condition）：**
  - 一些服务器在处理文件上传时，会先将文件临时保存，然后进行安全检查，最后再重命名或移动到目标目录
  - **利用方法：** 攻击者可以利用这个时间差，在文件被检查并删除之前，迅速访问该文件
  - **步骤：**
    1. 上传一个包含恶意代码的脚本文件（如 `shell.php`），其中恶意代码会创建一个新的 Webshell 文件
    2. 在文件上传成功后，但在服务器删除它之前，通过一个脚本循环快速访问该文件
    3. 恶意脚本被执行，并创建一个新的、无法被删除的 Webshell 文件