> For the complete documentation index, see [llms.txt](https://hacktricks.xsx.tw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacktricks.xsx.tw/pentesting-web/http-response-smuggling-desync.md).

# HTTP Response Smuggling / Desync

<details>

<summary><strong>从零开始学习 AWS 黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks 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 响应**。

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