跨站信息泄露 (XS-Leak)
跨站信息泄露 (XS-Leaks) 是一类侧信道漏洞,允许攻击者在不读取响应体的情况下,从目标源推断出敏感信息。这些漏洞利用的是浏览器的行为、时间差异以及可观测的侧效应,而非传统的 XSS 数据窃取。
摘要 (Summary)
工具 (Tools)
- RUB-NDS/xsinator.com - XS-Leak 浏览器测试套件。
- RUB-NDS/AutoLeak - 通过对比两种状态下的 DOM 图来寻找浏览器中的 XS-Leak。
方法论 (Methodology)
攻击原语 (Attack Primitives)
与传统的 CORS 或 XSS 攻击不同,XS-Leak 依赖于可观测的浏览器行为:
| 原语 (Primitive) | 泄露的信息 (Leaks) |
|---|---|
| 时间 (Timing) | 资源大小 / 复杂度 |
| 帧计数 (Frame count) | 内容差异 |
| 错误 (Errors) | 访问控制决策 |
| 缓存 (Cache) | 先前的访问记录 |
| 导航 (Navigation) | 认证状态 |
| 渲染 (Rendering) | 文本长度 |
XS-Search
XS-Search 攻击滥用基于查询的搜索系统来泄露用户信息。通过测量搜索查询的侧效应(例如响应时间、帧计数或错误事件),攻击者可以推断搜索是否返回了结果。这种布尔 Oracle 可用于逐字符地暴力破解敏感数据。
示例:
- 打开 50 个标签页,并利用搜索结果页面中由于 iframe 触发 CSP 违规时产生的时间差异,逐字符暴力破解 Flag。
跨站 Oracle (Cross-site Oracles)
时间攻击 (Timing Attacks)
在时间攻击中,攻击者通过观察系统处理特定请求所需的时间来揭示敏感信息。他们向目标应用程序部署精心设计的脚本,以执行 API 调用、发送 AJAX 请求或启动跨源资源共享 (CORS) 交互。通过测量和比较这些操作的响应时间,攻击者可以推断出系统内部行为、数据验证过程或底层安全控制的深度见解。
帧计数 (Frame Counting)
如果一个页面根据用户的状态(如搜索结果)加载不同数量的 iframe,攻击者可以通过计数来推断数据。
// 获取窗口引用
var win = window.open('https://example.org');
// 等待页面加载
setTimeout(() => {
// 读取加载的 iframe 数量
console.log("检测到 %d 个 iframe", win.length);
}, 2000);
缓存探测 (Cache Probing)
在缓存探测攻击中,恶意网站尝试确定目标站点的特定资源是否已存储在受害者的浏览器缓存中。攻击者诱导浏览器请求一个资源(例如图片、脚本或端点),而该资源仅在用户已认证或先前访问过特定页面时才会被缓存。通过测量资源加载的速度,或者通过观察缓存与非缓存响应之间的行为差异,攻击者可以推断出敏感信息。
已知 Oracle 列表 (Known Oracles)
- 缓存泄露 (CORS) - 检测页面加载的资源。缓存会随 CORS 错误被删除。
- 缓存泄露 (POST) - 检测页面加载的资源。缓存会随 POST 请求被删除。
- ContentDocument X-Frame 泄露 - 利用 ContentDocument 检测 X-Frame-Options。
- COOP 泄露 - 通过弹窗检测 Cross-Origin-Opener-Policy 响应头。
- CORB 泄露 - 使用 CORB 结合特定内容类型检测 X-Content-Type-Options。
- CORP 泄露 - 利用 fetch 检测 Cross-Origin-Resource-Policy 响应头。
- CORS 错误泄露 - 利用 CORS 错误泄露重定向目标 URL。
- CSP 指令泄露 - 通过 CSP iframe 属性检测 CSP 指令。
- CSP 重定向检测 - 利用 CSP 违规事件检测跨源重定向。
- CSP 违规泄露 - 利用 CSP 违规事件泄露跨源重定向目标。
- CSS 属性泄露 - 利用 getComputedStyle 泄露 CSS 规则。
- 磁盘缓存修饰 (Disk cache grooming)
- 下载检测 - 检测下载行为 (Content-Disposition 响应头)。
- 持续时间重定向泄露 - 通过检查持续时间检测跨源重定向。
- ETag 头长度 - 利用 ETag 头部长度检测响应体大小。
- 事件处理器泄露 (Object 标签) - 利用 object 标签的 onload/onerror 检测错误。
- 事件处理器泄露 (Script 标签) - 利用 script 标签的 onload/onerror 检测错误。
- 事件处理器泄露 (Stylesheet 样式表) - 利用 stylesheet 的 onload/onerror 检测错误。
- Fetch 重定向泄露 - 利用 Fetch API 检测 HTTP 重定向。
- 帧计数泄露 - 检测页面上的 iframe 数量。
- 历史记录长度泄露 - 利用 History API 检测 Javascript 重定向。
- ID 属性泄露 - 利用 onblur 泄露可聚焦 HTML 元素的 id 属性。
- 最大重定向泄露 - 通过滥用最大重定向限制检测服务器重定向。
- 媒体尺寸泄露 - 泄密图片或视频的尺寸。
- 媒体时长泄露 - 泄密音频或视频的时长。
- MediaError 泄露 - 通过 MediaError 消息检测状态码。
- 支付 API 泄露 - 检测另一个标签页是否正在使用支付 API。
- Performance API CORP 泄露 - 通过 Performance API 检测 Cross-Origin-Resource-Policy 响应头。
- Performance API 下载检测 - 通过 Performance API 检测下载行为 (Content-Disposition 响应头)。
- Performance API 空页面泄露 - 通过 Performance API 检测空响应。
- Performance API 错误泄露 - 通过 Performance API 检测错误。
- Performance API X-Frame 泄露 - 通过 Performance API 检测 X-Frame-Options。
- Performance API XSS Auditor 泄露 - 通过 Performance API 检测页面内的脚本/事件处理器。
- 重定向起始泄露 - 通过检查 redirectStart 时间检测跨源 HTTP 重定向。
- 请求合并错误泄露 - 检测请求合并时的错误。
- SRI 错误泄露 - 利用 SRI 错误泄露内容长度。
- 样式重载错误泄露 - 检测样式重载 Bug 产生的错误。
- URL 最大长度泄露 - 通过滥用 URL 最大长度限制检测服务器重定向。
- WebSocket 泄露 (Firefox) - 通过耗尽 Socket 限制检测页面上的 WebSocket 数量。
- WebSocket 泄露 (Google Chrome) - 通过耗尽 Socket 限制检测页面上的 WebSocket 数量。
实验环境 (Labs)
参考资料 (References)
- 2025 SECCON CTF 14 预赛 Web 挑战 Writeup - RewriteLab - 2025年12月31日
- ASIS CTF 决赛 2024 - arkark - 2024年12月30日
- 跨站 ETag 长度泄露 - Takeshi Kaneko - 2025年12月26日
- 利用 XS-Leaks 提取机密 - xanhacks - 2023年2月19日
- Impossible Leak - SECCON 2025 预赛 - parrot409 - 2025年12月14日
- justCTF 2022 - Baby XSLeak Write-up - aszx87410 - 2022年6月14日
- Secret Note Keeper (xs-leaks) Facebook CTF 2019 - Abdillah Muhamad - 2019年7月3日
- SekaiCTF 2023 - Leakless Note - Kalmarunionen - 2023年9月5日
- XS-Leak:利用 Focus 泄露 ID - Gareth Heyes - 2019年10月8日