### 文件上传漏洞绕过方法 **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`),内容为 `` 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 文件