# XS-Search/XS-Leaks
![](<../.gitbook/assets/image (9) (1) (2).png>)
使用[**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" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 你在**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者想要获取**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
## **基本信息**
XS-Search是一种面向**利用侧信道攻击**来**窃取跨源信息**的技术。
这种攻击包含以下不同的元素:
* **易受攻击的Web**: 我们想要窃取信息的Web
* **攻击者的Web**: 攻击者创建的包含漏洞利用的Web,受害者访问该Web
* **包含方法**: 用于从攻击者的Web加载易受攻击的Web的方法(如window.open、iframe、fetch、带有href的HTML标签等)
* **泄漏技术**: 在访问易受攻击的Web之后,将使用一种技术来区分从使用的包含方法获得的信息与Web的潜在状态之间的差异。
* **状态**: 易受攻击的Web可能具有的2种可能状态,取决于我们想要区分的受害者。
* **可检测的差异**: 这是攻击者必须尝试确定易受攻击的Web状态的信息。
### 可检测的差异
为了区分易受攻击页面的2种状态,可以查看以下几个方面:
* **状态码**。攻击者可以区分跨源的**不同HTTP响应状态码**(例如,服务器错误、客户端错误或身份验证错误)。
* **API使用**。这种可检测的差异允许攻击者检测页面之间的**Web API使用**,从而推断跨源页面是否使用特定的JavaScript Web API。
* **重定向**。可以检测到Web应用程序是否**将用户导航到其他页面**。这不仅限于HTTP重定向,还包括由JavaScript或HTML触发的重定向。
* **页面内容**。这些可检测的**差异出现在HTTP响应正文**本身或页面包含的子资源中。例如,这可能是包含的帧的数量(参见Gitlab上的XS-Leak)或图像的大小差异。
* **HTTP头**。攻击者可以检测特定的HTTP响应头的存在,并可能能够收集其值。这包括诸如X-Frame-Options、Content-Disposition和Cross-Origin-Resource-Policy等头部。
* **时间**:攻击者可以检测到两个状态之间存在一致的时间差异。
### 包含方法
* **HTML元素**。HTML提供了各种元素,可以实现**跨源资源包含**。像样式表、图像或脚本等元素会强制受害者的浏览器请求指定的非HTML资源。可以在网上找到列举此目的可能的HTML元素的列表([https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks))。
* **框架**。像**iframe**、**object**和**embed**这样的元素可以直接将其他HTML资源嵌入到攻击者页面中。如果页面**不使用框架保护**,JavaScript代码可以通过contentWindow属性访问嵌入资源的窗口对象。
* **弹出窗口**。**`window.open`**方法在新的浏览器标签或窗口中加载资源。该方法返回一个**窗口句柄**,JavaScript代码可以使用该句柄访问符合SOP的方法和属性。这些所谓的弹出窗口通常用于单点登录。现代浏览器只允许在触发某些用户交互时弹出窗口。对于XS-Leak攻击,这种方法特别有帮助,因为它**绕过了目标资源的框架和cookie限制**。较新的浏览器版本最近添加了隔离窗口句柄的方法。
* **JavaScript请求**。JavaScript允许直接向目标资源发送请求。有两种不同的方式可以实现这一目的:**XMLHttpRequests**及其后继者**Fetch API**。与先前的包含方法相比,攻击者对发出的请求具有精细的控制,例如是否自动跟随HTTP重定向。
###泄漏技术
* **事件处理程序**。事件处理程序可以被视为XS-Leaks的经典泄漏技术。它们是各种信息的众所周知的来源。例如,**onload**的触发表示资源加载成功,而onerror事件则表示加载失败。
* **错误消息**。除了事件处理程序,错误消息可以作为JavaScript异常和特殊错误页面出现。错误消息可以在不同的步骤中抛出,例如,直接由泄漏技术抛出。泄漏技术可以直接使用错误消息中包含的附加信息,或者区分错误消息的出现和缺失。
* **全局限制**。每台计算机都有其物理限制,浏览器也是如此。例如,可用内存的数量限制了浏览器运行的标签页。对于整个浏览器强制执行的其他浏览器限制也是如此。如果攻击者能够确定何时达到限制,这可以用作泄漏技术。
* **全局状态**。浏览器具有所有页面都可以相互交互的全局状态。如果攻击者的网站可以检测到这种交互,那么它可以用作泄漏技术。例如,**History**接口允许操作在标签页或框架中访问的页面。这创建了一个全局状态,因为条目的数量允许攻击者推断跨源页面。
* **性能API**。性能API用于访问当前页面的性能信息。它们的条目包括文档和页面加载的每个资源的详细网络计时数据。这使得攻击者可以推断出请求的资源。例如,我们发现某些请求浏览器不会创建性能条目的情况。
* **可读属性**。HTML有几个可跨源读取的属性。这种读取访问可以用作泄漏技术。例如,JavaScript代码可以使用window.frame.length属性跨源读取包含在网页中的帧数。
#### **基于时间的技术**
以下一些技术将使用时间作为检测网页可能状态差异的过程的一部分。在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/)。
## 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 %}
![](<../.gitbook/assets/image (9) (1) (2).png>)
\
使用[**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" %}
## 事件处理程序技术
### 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 Timing
* **包含方法**: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 Timing + Forced Heavy Task
这种技术与前一种类似,但**攻击者**还将在**答案为正或负时**强制执行某些操作,以测量所需的时间。
{% 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 Timing
* **包含方法**:框架
* **可检测差异**:时间(通常由页面内容、状态码引起)
* **更多信息**:[https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
* **摘要**:可以使用[SharedArrayBuffer clock](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`**。由于这种行为,可以计算这两个事件之间的时间差,并测量浏览器完成获取资源所花费的时间。
### Sandboxed Frame Timing + 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)
如果页面没有实施任何[Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/),攻击者可以计算页面及其所有子资源在网络上加载所需的时间。默认情况下,iframe的`onload`处理程序在所有资源加载完成并且所有JavaScript执行完毕后调用。但是,攻击者可以通过在`