Vulnerability-wiki

🧨 文件上传漏洞(File Upload Vulnerability)详解

✨ 漏洞简介

文件上传漏洞是指:攻击者通过 Web 应用提供的文件上传功能,上传恶意文件(如脚本、后门、WebShell、木马),并在服务器端执行或利用其控制服务器、窃取数据、发起横向攻击等行为。

📌 文件上传漏洞危害极大,直接导致远程代码执行(RCE) 是最常见的严重后果。


📦 文件上传的正常用途

很多 Web 应用提供上传功能,例如:

后台通常会将文件存储在某个目录,并通过 URL 进行访问。


💥 漏洞成因

  1. 未验证文件类型
    • 仅根据后缀名判断文件类型,攻击者伪造扩展名绕过(如 .php.jpg)。
  2. 未校验 MIME 类型
    • MIME 可被伪造,不能作为安全依据。
  3. 文件内容未校验
    • 上传内容中可嵌入脚本(HTML、PHP、JavaScript 等)。
  4. 上传路径可控
    • 文件被存储在 Web 根目录或可执行目录下。
  5. 文件名未过滤
    • 导致目录穿越、覆盖任意文件、XSS 等。
  6. 服务端未禁用脚本执行
    • 上传后可通过 URL 执行 WebShell。

🎯 攻击方式

1. 上传 WebShell

攻击者上传一个包含恶意代码的文件(如 shell.php),然后通过访问路径执行命令:

<?php system($_GET['cmd']); ?>

访问方式:

http://target.com/upload/shell.php?cmd=whoami

2. 伪装后缀绕过

攻击者上传伪装后缀的脚本文件:

3. 双扩展绕过

一些服务器以最后一个扩展名判断类型:

shell.jpg.php → 实际为 PHP 文件,但通过 jpg 验证绕过

4. 目录穿越覆盖

上传文件名包含 ../ 可能导致任意文件覆盖或写入:

../../../webroot/index.jsp

🧪 漏洞检测方法

📘 白盒审计

🧫 黑盒测试


🧩 常见绕过技巧

技巧 说明
双扩展 a.jpg.php
MIME 伪造 Content-Type: image/png
文件头欺骗 文件开头加入 \x89PNG 等合法图片头
Null 字节 shell.php%00.jpg(需低版本 PHP)
大小写混淆 .PHP, .PhP
利用特殊扩展 .phtml, .phar, .shtml, .jsp
拓展名白名单绕过 上传 .svg.pdf 嵌入 JavaScript
文件名覆盖 上传 .htaccess,修改目录执行规则

📌 漏洞案例

漏洞编号 漏洞描述 影响
CVE-2018-9206 DedeCMS 任意文件上传 可上传 PHP Shell
CVE-2018-10299 WordPress Plugin Arbitrary File Upload 插件上传未校验
CNVD-2019-44150 若依管理系统任意文件上传 上传 JSP 导致 RCE
CVE-2022-22965 Spring4Shell 任意写文件 可写入任意路径文件

🛡️ 防御措施

防御措施 说明
✅ 白名单文件类型校验 仅允许 .jpg, .png, .pdf
✅ 文件内容检测 使用魔术头(magic bytes)或 MIME 检查
✅ 隔离上传目录 设置上传目录为不可执行
✅ 文件重命名 上传后用随机 UUID 命名,防止伪造
✅ 不信任客户端 不要依赖前端 JS 的限制
✅ 加强权限控制 上传接口仅限认证用户
✅ 文件后处理 对图片类使用图像处理库(如 PIL)转码防脚本嵌入
✅ WAF & 审计日志 阻止已知 payload,记录上传行为

🧠 总结

项目 内容
漏洞名称 文件上传漏洞(File Upload Vulnerability)
危害等级 高危(可能导致远程代码执行)
攻击方式 上传恶意脚本并访问或利用执行
常见绕过 双扩展、MIME伪造、Null字节、白名单绕过
防御手段 类型校验、路径隔离、禁执行、重命名等

🔧 推荐工具


📚 延伸阅读


✅ 文件上传漏洞是Web 安全中最危险的漏洞之一,必须在设计阶段就考虑上传功能的安全控制。


📝 作者:ahlien 📧 邮箱:mfs24@mails.tsinghua.edu.cn
🏫 单位:Tsinghua University
📅 最后更新时间:2025-08-01