XS-Search/XS-Leaks
最后更新于
最后更新于
使用 Trickest 可以轻松构建和自动化工作流,利用全球最先进的社区工具。 立即获取访问权限:
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 找到此目的的潜在 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 是一个自动工具,用于检查浏览器是否受到几种已知 XS-Leaks 的影响,其论文解释在:https://xsinator.com/paper.pdf
您可以在 https://xsinator.com/ 访问该工具。
排除的 XS-Leaks: 我们不得不排除依赖服务工作者的 XS-Leaks,因为它们会干扰 XSinator 中的其他泄漏。此外,我们选择排除依赖特定 Web 应用程序中的配置错误和漏洞的 XS-Leaks。例如,跨源资源共享(CORS)配置错误、postMessage 泄漏或跨站脚本。此外,我们排除了基于时间的 XS-Leaks,因为它们经常受到速度慢、嘈杂和不准确的影响。
使用 Trickest 可以轻松构建和自动化工作流,利用全球最先进的社区工具。 立即获取访问权限:
一些以下技术将使用时间作为检测网页可能状态差异的过程的一部分。在Web浏览器中有不同的测量时间的方法。
时钟:performance.now() API允许开发人员获取高分辨率的时间测量。 攻击者可以滥用大量API来创建隐式时钟:Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS动画等。 更多信息:https://xsleaks.dev/docs/attacks/timing-attacks/clocks.
包含方法:Frames, HTML Elements
可检测的差异:状态码
摘要:如果尝试在onerror/onload事件中加载资源,当资源成功/失败加载时,可以推断出状态码。
代码示例尝试从JS中加载脚本对象,但也可以使用其他标签,如对象、样式表、图像、音频。此外,还可以直接注入标签,并在标签内声明onload
和onerror
事件(而不是从JS中注入)。
这种攻击还有一个无需脚本的版本:
在这种情况下,如果未找到 example.com/404
,将加载 attacker.com/?error
。
Inclusion Methods: HTML Elements
Detectable Difference: Timing (generally due to Page Content, Status Code)
Summary: performance.now() API可用于测量执行请求所需的时间。然而,也可以使用其他时钟,如PerformanceLongTaskTiming API,可识别运行超过50毫秒的任务。
Code Example: https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events 另一个示例在:
这种技术与前一种类似,但攻击者还将在答案为正或负时强制执行某些操作以花费相关的时间,并测量该时间。
Inclusion Methods: Frames
Detectable Difference: Timing (generally due to Page Content, Status Code)
Summary: 可使用SharedArrayBuffer 时钟来测量执行请求所需的时间。也可以使用其他时钟。
通过利用unload
和beforeunload
事件,可以测量获取资源所需的时间。**beforeunload
事件在浏览器即将导航到新页面时触发,而unload
**事件发生在实际导航时。可以计算这两个事件之间的时间差来确定浏览器获取资源所花费的时间。
Inclusion Methods: Frames
Detectable Difference: Timing (generally due to Page Content, Status Code)
Summary: performance.now() API可用于测量执行请求所需的时间。也可以使用其他时钟。
观察到,在缺乏框架保护的情况下,攻击者可以测量页面及其子资源通过网络加载所需的时间。这通常是可能的,因为仅当iframe的onload
处理程序在资源加载和JavaScript执行完成后才会触发。为了绕过脚本执行引入的变化,攻击者可能会在<iframe>
内使用sandbox
属性。包含此属性会限制许多功能,特别是JavaScript的执行,从而促进主要受网络性能影响的测量。
包含方法: 框架
可检测差异: 页面内容
更多信息:
摘要: 如果您可以使页面在访问正确内容时出现错误,并在访问任何内容时正确加载,那么您可以创建一个循环来提取所有信息,而无需测量时间。
代码示例:
假设您可以插入包含秘密内容的页面到一个iframe中。
您可以让受害者搜索包含“flag”的文件,使用一个iframe(例如利用CSRF)。在iframe内,您知道**onload
事件将始终至少执行一次。然后,您可以仅更改URL中的哈希内容来更改iframe的URL**。
例如:
URL1: www.attacker.com/xssearch#try1
URL2: www.attacker.com/xssearch#try2
如果第一个URL成功加载,那么当更改URL的哈希部分时,onload
事件将不会再次触发。但是,如果页面在加载时出现某种错误,那么**onload
事件将再次触发**。
然后,您可以区分一个正确加载的页面或访问时出现错误的页面。
包含方法: 框架
可检测差异: 页面内容
更多信息:
摘要: 如果页面返回敏感内容,或者用户可以控制的内容。用户可以在负面情况下设置有效的JS代码,并在**<script>
标签内加载每次尝试,因此在负面情况下,攻击者的代码将被执行**,而在肯定情况下不会执行任何操作。
代码示例:
包含方法: HTML元素
可检测差异: 状态码和标头
摘要: 跨源读取阻止(CORB)是一项安全措施,防止网页加载某些敏感的跨源资源,以防止Spectre等攻击。然而,攻击者可以利用其保护行为。当受CORB保护的响应返回一个带有nosniff
和2xx
状态码的_CORB受保护_Content-Type
时,CORB会剥离响应的主体和标头。观察到这一点的攻击者可以推断状态码(指示成功或错误)和Content-Type
(表示是否受CORB保护)的组合,从而导致潜在的信息泄漏。
代码示例:
查看更多信息链接以获取有关攻击的更多信息。
包含方法: 框架
可检测差异: 页面内容
摘要: 从id或name属性中泄漏敏感数据。
可以加载一个页面到一个iframe中,并使用**#id_value
使页面聚焦在iframe中指定的元素上,然后如果触发了onblur
信号,则ID元素存在。
您可以使用portal
**标签执行相同的攻击。
包含方法: 框架,弹出窗口
可检测差异: API使用
摘要: 从postMessage中收集敏感信息或使用postMessages的存在作为一个预言机来了解用户在页面中的状态
代码示例: 任何监听所有postMessages的代码。
应用程序经常使用postMessage
广播在不同源之间进行通信。然而,如果未正确指定targetOrigin
参数,此方法可能无意中暴露敏感信息,允许任何窗口接收消息。此外,接收消息本身可以充当一个预言机;例如,某些消息可能仅发送给已登录的用户。因此,这些消息的存在或不存在可以揭示有关用户状态或身份的信息,例如他们是否已经认证。
使用Trickest可以轻松构建和自动化工作流,使用全球最先进的社区工具。 立即获取访问权限:
包含方法: 框架,弹出窗口
可检测差异: API使用
更多信息: https://xsinator.com/paper.pdf (5.1)
摘要: 耗尽WebSocket连接限制会泄漏跨源页面的WebSocket连接数量。
可以确定目标页面使用了多少WebSocket连接。这使得攻击者可以检测应用程序状态并泄漏与WebSocket连接数量相关的信息。
如果一个源使用了最大数量的WebSocket连接对象,无论它们的连接状态如何,创建新对象将导致JavaScript异常。为执行此攻击,攻击者网站在弹出窗口或iframe中打开目标网站,然后在目标网站加载完成后,尝试创建尽可能多的WebSocket连接。抛出的异常数量就是目标网站窗口使用的WebSocket连接数量。
包含方法: 框架,弹出窗口
可检测差异: API 使用
更多信息: https://xsinator.com/paper.pdf (5.1)
摘要: 检测支付请求,因为一次只能有一个激活。
这种 XS-Leak 使攻击者能够检测跨源页面发起支付请求。
因为一次只能有一个请求支付处于活动状态,如果目标网站正在使用支付请求 API,任何进一步尝试使用此 API 的尝试都将失败,并导致JavaScript 异常。攻击者可以通过定期尝试显示支付 API UI来利用这一点。如果一次尝试导致异常,表示目标网站当前正在使用它。攻击者可以通过在创建后立即关闭 UI 来隐藏这些定期尝试。
包含方法:
可检测差异: 计时(通常由页面内容、状态码引起)
摘要: 测量滥用单线程 JS 事件循环的网页执行时间。
代码示例:
JavaScript 在单线程事件循环并发模型上运行,这意味着一次只能执行一个任务。这个特性可以被利用来衡量来自不同源的代码执行所需的时间。攻击者可以通过连续分派具有固定属性的事件来测量他们自己代码在事件循环中的执行时间。这些事件将在事件池为空时被处理。如果其他源也将事件分派到相同的池中,攻击者可以通过观察自己任务执行的延迟来推断外部事件执行所需的时间。通过监视事件循环中的延迟来检测延迟,可以揭示来自不同源的代码的执行时间,可能暴露敏感信息。
在执行计时中,可以消除 网络因素以获得更精确的测量。例如,在加载页面之前加载页面使用的资源。
包含方法:
可检测差异: 计时(通常由页面内容、状态码引起)
摘要: 一种测量网页操作执行时间的方法是故意阻塞线程的事件循环,然后计时事件循环再次可用所需的时间。通过在事件循环中插入阻塞操作(如长时间计算或同步 API 调用),并监视后续代码开始执行所需的时间,可以推断在阻塞期间执行的任务的持续时间。这种技术利用了 JavaScript 事件循环的单线程特性,其中任务按顺序执行,并可以提供关于共享相同线程的其他操作的性能或行为的见解。
代码示例:
通过锁定事件循环来测量执行时间的技术的一个重要优势是其潜力可以规避站点隔离。站点隔离是一种安全功能,将不同网站分隔到单独的进程中,旨在防止恶意网站直接访问其他网站的敏感数据。然而,通过影响通过共享事件循环对另一个源的执行时间,攻击者可以间接提取关于该源活动的信息。这种方法不依赖于直接访问其他源数据,而是观察该源活动对共享事件循环的影响,从而规避了站点隔离建立的保护屏障。
在执行计时中,可以消除 网络因素以获得更精确的测量。例如,在加载页面之前加载页面使用的资源。
包含方法: JavaScript 请求
可检测差异: 计时(通常由页面内容、状态码引起)
摘要: 攻击者可以锁定除 1 之外的所有套接字,加载目标网页,同时加载另一页,直到最后一页开始加载的时间是目标页面加载所需的时间。
代码示例:
浏览器利用套接字进行服务器通信,但由于操作系统和硬件资源有限,浏览器被迫对并发套接字数量施加限制。攻击者可以通过以下步骤利用这种限制:
确定浏览器的套接字限制,例如,256 个全局套接字。
通过向各个主机发起 255 个请求来占用 255 个套接字一段时间,这些请求旨在保持连接打开而不完成。
使用第 256 个套接字向目标页面发送请求。
尝试向另一个主机发送第 257 个请求。由于所有套接字都在使用中(根据步骤 2 和 3),此请求将排队等待,直到套接字可用。在此请求继续之前的延迟为攻击者提供了有关与第 256 个套接字相关的网络活动的时间信息(目标页面的套接字)。这种推断是可能的,因为步骤 2 中的 255 个套接字仍在使用中,这意味着任何新可用的套接字必须是从步骤 3 释放的套接字。第 256 个套接字变为可用所需的时间直接与请求完成目标页面所需的时间相关联。
了解更多信息:https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
包含方法: JavaScript 请求
可检测差异: 计时(通常由页面内容、状态码引起)