# HTTP request smuggling Lab9
本題存在 Request Smuggling 漏洞,原因是前端伺服器會將 HTTP/2 請求降級,即使請求長度有歧義(ambiguous length)也一樣。
要完成這個 lab 需要進行一個 request smuggling 攻擊,讓受害者的瀏覽器載入並執行一個來自 exploit server 的惡意 JavaScript,內容是 alert(document.cookie)。受害者每 10 秒會造訪首頁一次。
重點:
利用 request smuggling,讓受害者的瀏覽器自動去載入你 exploit server 上的 JS 檔案。
一樣先進入網站並攔截請求。


這裡我們嘗試 smuggle 任意前綴,測試伺服器是否真的存在 H2.CL 或 H2.TE 類型的 request smuggling 漏洞。

通過測試會發現會出現 404,這表示成功讓後端把下一個請求當成 smuggled 前綴的延伸。
而因為本題是需要使用者進入網站就被自動跳轉到其他頁面,所以我們要找一個只要是進入了,就會被自動導向到其他頁面的目錄,這裡我用 GET `/resources` 請求時,會被轉址到 `/resources/`。

發現這個資訊,我們就用他來讓 victim 自動跳轉去載入我們的 JS,建立實際 smuggle payload:

確定出現 200 是有 smuggle 成功的可能,所以接著到我們的 exploit server 去設定位置跟 body 內容。

設定完再將剛剛請求封包中的 Host 改為我們惡意的連結並送出。

不斷重送到出現 302 重新導向。

如果出現連續兩個 200 也就代表 lab 完成了。

:::info
### 為什麼加 Content-Length: 0 可以測試是否有漏洞?
前後端對 body 的「解讀方式」不同:
| 前端 (HTTP/2) | 後端 (HTTP/1.1) |
| -------- | -------- |
| 不管 body 寫什麼,只看 Content-Length | 當然會把 body 當新請求看 |
| Content-Length: 0 表示:我沒要傳資料 | 看到一整個 GET 開頭的新請求:中計了! |
HTTP/2 規定得很清楚:
如果 `Content-Length: 0`,那這請求就沒 body,剩下的內容它根本不看,直接傳給後端。
後端把第一段 POST 處理掉,然後看到第二段開始是完整的新請求,就直接炸開。
### /resources 與 /resources/ 差異?
`/resources` 沒有尾巴就被自動加上 `/` 變路徑,而使用者進入 `/resources/` 直接讀 `/resources/` 裡的 body 內容觸發我們的惡意 payload。
- 受害者原本想送的請求會被「拼接」到這段 GET 請求後面,導致後端把受害者的請求也包含進來,或被污染成我們的請求目標。
- 由於指定了 Host: exploit-server.net,後端就會把這個請求當作訪問這個主機,讓受害者的瀏覽器去拿我們控制的惡意伺服器的資源。
- 最後出現兩個 200 可以也確定是我們先被伺服器正常處理 200 後,再換目標使用者中招而出現第二個 200。
:::
---