bugbounty:利用文件上传 MIME嗅探到存储型XSS
字数 2007 2025-08-26 22:11:28
利用文件上传MIME嗅探实现存储型XSS攻击技术分析
1. 漏洞背景与发现过程
1.1 文件上传功能的安全风险
- 文件上传功能常导致高严重性漏洞
- 用户上传文件存储在同一域名下会增加安全风险
- 可能导致存储型XSS甚至远程代码执行(RCE)
1.2 初始发现
- 在私有程序的"联系支持"功能中发现文件上传点
- 上传的图片存储在相同域名下
- 文件URL可直接访问,如:
https://redacted.com/UploadFiles/redacted/redacted/5060bddf6e024def9a8f5f8b9c42ba1f."gif
2. 文件上传过滤机制分析
2.1 文件扩展名过滤机制
-
过滤流程:
- 从文件名最后一个
.后获取扩展名 - 删除所有非字母数字字符(非a-z A-Z 0-9)
- 检查扩展名是否在白名单中(gif,png,jpg,jpeg)
- 如果在白名单中,则使用原始扩展名创建文件
- 从文件名最后一个
-
特殊字符处理特性:
badfile."gif被接受badfile.foo"gif被拒绝- 说明过滤逻辑只处理最后一个点后的扩展名
2.2 文件内容签名检查
- 检查文件"魔术字节"(magic bytes),即文件签名
- 常见图像文件签名:
- JPEG:
FF D8 FF DB(ÿØÿÛ) - GIF:
47 49 46 38(GIF8) - PNG:
89 50 4E 47(‰PNG)
- JPEG:
- 许多过滤器只检查前4个字节
3. 绕过技术详解
3.1 文件扩展名绕过
- 利用特殊字符构造畸形扩展名:
filename="badfile.''gif" - 实际保存的文件名为:
5060bddf6e024def9a8f5f8b9c42ba1f."gif"
3.2 文件内容绕过
- 在文件开头添加GIF签名前4字节:
GIF8 - 后面接恶意HTML代码:
GIF8<html><script>alert('XSS is easy');</script></html>
3.3 完整攻击Payload示例
--6683303835495
Content-Disposition: form-data; name="upload"; filename="badfile.''gif"
Content-Type: image/png
GIF8<html><script>alert('XSS is easy');</script></html>
--6683303835495--
4. 浏览器行为分析
4.1 不同浏览器处理方式对比
Internet Explorer/Edge
- 不严格检查文件签名
- 进行MIME嗅探(内容嗅探):
- 检查文件内容决定Content-Type
- 发现HTML标签会将Content-Type设为
text/html - 忽略不完整的文件签名
- 完全基于文件扩展名决定如何处理文件
Firefox/Chrome
- 严格检查完整的文件签名:
- GIF完整签名:
47 49 46 38 39 61(GIF89a) - PNG完整签名:
89 50 4E 47 0D 0A 1A 0A
- GIF完整签名:
- 仅前4字节签名不足以欺骗浏览器
- 新版本添加内容预包装机制,破坏HTML执行
4.2 文件签名测试案例
-
仅4字节签名文件:
- 内容:
GIF8+ HTML - Linux
file命令识别为GIF - IE/Edge渲染为HTML
- Firefox/Chrome不渲染为GIF
- 内容:
-
完整签名文件:
- 内容:
GIF89a+ HTML - 所有工具识别为GIF
- 浏览器行为取决于实现
- 内容:
-
无签名但正确扩展名:
- 内容:纯HTML
- 扩展名:
.gif file命令识别为HTML- IE/Edge可能渲染为HTML
5. 技术原理:MIME嗅探
5.1 MIME嗅探定义
- 浏览器通过检查文件内容而非Content-Type头来确定文件类型
- 主要用于处理不正确或缺失的Content-Type
5.2 安全影响
- 允许攻击者通过精心构造的文件内容欺骗浏览器
- IE/Edge默认启用且行为较为宽松
- 现代浏览器(Firefox/Chrome)增加了防护措施
6. 防御建议
6.1 文件上传安全措施
-
扩展名处理:
- 完全规范化文件名,移除所有特殊字符
- 使用白名单而非黑名单
-
内容验证:
- 验证完整的文件签名,而非仅前几个字节
- 使用图像处理库尝试实际解析文件
-
存储隔离:
- 将用户上传文件存储在独立域名
- 使用CDN或专用文件存储服务
-
Content-Type强制:
- 服务端强制设置正确的Content-Type
- 添加
X-Content-Type-Options: nosniff头
6.2 浏览器防护
- 现代浏览器已改进MIME嗅探行为
- Firefox/Chrome的内容预包装机制增加攻击难度
- 教育用户不要轻易禁用安全设置
7. 漏洞利用限制
- 主要影响IE/Edge浏览器
- 现代浏览器防护增加利用难度
- 可能需要社会工程配合(如诱导用户禁用安全设置)
- 在严格环境下可能被视为"Self-XSS"
8. 总结
本案例展示了如何通过精心构造的文件名和内容绕过文件上传限制,利用浏览器MIME嗅探特性实现存储型XSS。关键在于:
- 利用特殊字符绕过扩展名检查
- 添加部分文件签名绕过内容检查
- 依赖IE/Edge宽松的MIME嗅探行为
这种技术突显了文件上传功能实现中的常见陷阱,以及浏览器行为差异带来的安全影响。防御需要多层次的验证和隔离措施。