通过滥用 CSS 解析来窃取本地文件内容
字数 1760 2025-08-27 12:33:31
通过滥用CSS解析窃取本地文件内容的技术分析
漏洞概述
本技术文档详细分析了一种通过滥用CSS解析机制窃取本地文件内容的攻击方法。该漏洞利用了浏览器对file://协议资源的特殊处理方式,允许恶意页面将任意本地资源作为CSS加载并解析,从而跨域泄露本地文件数据。
漏洞原理
-
核心机制:当通过
file://协议加载本地资源时,浏览器不会强制定义Content-Type,恶意页面可以将任何本地资源作为CSS加载,而不管其实际MIME类型。 -
浏览器行为:
- Chrome浏览器会根据文件扩展名猜测MIME类型
- 当解析错误的资源时会显示警告:"资源被解析成样式表,但是被传输的MIME类型是text/html"
- 这种警告暗示了避免使用
file://探测主机文件的可能性
攻击前提条件
-
受害者打开一个本地恶意HTML页面(可通过多种方式实现):
- 强制下载
- 从本地PDF跳转
- 邮件附件
- 未来可能在安卓或其他特殊电子设备中更有用
-
目标文件满足两个条件:
- 位于固定或可预测的路径
- 攻击者能向这些文件中注入内容
攻击技术细节
基本攻击方法
<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构造:
- 需要找到有效的块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、本地存储等敏感数据。防御措施应着重于文件访问控制和加密机制的改进。