hacktricks/pentesting-web/http-response-smuggling-desync.md

7.8 KiB
Raw Blame History

HTTP 响应劫持 / Desync

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

本文技术取自视频:https://www.youtube.com/watch?v=suxDcYViwao&t=1343s

HTTP 请求队列 Desynchronisation

首先,这种技术滥用了 HTTP 请求劫持漏洞,因此您需要了解这是什么:

这种技术与常见的 HTTP 请求劫持的主要区别在于,不是通过向受害者的请求添加前缀来攻击,而是泄露或修改受害者接收到的响应。这是通过发送两个完整请求来使代理响应队列脱节,而不是发送一个半请求来滥用 HTTP 请求劫持。

这是因为我们将能够使响应队列脱节,从而将受害者的合法请求的响应发送给攻击者,或者在响应中注入攻击者控制的内容

HTTP 管道 Desync

HTTP/1.1 允许请求不同资源而无需等待前一个请求。因此,如果中间有代理,则代理的任务是维护与发送到后端的请求和从后端返回的响应的同步匹配

然而,存在一种问题,即响应队列的脱节。如果攻击者发送了一个 HTTP 响应劫持攻击,并且对初始请求和劫持的请求的响应立即响应,则劫持的响应不会被插入到受害者响应的队列中,而将被视为错误而被丢弃

因此,需要劫持的请求需要更长时间才能在后端服务器中处理。因此,当劫持的请求被处理时,与攻击者的通信将结束。

在这种特定情况下,如果受害者发送了一个请求,而劫持的请求在合法请求之前得到响应,则劫持的响应将发送给受害者。因此,攻击者将控制受害者“执行”的请求

此外,如果攻击者然后执行一个请求,而受害者的合法响应攻击者请求之前被回答。则受害者的响应将发送给攻击者窃取受害者的响应(例如可能包含头部Set-Cookie)。

多重嵌套注入

与常见的HTTP 请求劫持的另一个有趣的区别是,在常见的劫持攻击中,目标修改受害者请求的开头,以执行意外操作。在HTTP 响应劫持攻击中,由于您发送完整请求,因此您可以在一个有效负载中注入数十个响应,这将使数十个用户脱节,这些用户将接收注入的响应

除了能够更轻松地在合法用户之间分发数十个漏洞外,这也可以用于在服务器上引起拒绝服务

攻击组织

如前所述,要滥用这种技术,需要第一个劫持的消息在服务器中需要花费很长时间来处理

如果只想尝试窃取受害者的响应,则这耗时请求足够。但如果要执行更复杂的攻击,则这将是攻击的常见结构。

首先是滥用 HTTP 请求劫持初始请求,然后是耗时请求,然后是1个或多个有效负载请求,其响应将发送给受害者。

滥用 HTTP 响应队列 Desynchronisation

捕获其他用户的请求

与已知的 HTTP 请求劫持有效载荷一样,您可以窃取受害者的请求,但有一个重要区别:在这种情况下,您只需要发送的内容在响应中反映不需要持久存储

首先,攻击者发送一个包含最终 POST 请求和反映参数的有效负载,以及一个较大的 Content-Length

然后,一旦初始请求(蓝色)被处理同时正在处理耗时请求(黄色),来自受害者的下一个请求将被追加到队列中,紧跟在反映参数后面

然后,受害者接收耗时请求的响应,如果同时 攻击者发送了另一个请求,则反映内容请求的响应将发送给攻击者

响应 Desynchronisation

到目前为止,我们已经学会了如何滥用 HTTP 请求劫持攻击来控制客户端将接收请求,以及如何窃取本应发送给受害者的响应

但是,仍然可以进一步脱节响应。

有一些有趣的请求,如HEAD请求,规定响应体内不应包含任何内容,且应(必须)包含请求的 Content-Length,就像GET 请求一样

因此,如果攻击者注入一个HEAD请求,如下图所示:

然后,一旦蓝色请求被响应给攻击者,下一个受害者请求将被引入队列:

然后,受害者接收HEAD请求的响应,其中将包含 Content-Length 但没有任何内容。因此,代理不会将此响应发送给受害者,而将等待一些内容,实际上将是黄色请求的响应(也是攻击者注入的):

内容混淆

根据前面的示例,知道您可以控制受害者将接收的请求的主体,以及HEAD 响应通常在其标头中包含Content-Type 和 Content-Length,您可以发送如下请求来在不使页面容易受到 XSS 攻击的情况下在受害者中引发 XSS

缓存投毒

滥用先前评论的响应 Desynchronisation 内容混淆攻击,如果缓存存储了受害者执行的请求的响应,并且此响应是导致 XSS 的注入响应,则缓存将被投毒

包含 XSS 负载的恶意请求:

向受害者发送包含指示缓存存储响应的标头的恶意响应:

{% hint style="warning" %} 请注意,在这种情况下,如果**“受害者”是攻击者**,那么他现在可以在任意 URL 中执行缓存投毒,因为他可以控制将被缓存的 URL与恶意响应。 {% endhint %}

Web 缓存欺骗

这种攻击类似于前一种,但攻击者将在缓存中存储受害者信息,而不是在缓存中注入有效负载

响应分割

这种攻击的目标是再次滥用响应 脱节,以便使代理发送 100% 由攻击者生成的响应

为了实现这一点,攻击者需要找到 Web 应用程序的一个端点,该端点在响应中反映一些值,并且知道 HEAD 响应的内容长度

他将发送一个利用如下的漏洞

在第一个请求被解决并发送回攻击者后,受害者的请求被添加到队列中

受害者将作为响应接收到 HEAD 响应 + 第二个请求响应的内容(包含反映数据的部分):

然而,请注意,反映数据的大小符合 HEAD 响应的 Content-Length,这在响应队列中生成了一个有效的 HTTP 响应

因此,第二个受害者的下一个请求接收到 完全由攻击者制作的响应。由于响应完全由攻击者制作,他还可以使代理缓存响应