在当今的Web安全攻防体系中,文件上传漏洞(File Upload Vulnerability)始终占据着举足轻重的地位。它允许攻击者将恶意脚本(如WebShell)上传至服务器,并通过访问该文件实现远程代码执行(RCE),最终完全控制目标服务器。

然而,随着安全意识的提升,开发者和运维人员普遍会在系统中部署各种上传限制策略。因此,对于渗透测试人员和红队成员而言,掌握各类绕过技术成为成功利用上传漏洞的关键。
本文将系统梳理文件上传漏洞的常见过滤机制,并深入剖析六大类、超过20种实用的绕过方式,助你从理论到实战全面掌握这一核心攻防技能。
什么是文件上传漏洞?
文件上传功能是现代Web应用的基础组件之一,用于用户上传头像、附件或媒体资源。但若服务器对上传文件的类型、内容、路径等缺乏严格校验,攻击者便可能上传一个可执行的PHP、JSP或ASPX文件(俗称“小马”或“WebShell”),从而获得与服务器交互的权限。
✅ 核心危害:
远程命令执行(GetShell)
数据库窃取与篡改
内网横向渗透(如上传Cobalt Strike beacon)
网站挂马与钓鱼
常见的上传过滤机制
为了防止恶意文件上传,常见的防护手段包括:
前端JavaScript校验
Content-Type / MIME类型检查
后缀名黑名单/白名单
文件内容检测(如图片头校验)
文件大小限制
服务端二次渲染或重命名
而我们的任务,就是针对这些机制逐一寻找突破口。
六大类文件上传绕过方式详解
🔹 类型一:前端过滤绕过
原理:许多老旧系统仅在浏览器端使用JavaScript进行文件类型校验,这种验证极易被绕过。
绕过方法:
禁用JavaScript:在浏览器设置中关闭JS执行,直接上传任意文件。
Burp Suite抓包改包:使用Burp拦截上传请求,修改
filename="shell.php"并保留原始文件内容。F12修改HTML代码:手动编辑input元素的accept属性为
*/*或application/octet-stream。
📌 判断依据:上传时无网络请求发出 → 基本可判定为纯前端校验。
🔹 类型二:MIME类型绕过
原理:服务器通过HTTP头中的Content-Type字段判断文件类型(如image/jpeg)。此值由客户端发送,可伪造。
绕过方法:
抓包后将
Content-Type: text/php改为Content-Type: image/png使用Python脚本自动化构造合法MIME头上传木马
⚠️ 注意:需配合其他绕过方式(如后缀名处理)才能生效。
🔹 类型三:文件扩展名绕过(黑名单 vs 白名单)
3.1 黑名单绕过的常见手法
当服务器禁止.php、.jsp等后缀时,可通过以下方式绕过:
| 绕过方式 | 示例 | 说明 |
|---|---|---|
| 大小写混合 | .pHp, .PhP5 | Windows不区分大小写 |
| 双写后缀 | .pphphp | 删除黑名单词后剩余.php |
| 特殊后缀解析 | .php3, .php4, .phtml | 部分配置支持这些别名 |
| 点号绕过 | shell.php. 或 shell.php | 末尾空格或点被自动去除 |
| ::$DATA绕过 | shell.php::$DATA | Windows NTFS流特性 |
| 短文件名 | shell~1.php | 利用Windows 8.3格式 |
3.2 白名单绕过(更难但仍有突破口)
即使只允许.jpg, .png等图片格式,仍可尝试:
0x00截断攻击(Null Byte Injection)
构造文件名为shell.php%00.jpg,PHP < 5.3.4版本中,底层C函数会以\0为字符串结尾,实际写入shell.php。路径拼接漏洞
如上传shell.php/.jpg,某些逻辑错误可能导致解析为shell.php
🔹 类型四:文件内容检测绕过
有些系统不仅看后缀,还会读取文件头部信息(Magic Number)来判断是否为合法图片。
绕过策略:
| 检测方式 | 绕过方法 |
|---|---|
| 文件头校验 | 在PHP一句话前加上GIF头:GIF89a<?php eval($_POST[1]);?> |
| getimagesize() | 使用工具生成含恶意代码的合法图片(如PNG的PLTE块注入) |
| exif_imagetype() | 同上,构造“合法”图像元数据 |
💡 推荐工具:
jpg_payload.php脚本可在JPG文件中嵌入WebShell并保持可渲染性。
🔹 类型五:条件竞争(Race Condition)
原理:利用服务器“先上传 → 再删除”的逻辑漏洞,在极短时间内访问刚上传的文件,使其在被删除前被执行。
典型场景代码:
攻击方式:
编写一个创建WebShell的PHP木马(如写入
backdoor.php)使用Burp Intruder或Python脚本高并发访问该临时文件
在
unlink()执行前触发PHP解析,完成持久化植入
🧪 此类漏洞常出现在临时文件处理流程中,自动化工具成功率较高。
🔹 类型六:高级绕过与组合技
6.1 .htaccess解析绕过(Apache特有)
上传自定义
.htaccess文件,内容为:配合上传
shell.png,Apache会将其当作PHP执行
6.2 二次渲染绕过
上传一张包含WebShell的图片
服务器“处理”图片(如加水印)后,部分数据块未清除恶意代码
新生成的图片仍可触发解析漏洞
6.3 文件包含联动
先上传非PHP后缀的恶意文件(如
.phar,.log)利用本地文件包含(LFI)漏洞包含该文件,强制PHP引擎解析执行
如何有效防御文件上传漏洞?
作为开发者或安全工程师,应采取多层次防护策略:
✅ 强制白名单机制:仅允许.jpg, .png, .pdf等必要格式
✅ 重命名上传文件:使用UUID或时间戳命名,避免原名解析
✅ 隔离上传目录:设置disable_functions,禁止执行PHP脚本
✅ 文件内容扫描:使用ClamAV等杀毒引擎检测恶意代码
✅ WAF防护:部署ModSecurity等规则拦截可疑上传行为
✅ 最小权限原则:上传目录禁止执行权限(chmod 644)
攻防对抗永不停歇
文件上传漏洞的本质是信任边界失控。任何依赖客户端或单一维度的校验都不可靠。攻击者不断探索新的绕过技巧,而防守方则需构建纵深防御体系。
🔐 安全准则提醒:
本文内容仅供合法渗透测试与安全研究使用!未经授权的攻击行为违反《网络安全法》,切勿以身试法!
掌握这些绕过技术,不仅能提升你的渗透能力,更能帮助你在开发中写出更安全的代码。真正的高手,既懂进攻,也擅防守。





















