一、漏洞概述
-
定义 文件上传漏洞指未对用户上传的文件进行充分安全校验,导致攻击者可上传恶意文件(如Webshell、木马),进而控制服务器或执行任意代码。
-
危害等级 ⚠️ 高危漏洞(通常CVSS评分7.0+),可能导致:
-
服务器完全沦陷
-
数据泄露
-
钓鱼攻击跳板
-
内网渗透入口
-
二、常见漏洞触发点
-
未校验文件类型 仅依赖前端JS验证或未校验Content-Type。
-
黑名单机制缺陷 漏掉冷门可执行后缀(如
.phtml
,.php5
)。 -
路径处理不当 用户可控制上传路径(如
filename=../../uploads/shell.php
)。 -
未重命名文件 保留用户输入的文件名,导致覆盖或解析漏洞。
-
服务器配置错误 如Apache的
AddHandler
错误配置导致文本文件按脚本解析。
三、攻击方式
1. 直接上传Webshell
-
经典PHP Webshell
php
-
<?php @eval($_POST['cmd']); ?>
-
绕过技巧:利用短标签
<?=
、编码混淆、图片马注入。
2. 钓鱼文件攻击
-
上传伪装成图片/文档的恶意文件(如
invoice.pdf.exe
)。
3. 配合其他漏洞利用
-
文件包含漏洞:上传含恶意代码的图片,通过LFI执行。
-
解析漏洞:IIS/nginx错误解析文件名(如
shell.php.jpg
)。
四、绕过防御技巧
1. 前端绕过
-
禁用JS或修改前端校验代码(如删除
onsubmit
事件)。
2. 黑名单绕过
-
尝试非常规后缀:
.php5
,.phtml
,.phar
,.htaccess
(Apache)。 -
大小写混合:
.PhP
,.pHp
。 -
双写后缀:
.pphphp
→ 过滤后变为.php
。
3. MIME类型绕过
-
修改Content-Type为合法类型:
httpContent-Type: image/png
4. 文件头伪造
-
在恶意文件头部添加合法标识:
php
GIF89a; <?php system($_GET['cmd']); ?>
5. .htaccess攻击(Apache)
-
上传覆盖
.htaccess
文件,定义解析规则:apache
AddType application/x-httpd-php .abc
6. 特殊符号截断
-
%00截断(需PHP<5.3):
filename="shell.php%00.jpg"
7. 解析漏洞利用
-
IIS 6.0:
/uploads/shell.asp;.jpg
被解析为ASP文件。 -
Nginx畸形路径:
/uploads/shell.jpg/.php
错误解析为PHP。
五、防御方案
1. 白名单校验
-
文件扩展名:仅允许
.jpg
,.png
,.pdf
等必要类型。 -
MIME类型:从服务器端检测
magic number
(真实文件类型)。
2. 重命名文件
-
使用随机哈希值重命名(如
a3F8d9.jpg
),避免用户控制文件名。
3. 存储隔离
-
上传目录禁止脚本执行(通过服务器配置):
nginx
location /uploads/ {deny all; }
4. 文件内容检测
-
检查图片文件的宽高属性,验证是否为真实图片。
-
使用杀毒引擎扫描上传文件。
5. 限制文件大小
-
设置合理的最大上传尺寸(如10MB)。
6. 日志与监控
-
记录所有上传行为,对异常文件(如
.php
)触发告警。
7. WAF防护
-
配置规则拦截
<?php
、eval(
等危险关键词。
六、实战案例
-
Discuz! 任意文件上传漏洞 通过修改上传请求的
filename
参数绕过后缀检测。 -
WordPress插件漏洞 某些插件未校验非Ajax上传路径,导致可直接上传PHP文件。
七、测试工具
-
Burp Suite 拦截修改上传请求,测试绕过逻辑。
-
Webshell管理工具 AntSword、Cknife、Behinder(需合法授权使用)。
八、学习资源
-
OWASP文件上传防护指南: Unrestricted File Upload | OWASP Foundation
-
Upload Labs靶场: GitHub搜索 "upload-labs" 练习绕过技巧
-
《Web安全攻防:渗透测试实战指南》第6章