Files
2025-09-25 03:53:17 +08:00

58 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 文件上传漏洞绕过方法
**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 文件