漏洞挖掘:从受限的上传漏洞到储存型XSS
字数 1381 2025-08-26 22:11:51
从受限的文件上传漏洞到储存型XSS攻击技术分析
漏洞背景
文件上传漏洞通常被认为是获取系统权限的有效途径,但在实际渗透测试中,完全不受限制的上传点较为罕见。本文介绍了一种将受限的文件上传漏洞转化为储存型XSS的技术方法,特别针对IE/Edge浏览器的特性进行利用。
初始发现
在目标站点的"请求协助"功能中,发现了一个文件上传点,具有以下特点:
- 上传的文件存储在同一个域下(无独立文件服务器)
- 返回示例:
{"result":true,"message":"/UploadFiles/redacted/redacted/3021d74f18ddasdasd50abe934f.png,"code":0}
上传限制分析
文件类型限制
- 采用白名单策略,仅允许:jpg、jpeg、png、gif
- 尝试上传.html文件返回错误:
{"result":false,"message":"That file type is not supported.","code":0}
文件名处理特性
- 从最后一个"."中提取扩展名
- 文件名仅允许:a-z、A-Z、0-9
- 扩展名中可存在特殊字符(如
badfile."gif可上传,但badfile.foo"gif不行) - 合法文件会被重命名存储
关键突破点
文件头检测机制
目标系统仅检测文件头的前四个字节:
- JPEG:FF D8 FF DB
- GIF:47 49 46 38 (GIF8)
- PNG:89 50 4E 47
而完整文件头应为:
- GIF:47 49 46 38 39 61 (GIF89a或GIF87a)
- PNG:89 50 4E 47 0D 0A 1A 0A
浏览器差异
- IE/Edge:不严格检查完整文件头,会根据文件内容进行MIME嗅探
- Firefox/Chrome:严格检查完整文件头,并对文件内容进行预包装处理
漏洞利用步骤
-
构造恶意文件:
POST /upload HTTP/1.1 Content-Type: multipart/form-data; boundary=---------------------------6683303835495 ---------------------------6683303835495 Content-Disposition: form-data; name="upload"; filename="badfile.''gif" Content-Type: image/png GIF8 <html><script>alert('XSS is easy');</script></html> ---------------------------6683303835495-- -
上传响应:
{"result":true,"message":"/UploadFiles/redacted/redacted/5060bddf6e024def9a8f5f8b9c42ba1f.''gif","code":0} -
触发XSS:
- 使用IE/Edge访问上传的文件URL
- 浏览器会因MIME嗅探将文件识别为HTML并执行其中的JavaScript
技术原理详解
MIME嗅探攻击
IE/Edge浏览器默认存在MIME嗅探漏洞,会:
- 检查文件内容而非完全依赖Content-Type
- 发现
<html>标签时将文件识别为text/html - 执行其中的JavaScript代码
Linux文件识别对比
- 有图像文件头(即使不完整)的文件被识别为图像
- 无文件头但内容含HTML的文件被识别为HTML
漏洞利用条件
- 能够上传带有特殊字符扩展名的文件(如
."gif) - 能够在文件中注入HTML/JS代码
- 目标用户使用IE/Edge浏览器访问该文件
防御建议
-
服务器端:
- 严格验证完整文件头
- 使用独立域存储上传文件
- 清除文件名中的特殊字符
- 设置正确的Content-Type头
-
客户端:
- 升级到最新浏览器版本
- 禁用MIME嗅探功能(通过X-Content-Type-Options: nosniff)
总结
该技术展示了如何将看似受限的文件上传功能转化为储存型XSS,关键在于:
- 利用不完整的文件头绕过检测
- 结合IE/Edge的MIME嗅探特性
- 通过特殊字符扩展名保持文件可上传性
虽然利用条件有一定限制(依赖特定浏览器),但在企业内网等特定环境中仍具有实际危害性。