# XS-Search/XS-Leaks
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 可以轻松构建和**自动化工作流**,利用全球**最先进**的社区工具。\ 立即获取访问权限: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert) 支持HackTricks的其他方式: * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品 * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**上关注**我们。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
## 基本信息 XS-Search是一种利用**侧信道漏洞**来提取**跨源信息**的方法。 参与此攻击的关键组件包括: * **易受攻击的Web**: 意图提取信息的目标网站。 * **攻击者的Web**: 攻击者创建的恶意网站,受害者访问,托管利用程序。 * **包含方法**: 用于将易受攻击的Web合并到攻击者的Web中的技术(例如,window.open,iframe,fetch,带有href的HTML标签等)。 * **泄漏技术**: 用于通过包含方法收集的信息来区分易受攻击的Web状态差异的技术。 * **状态**: 攻击者旨在区分易受攻击的Web的两种潜在状态。 * **可检测差异**: 攻击者依赖于推断易受攻击的Web状态的可观察变化。 ### 可检测差异 可以分析几个方面以区分易受攻击的Web的状态: * **状态码**: 区分跨源的**各种HTTP响应状态码**,如服务器错误、客户端错误或身份验证错误。 * **API使用**: 识别页面间**Web API的使用**,揭示跨源页面是否使用特定的JavaScript Web API。 * **重定向**: 检测到导航到不同页面,不仅是HTTP重定向,还包括JavaScript或HTML触发的导航。 * **页面内容**: 观察**HTTP响应主体**或页面子资源的变化,例如**嵌入帧的数量**或图像大小差异。 * **HTTP头**: 注意特定HTTP响应头的存在或可能的值,包括诸如X-Frame-Options、Content-Disposition和Cross-Origin-Resource-Policy等头。 * **时间**: 注意两种状态之间的一致时间差异。 ### 包含方法 * **HTML元素**: HTML提供各种元素用于**包含跨源资源**,如样式表、图像或脚本,迫使浏览器请求非HTML资源。可在[https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks)找到此目的的潜在HTML元素的汇编。 * **框架**: 诸如**iframe**、**object**和**embed**等元素可以直接将HTML资源嵌入到攻击者的页面中。如果页面**缺乏框架保护**,JavaScript可以通过contentWindow属性访问被框架资源的window对象。 * **弹出窗口**: **`window.open`**方法在新标签页或窗口中打开资源,为JavaScript提供一个遵循SOP后与方法和属性交互的**窗口句柄**。弹出窗口通常用于单点登录,绕过目标资源的框架和cookie限制。但是,现代浏览器限制了弹出窗口的创建,只允许特定用户操作。 * **JavaScript请求**: JavaScript允许使用**XMLHttpRequests**或**Fetch API**直接请求目标资源。这些方法提供对请求的精确控制,例如选择是否跟随HTTP重定向。 ### 泄漏技术 * **事件处理程序**: 在XS-Leaks中的一个经典泄漏技术,事件处理程序如**onload**和**onerror**提供有关资源加载成功或失败的信息。 * **错误消息**: JavaScript异常或特殊错误页面可以直接提供泄漏信息,要么通过错误消息本身,要么通过区分其存在与不存在。 * **全局限制**: 浏览器的物理限制,如内存容量或其他强制浏览器限制,可以在达到阈值时发出信号,作为泄漏技术。 * **全局状态**: 可以利用与浏览器的**全局状态**(例如History接口)的可检测交互。例如,浏览器历史记录中的**条目数量**可以提供有关跨源页面的线索。 * **性能API**: 此API提供当前页面的**性能详细信息**,包括文档和加载资源的网络时间,从而推断请求的资源。 * **可读属性**: 一些HTML属性是**跨源可读**的,可用作泄漏技术。例如,`window.frame.length`属性允许JavaScript计算跨源网页中包含的帧数。 ## XSinator工具和论文 XSinator是一个自动工具,用于检查浏览器是否受到其论文中解释的**几种已知XS-Leaks**的影响:**[https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)** 您可以在[https://xsinator.com/](https://xsinator.com/)上**访问该工具** {% hint style="warning" %} **排除的XS-Leaks**: 我们不得不排除依赖**服务工作者**的XS-Leaks,因为它们会干扰XSinator中的其他泄漏。此外,我们选择**排除依赖特定Web应用程序中的配置错误和漏洞**的XS-Leaks。例如,跨源资源共享(CORS)配置错误,postMessage泄漏或跨站脚本。此外,我们排除了基于时间的XS-Leaks,因为它们经常受到速度慢、嘈杂和不准确的影响。 {% endhint %}
\ 使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 可以轻松构建和**自动化工作流**,利用全球**最先进**的社区工具。\ 立即获取访问权限: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## **基于时间的技术** 以下一些技术将使用时间作为检测网页可能状态差异的过程的一部分。在Web浏览器中有不同的测量时间的方法。 **时钟**: [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API允许开发人员获取高分辨率的时间测量。\ 攻击者可以滥用大量API来创建隐式时钟:[Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast\_Channel\_API)、[Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel)、[requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)、[setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)、CSS动画等。\ 更多信息:[https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/)。 ## 事件处理程序技术 ### Onload/Onerror * **包含方法**: 框架、HTML元素 * **可检测差异**: 状态码 * **更多信息**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu)、[https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) * **摘要**: 如果尝试在onerror/onload事件中加载资源时,触发资源成功加载/加载失败的事件,就可以确定状态码。 * **代码示例**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\)) {% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} [cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md) {% endcontent-ref %} 代码示例尝试从JS中**加载脚本对象**,但也可以使用**其他标签**,如对象、样式表、图像、音频。此外,还可以直接注入**标签**,并在标签内部声明`onload`和`onerror`事件(而不是从JS中注入)。 还有这种攻击的无脚本版本: ```html ``` 在这种情况下,如果未找到 `example.com/404`,将加载 `attacker.com/?error`。 ### Onload 时间 * **包含方法**:HTML 元素 * **可检测差异**:时间(通常由页面内容、状态码引起) * **更多信息**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) * **摘要**:[**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** 可用于测量执行请求所需的时间。然而,也可以使用其他时钟,如[**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming),它可以识别运行超过 50 毫秒的任务。 * **代码示例**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) 另一个示例在: {% content-ref url="xs-search/performance.now-example.md" %} [performance.now-example.md](xs-search/performance.now-example.md) {% endcontent-ref %} #### Onload 时间 + 强制重任务 这种技术与前一种类似,但**攻击者**还将在**答案为正或负时**强制执行某些操作以**测量**该时间。 {% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} [performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md) {% endcontent-ref %} ### unload/beforeunload 时间 * **包含方法**:框架 * **可检测差异**:时间(通常由页面内容、状态码引起) * **更多信息**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) * **摘要**:可以使用[SharedArrayBuffer 时钟](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers)来测量执行请求所需的时间。也可以使用其他时钟。 * **代码示例**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) 通过利用[`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event)和[`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event)事件,可以测量获取资源所需的时间。**`beforeunload`** 事件在浏览器即将导航到新页面时触发,而 **`unload`** 事件在实际导航发生时发生。可以计算这两个事件之间的时间差来确定浏览器获取资源所花费的时间。 ### 沙箱框架时间 + onload * **包含方法**:框架 * **可检测差异**:时间(通常由页面内容、状态码引起) * **更多信息**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) * **摘要**:[performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API 可用于测量执行请求所需的时间。也可以使用其他时钟。 * **代码示例**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) 观察到,在缺乏[框架保护](https://xsleaks.dev/docs/defenses/opt-in/xfo/)的情况下,攻击者可以测量页面及其子资源通过网络加载所需的时间。这种测量通常是可能的,因为仅在 iframe 的 `onload` 处理程序在资源加载和 JavaScript 执行完成后才会触发。为了绕过脚本执行引入的变化性,攻击者可能会在 ` ``` ### #ID + error + onload * **包含方法**:Frames * **可检测差异**:页面内容 * **更多信息**: * **摘要**:如果能够使页面在访问正确内容时出现错误,并在访问任何内容时正确加载,那么您可以创建一个循环来提取所有信息,而无需测量时间。 * **代码示例**: 假设您可以**插入**包含**秘密内容**的**页面**到**一个iframe**中。 您可以利用**CSRF**(例如)使受害者搜索包含“_**flag**_”的文件。在**iframe**内,您知道**`onload`事件**将**至少执行一次**。然后,您可以通过仅更改URL中的**哈希**内容来**更改iframe的URL**。 例如: 1. **URL1**:www.attacker.com/xssearch#try1 2. **URL2**:www.attacker.com/xssearch#try2 如果第一个URL**成功加载**,那么当**更改**URL的**哈希**部分时,**`onload`**事件将**不会再次触发**。但是,**如果**页面在**加载**时出现**某种错误**,那么**`onload`**事件将**再次触发**。 然后,您可以**区分**一个**正确加载**的页面或访问时出现**错误**的页面。 ### Javascript执行 * **包含方法**:Frames * **可检测差异**:页面内容 * **更多信息**: * **摘要**:如果**页面**返回**敏感内容**,或者用户可以**控制的内容**。用户可以在**负面情况下**设置**有效的JS代码**,并在**`