通过滥用 CSS 解析来窃取本地文件内容
字数 1760 2025-08-27 12:33:31

通过滥用CSS解析窃取本地文件内容的技术分析

漏洞概述

本技术文档详细分析了一种通过滥用CSS解析机制窃取本地文件内容的攻击方法。该漏洞利用了浏览器对file://协议资源的特殊处理方式,允许恶意页面将任意本地资源作为CSS加载并解析,从而跨域泄露本地文件数据。

漏洞原理

  1. 核心机制:当通过file://协议加载本地资源时,浏览器不会强制定义Content-Type,恶意页面可以将任何本地资源作为CSS加载,而不管其实际MIME类型。

  2. 浏览器行为

    • Chrome浏览器会根据文件扩展名猜测MIME类型
    • 当解析错误的资源时会显示警告:"资源被解析成样式表,但是被传输的MIME类型是text/html"
    • 这种警告暗示了避免使用file://探测主机文件的可能性

攻击前提条件

  1. 受害者打开一个本地恶意HTML页面(可通过多种方式实现):

    • 强制下载
    • 从本地PDF跳转
    • 邮件附件
    • 未来可能在安卓或其他特殊电子设备中更有用
  2. 目标文件满足两个条件:

    • 位于固定或可预测的路径
    • 攻击者能向这些文件中注入内容

攻击技术细节

基本攻击方法

<link rel="stylesheet" href="../Library/Application Support/Chrome/Default/Cookies">
<script>
  var leak = getComputedStyle(document.body).getPropertyValue('--');
  alert(leak);
</script>

文件预处理技术("file-massaging")

由于大文件难以控制payload位置且可能破坏CSS解析,需要使用特殊技术提高成功率。

攻击案例(PoC)

PoC 1 - 跨域重定向泄露

目标文件~/Library/Application Support/Google/Chrome/Default/Current Session

特点

  • 部分信息使用UTF-16编码(减少解析中断)
  • 框架请求完美收集到父类请求中

技术

  • 使用框架跨域读取重定向结果
  • 通过添加"}]})"字符提前关闭所有块,使CSS解析器处于适当状态

PoC 2 - 本地存储SQLite泄露

目标文件~/Library/Application Support/Google/Chrome/Default/Local Storage/leveldb/

特点

  • 数据直接存储且可控制二进制数据
  • 可将payload编码为UTF-16
  • 文件名采用数字自增方式命名(可爆破)

影响:泄露其他网站和插件的敏感信息

PoC 3 - Cookie泄露

目标文件~/Library/Application Support/Google/Chrome/Default/Cookies

特点

  • 表结构包含多个字段(creation_utc, host_key, name, value等)
  • 攻击者可控制cookie的'name'和'path'
  • 新cookie比老cookie先写入(SQLite填充数据方式)

加密细节

  • Cookie使用128位AES加密,CBC模式
  • IV固定为0x20202020202020202020202020202020
  • Linux中key硬编码,使用单次迭代PBKDF2加密,固定salt("saltysalt")
  • OSX中key保存在Keychain中

payload构造

  1. 需要找到有效的块B,解码后满足特定字符限制
  2. 通过大量计算(约十亿次AES计算)找到有效的cookie值
  3. 示例有效cookie:document.cookie = "whatever=i+GW*e@afGR]sYo{Wa>7[xBLGWAJ|VCX<T*P;"

泄露方法

  1. 使用UTF-16解码
  2. 解析被加密的值('V10'前缀)
  3. 使用Web加密API解密

防御建议

  1. 文件名随机化:在配置文件名前加随机字符串(类似Firefox的做法)
  2. CSS解析严格化:遇到NULL字节时停止解析(Firefox的做法)
  3. 加密改进:在Linux系统中使用独一无二的key(而非硬编码)
  4. 用户教育:避免打开不可信的本地HTML文件

技术限制

  1. 特殊字符可能截断CSS解析
  2. Cookie不支持空字符,限制UTF-16使用
  3. 成功率依赖于payload位置和文件内容

结论

该漏洞展示了通过CSS解析机制窃取本地敏感信息的可能性,特别是在攻击者能向目标文件注入内容的情况下。虽然存在技术限制,但在特定条件下可有效泄露Cookie、本地存储等敏感数据。防御措施应着重于文件访问控制和加密机制的改进。

通过滥用CSS解析窃取本地文件内容的技术分析 漏洞概述 本技术文档详细分析了一种通过滥用CSS解析机制窃取本地文件内容的攻击方法。该漏洞利用了浏览器对 file:// 协议资源的特殊处理方式,允许恶意页面将任意本地资源作为CSS加载并解析,从而跨域泄露本地文件数据。 漏洞原理 核心机制 :当通过 file:// 协议加载本地资源时,浏览器不会强制定义Content-Type,恶意页面可以将任何本地资源作为CSS加载,而不管其实际MIME类型。 浏览器行为 : Chrome浏览器会根据文件扩展名猜测MIME类型 当解析错误的资源时会显示警告:"资源被解析成样式表,但是被传输的MIME类型是text/html" 这种警告暗示了避免使用 file:// 探测主机文件的可能性 攻击前提条件 受害者打开一个本地恶意HTML页面(可通过多种方式实现): 强制下载 从本地PDF跳转 邮件附件 未来可能在安卓或其他特殊电子设备中更有用 目标文件满足两个条件: 位于固定或可预测的路径 攻击者能向这些文件中注入内容 攻击技术细节 基本攻击方法 文件预处理技术("file-massaging") 由于大文件难以控制payload位置且可能破坏CSS解析,需要使用特殊技术提高成功率。 攻击案例(PoC) PoC 1 - 跨域重定向泄露 目标文件 : ~/Library/Application Support/Google/Chrome/Default/Current Session 特点 : 部分信息使用UTF-16编码(减少解析中断) 框架请求完美收集到父类请求中 技术 : 使用框架跨域读取重定向结果 通过添加"} ]})"字符提前关闭所有块,使CSS解析器处于适当状态 PoC 2 - 本地存储SQLite泄露 目标文件 : ~/Library/Application Support/Google/Chrome/Default/Local Storage/leveldb/ 特点 : 数据直接存储且可控制二进制数据 可将payload编码为UTF-16 文件名采用数字自增方式命名(可爆破) 影响 :泄露其他网站和插件的敏感信息 PoC 3 - Cookie泄露 目标文件 : ~/Library/Application Support/Google/Chrome/Default/Cookies 特点 : 表结构包含多个字段(creation_ utc, host_ key, name, value等) 攻击者可控制cookie的'name'和'path' 新cookie比老cookie先写入(SQLite填充数据方式) 加密细节 : Cookie使用128位AES加密,CBC模式 IV固定为 0x20202020202020202020202020202020 Linux中key硬编码,使用单次迭代PBKDF2加密,固定salt("saltysalt") OSX中key保存在Keychain中 payload构造 : 需要找到有效的块B,解码后满足特定字符限制 通过大量计算(约十亿次AES计算)找到有效的cookie值 示例有效cookie: document.cookie = "whatever=i+GW*e@afGR]sYo{Wa>7[xBLGWAJ|VCX<T*P;" 泄露方法 : 使用UTF-16解码 解析被加密的值('V10'前缀) 使用Web加密API解密 防御建议 文件名随机化 :在配置文件名前加随机字符串(类似Firefox的做法) CSS解析严格化 :遇到NULL字节时停止解析(Firefox的做法) 加密改进 :在Linux系统中使用独一无二的key(而非硬编码) 用户教育 :避免打开不可信的本地HTML文件 技术限制 特殊字符可能截断CSS解析 Cookie不支持空字符,限制UTF-16使用 成功率依赖于payload位置和文件内容 结论 该漏洞展示了通过CSS解析机制窃取本地敏感信息的可能性,特别是在攻击者能向目标文件注入内容的情况下。虽然存在技术限制,但在特定条件下可有效泄露Cookie、本地存储等敏感数据。防御措施应着重于文件访问控制和加密机制的改进。