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

113 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTTP 响应劫持 / Desync
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](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 来**分享您的黑客技巧**。
</details>
**本文技术取自视频:[https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s](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
### 捕获其他用户的请求 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
与已知的 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 响应**。
因此,**第二个受害者的下一个请求**将**接收到** **完全由攻击者制作的响应**。由于响应完全由攻击者制作,他还可以**使代理缓存响应**。