漏洞挖掘:从受限的上传漏洞到储存型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}

文件名处理特性

  1. 从最后一个"."中提取扩展名
  2. 文件名仅允许:a-z、A-Z、0-9
  3. 扩展名中可存在特殊字符(如badfile."gif可上传,但badfile.foo"gif不行)
  4. 合法文件会被重命名存储

关键突破点

文件头检测机制

目标系统仅检测文件头的前四个字节:

  • 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:严格检查完整文件头,并对文件内容进行预包装处理

漏洞利用步骤

  1. 构造恶意文件

    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--
    
  2. 上传响应

    {"result":true,"message":"/UploadFiles/redacted/redacted/5060bddf6e024def9a8f5f8b9c42ba1f.''gif","code":0}
    
  3. 触发XSS

    • 使用IE/Edge访问上传的文件URL
    • 浏览器会因MIME嗅探将文件识别为HTML并执行其中的JavaScript

技术原理详解

MIME嗅探攻击

IE/Edge浏览器默认存在MIME嗅探漏洞,会:

  1. 检查文件内容而非完全依赖Content-Type
  2. 发现<html>标签时将文件识别为text/html
  3. 执行其中的JavaScript代码

Linux文件识别对比

  • 有图像文件头(即使不完整)的文件被识别为图像
  • 无文件头但内容含HTML的文件被识别为HTML

漏洞利用条件

  1. 能够上传带有特殊字符扩展名的文件(如."gif
  2. 能够在文件中注入HTML/JS代码
  3. 目标用户使用IE/Edge浏览器访问该文件

防御建议

  1. 服务器端

    • 严格验证完整文件头
    • 使用独立域存储上传文件
    • 清除文件名中的特殊字符
    • 设置正确的Content-Type头
  2. 客户端

    • 升级到最新浏览器版本
    • 禁用MIME嗅探功能(通过X-Content-Type-Options: nosniff)

总结

该技术展示了如何将看似受限的文件上传功能转化为储存型XSS,关键在于:

  1. 利用不完整的文件头绕过检测
  2. 结合IE/Edge的MIME嗅探特性
  3. 通过特殊字符扩展名保持文件可上传性

虽然利用条件有一定限制(依赖特定浏览器),但在企业内网等特定环境中仍具有实际危害性。

从受限的文件上传漏洞到储存型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:严格检查完整文件头,并对文件内容进行预包装处理 漏洞利用步骤 构造恶意文件 : 上传响应 : 触发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嗅探特性 通过特殊字符扩展名保持文件可上传性 虽然利用条件有一定限制(依赖特定浏览器),但在企业内网等特定环境中仍具有实际危害性。