# 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。 ::: ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up