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

159 lines
9.4 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 Response Smuggling / Desync
{% hint style="success" %}
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
</details>
{% endhint %}
**本帖的技术来自视频:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
## HTTP 请求队列去同步
首先,这种技术**利用了 HTTP 请求走私漏洞**,所以你需要知道这是什么:
这种技术与常见的 HTTP 请求走私的**主要区别**在于,**不是通过添加前缀来攻击受害者的请求**,而是**泄露或修改受害者收到的响应**。这是通过发送**两个完整的请求来去同步代理的响应队列**,而不是发送一个半请求来利用 HTTP 请求走私。
这是因为我们将能够**去同步响应队列**,使得**受害者的合法请求的响应被发送给攻击者**,或者通过**在响应中注入攻击者控制的内容**。
### HTTP 管道去同步
HTTP/1.1 允许请求**不同的资源而不需要等待之前的请求**。因此,如果中间有一个**代理**,那么代理的任务是**保持发送到后端的请求和来自后端的响应的同步匹配**。
然而,去同步响应队列存在一个问题。如果攻击者发送一个 HTTP 响应走私攻击,并且对**初始请求和走私请求的响应立即返回**,那么走私响应不会被插入到受害者响应的队列中,而是**作为错误被丢弃**。
![](<../.gitbook/assets/image (633).png>)
因此,需要**走私请求在后端服务器中处理的时间更长**。因此,当走私请求被处理时,与攻击者的通信将结束。
如果在这种特定情况下,**受害者发送了一个请求**,而**走私请求在合法请求之前被响应**,那么**走私响应将被发送给受害者**。因此,攻击者将**控制受害者“执行”的请求**。
此外,如果**攻击者随后执行一个请求**,而**对受害者请求的合法响应在攻击者请求之前被回答**,那么**对受害者的响应将被发送给攻击者****窃取**对受害者的响应(例如,可能包含**Set-Cookie**头)。
![](<../.gitbook/assets/image (1020).png>)
![](<../.gitbook/assets/image (719).png>)
### 多重嵌套注入
与常见的**HTTP 请求走私**相比,另一个**有趣的区别**是,在常见的走私攻击中,**目标**是**修改受害者请求的开头**,以便执行意外的操作。在**HTTP 响应走私攻击**中,由于你**发送完整的请求**,你可以**在一个有效载荷中注入数十个响应**,这将**去同步数十个用户**,这些用户将**接收**被**注入的**响应。
除了能够**更容易地在合法用户之间分发数十个漏洞**,这也可以用来导致服务器的**拒绝服务**。
### 漏洞组织
如前所述,为了利用这种技术,需要**第一个走私消息**在服务器中**处理的时间很长**。
如果我们只是想**尝试窃取受害者的响应**,那么这个**耗时的请求就足够了**。但如果你想执行更复杂的漏洞,这将是漏洞的常见结构。
首先是**初始**请求,利用**HTTP** **请求** **走私**,然后是**耗时的请求**,最后是**一个或多个有效载荷请求**,其响应将被发送给受害者。
## 利用 HTTP 响应队列去同步
### 捕获其他用户的请求 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
与已知的 HTTP 请求走私有效载荷一样,你可以**窃取受害者的请求**,有一个重要的区别:在这种情况下,你只需要**发送的内容在响应中被反射****不需要持久存储**。
首先,攻击者发送一个有效载荷,包含一个**带有反射参数的最终 POST 请求**,并且有一个大的 Content-Length。
![](<../.gitbook/assets/image (1053).png>)
然后,一旦**初始请求**(蓝色)被**处理**,而**耗时**的请求(黄色)正在被处理时,**来自受害者的下一个请求**将被**附加在反射参数之后**
![](<../.gitbook/assets/image (794).png>)
然后,**受害者**将**收到**对**耗时**请求的**响应**,如果在此期间**攻击者****发送**了**另一个**请求,**反射内容请求的响应将被发送给他**。
## 响应去同步
到目前为止,我们已经学习了如何利用 HTTP 请求走私攻击来**控制**客户端将要**接收的响应**,以及如何**窃取原本属于受害者的响应**。
但仍然可以**进一步去同步**响应。
有趣的请求如**HEAD**请求被指定为不应在响应体内**包含任何内容**,并且应(必须)**包含请求的 Content-Length**,就像**GET 请求**一样。
因此,如果攻击者**注入**一个**HEAD**请求,如下图所示:
![](<../.gitbook/assets/image (1107).png>)
然后,一旦**蓝色请求**被响应给攻击者,下一位受害者的请求将被引入队列:
![](<../.gitbook/assets/image (999).png>)
然后,**受害者**将**收到**来自**HEAD**请求的**响应**,该响应**将包含一个 Content-Length但没有任何内容**。因此,代理**不会将此响应发送给受害者,而是**等待**一些**内容**,实际上将是**对黄色请求的响应**(也由攻击者注入):
![](<../.gitbook/assets/image (735).png>)
### 内容混淆
根据前面的例子,知道你可以**控制请求的主体**,而该请求的响应将被受害者接收,并且**HEAD** **响应**通常在其头部包含**Content-Type 和 Content-Length**,你可以**发送如下请求**以**在受害者中引发 XSS**,而页面并不容易受到 XSS 攻击:
![](<../.gitbook/assets/image (688).png>)
### 缓存中毒
利用之前提到的响应去同步内容混淆攻击,**如果缓存存储了受害者执行的请求的响应,并且该响应是一个导致 XSS 的注入响应,那么缓存就被毒化了**。
包含 XSS 有效载荷的恶意请求:
![](<../.gitbook/assets/image (614).png>)
包含指示缓存存储响应的头的恶意响应:
![](<../.gitbook/assets/image (566).png>)
{% hint style="warning" %}
请注意,在这种情况下,如果**“受害者”是攻击者**,他现在可以在任意 URL 上执行**缓存中毒**,因为他可以**控制将被缓存的 URL**与恶意响应。
{% endhint %}
### Web 缓存欺骗
此攻击类似于前一个,但**攻击者将受害者信息缓存到缓存中,而不是在缓存中注入有效载荷:**
![](<../.gitbook/assets/image (991).png>)
### 响应分割
此攻击的**目标**是再次利用**响应** **去同步**,以便**使代理发送 100% 由攻击者生成的响应**。
为了实现这一点,攻击者需要找到一个**反射某些值到响应中的** Web 应用程序端点,并**知道 HEAD 响应的内容长度**。
他将发送一个**漏洞**,如下所示:
![](<../.gitbook/assets/image (911).png>)
在第一个请求被解决并发送回攻击者后,**受害者的请求将被添加到队列中**
![](<../.gitbook/assets/image (737).png>)
受害者将收到的响应是**HEAD 响应 + 第二个请求响应的内容(包含部分反射数据):**
![](<../.gitbook/assets/image (356).png>)
然而,请注意**反射数据的大小与 HEAD** 响应的 **Content-Length** 相符,这**在响应队列中生成了有效的 HTTP 响应**。
因此,**第二位受害者的下一个请求**将**接收**作为**响应完全由攻击者构造的内容**。由于响应完全由攻击者构造,他还可以**使代理缓存该响应**。
{% hint style="success" %}
学习和实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习和实践 GCP 黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持 HackTricks</summary>
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在 Twitter 上关注** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
</details>
{% endhint %}