hacktricks/pentesting-web/http-response-smuggling-desync.md
2023-08-03 19:12:22 +00:00

10 KiB
Raw Blame History

HTTP响应欺骗/解同步

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

HTTP请求队列解同步

首先,这种技术滥用了HTTP请求欺骗漏洞,所以你需要知道这是什么:

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

这是因为我们将能够解同步响应队列,使得来自受害者的合法请求的响应被发送给攻击者,或者通过在响应中注入攻击者控制的内容发送给受害者。

HTTP管道解同步

HTTP/1.1允许在不等待前一个资源的情况下请求不同的资源。因此,如果中间有一个代理,它的任务是维护与后端发送的请求和来自后端的响应的同步匹配。

然而解同步响应队列存在一个问题。如果攻击者发送一个HTTP响应欺骗攻击并且对初始请求和欺骗请求的响应立即响应,那么欺骗的响应将不会被插入到受害者响应的队列中,而只会被丢弃为错误

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

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

此外,如果攻击者执行一个请求,而受害者的合法响应在攻击者的请求之前得到响应,那么受害者的响应将被发送给攻击者,从而窃取受害者的响应(其中可能包含例如头部Set-Cookie)。

多重嵌套注入

与普通的HTTP请求欺骗相比另一个有趣的区别是在普通的欺骗攻击中目标是修改受害者请求的开头以执行意外的操作。在HTTP响应欺骗攻击中由于你发送的是完整的请求你可以在一个有效载荷中注入数十个响应这将导致数十个用户的解同步。

除了能够更容易地在合法用户之间分发数十个攻击外这也可以用于在服务器上造成DoS攻击。

攻击组织

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

如果我们只想尝试窃取受害者的响应,那么这个耗时的请求就足够了。但是,如果你想执行一个更复杂的攻击,这将是攻击的常见结构。

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

滥用HTTP响应队列解同步

捕获其他用户的请求

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

首先,攻击者发送一个有效载荷,其中包含一个带有反映参数的最终POST请求和一个较大的Content-Length。

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

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

响应解同步

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

但是,仍然有可能进一步解同步响应。

有一些有趣的请求,比如HEAD请求,规定其响应体内不包含任何内容,并且应该(必须)包含与GET请求相同的Content-Length

因此,如果攻击者注入一个HEAD请求,就像这个图片中所示:

然后,一旦蓝色请求得到响应,下一个受害者的请求就会被加入队列:

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

内容混淆

根据前面的例子,我们知道可以控制受害者将要接收的响应的请求体,而HEAD响应通常在其头部包含Content-Type和Content-Length。因此你可以发送如下请求来在受害者中引发XSS而页面本身并不容易受到XSS攻击

缓存污染

利用前面提到的响应解同步内容混淆攻击,如果缓存存储了受害者发出的请求的响应并且这个响应是一个注入的响应引发了XSS那么缓存就被污染了

恶意请求包含XSS有效载荷

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

{% hint style="warning" %} 请注意,在这种情况下,如果**"受害者"是攻击者**,他现在可以对任意URL进行缓存污染,因为他可以控制将要被缓存的URL,并使用恶意响应。 {% endhint %}

Web缓存欺骗

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

响应分割

这种攻击的目标是再次利用响应解同步,以便使代理发送一个100%由攻击者生成的响应

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

他将发送一个如下的利用

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

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

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

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

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥