# HTTP request smuggling Lab11 本題是 HTTP/2 Request Splitting via CRLF injection,重點是利用 HTTP/2 → HTTP/1.1 的轉換過程,透過 CRLF 注入在前端 proxy 分離出一個完整的請求,進而劫持 admin 的回應(response queue poisoning),取得 session cookie 並刪掉 carlos。 一樣先進入網站並攔截請求。 ![image](https://hackmd.io/_uploads/SkMffKUDeg.png) 發現這題的 seach 會有歷史紀錄。 ![image](https://hackmd.io/_uploads/HkFmMYUDgg.png) 而且歷史紀錄是跟 Cookie session 綁一起的。 ![image](https://hackmd.io/_uploads/ByXr7FIDel.png) 所以我們先去擷取搜尋時的請求。 ![image](https://hackmd.io/_uploads/SkKIVtUwxx.png) 接著在 HTTP/2 request 裡插入一個 header,目的是為了騙過前端伺服器,觸發 HTTP Request Smuggling。 - Name: `foo` - Value: `bar\r\nTransfer-Encoding: chunked` - 這裡的 `\r\n` 會被 Burp 自動轉成真正的 CRLF。 ![image](https://hackmd.io/_uploads/HJUPrYIDeg.png) 設定完再將請求做更改。 --- ![image](https://hackmd.io/_uploads/rJXlLFUwgx.png) ![image](https://hackmd.io/_uploads/HJ49FLUvxl.png) 如果出現連續兩個 200 也就代表 lab 完成了。 ![image](https://hackmd.io/_uploads/Bkyg9IIweg.png) :::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。 ::: ---