歡迎光臨
我們一直在努力

SSRF 是什麼:從網址輸入到伺服器代替你發送請求

授權與安全提醒:本文只適用於自己的程式、固定測試資料及已取得明確授權的環境。所有程式碼均為不連網的閱讀案例,不會接觸真實內網、雲端中繼資料或第三方系統,也不提供掃描與自動化利用步驟。

本系列第 1 篇處理「SSRF 是什麼:從網址輸入到伺服器代替你發送請求」。重點不是背誦繞過字串,而是把外部輸入、URL 解析、DNS、實際連線、回應處理和網路權限逐層分開。只要能說清楚每層由誰決定、使用哪個解析結果,就能在設計與 Code Review 階段找出風險。

本篇會學到什麼

  • 用資料流說明本篇 SSRF 風險,而不是依賴攻擊字串。
  • 辨識安全檢查與實際連線可能不一致的位置。
  • 以應用、網路、監控與事件回應建立可驗證的修補。

必備名詞與生活化心智模型

把網站想成代購員:使用者只交一張地址,真正出門的是伺服器。伺服器可能擁有內網路由、服務身分與防火牆信任,因此同一個網址由瀏覽器與伺服器開啟,安全結果完全不同。

Source 是使用者可影響的網址或目的地識別;Parser 把文字拆成 URL 組件;Resolver 把 Host 轉成位址;Sink 是真正建立連線的 Client、代理或背景工作。驗證若只存在於其中一層,其他層仍可能採用不同資料。

SSRF 資料流技術圖

SSRF 是什麼:從網址輸入到伺服器代替你發送請求技術流程圖
第 1 篇資料流:從輸入、政策判斷到受限的出站結果。

常見發生情境

網址預覽接收文章 URL,後端下載標題與縮圖;如果 URL 未受控制,使用者實際上是在決定後端往哪裡連線。

審查時應由功能入口一路追到同步或非同步的網路 Sink。不要因欄位藏在 JSON、資料庫、Cookie、佇列或後台設定就假設可信;如果低信任角色能直接或間接改變目的地,它仍是外部控制資料。

不安全原始碼與逐步解讀

$plan = ['url' => $input, 'controls' => [], 'network_action' => 'none'];

程式把外部 URL 直接交給 HTTP Client,沒有先固定 Scheme、Host、解析後位址與 Redirect。

  1. 找出輸入最初由誰控制,以及是否跨越資料庫或佇列。
  2. 確認安全檢查使用的解析器、DNS 答案和 Client 是否一致。
  3. 確認重試、Redirect、代理與背景工作會不會重新決定目的地。
  4. 盤點程式執行身分能接觸的網段、服務和資料。

修補後原始碼與設計理由

$decision = $policy->evaluate($input, $fixedDnsAnswers);
if (!$decision->allowed) { throw new DomainException('URL rejected'); }

先產生離線政策決策;只有通過業務 Allowlist、位址分類與 Redirect 政策的請求,才交給受限出口代理執行。

安全版本刻意把「授權目的地」與「執行請求」拆成兩個介面。政策回傳的不是可以任意修改的 URL 字串,而是含政策版本、正規化目的地、已驗證位址與資源限制的票據。執行層拒絕沒有票據的呼叫,才能避免另一段程式繞過共同控制。

如何驗證修補

使用表格驅動的離線測試,注入固定 DNS 答案與假 transport。至少驗證正常 Allowlist、錯誤 Scheme、userinfo、非預期 Port、解析失敗、私有/Loopback/Link-local、混合 A 與 AAAA、Redirect、逾時和超過回應大小。測試應斷言「沒有建立非預期連線」,而不是只比較錯誤文字。

部署測試再核對實際 Client profile、代理、環境變數、IPv6 路由與防火牆規則。單元測試證明政策邏輯,網路控制則證明即使應用層出錯,最壞影響仍受限制。

更多應用案例與常見誤判

最常見的誤判是把『沒有把回應顯示在頁面』當成沒有 SSRF,或把 WAF 命中當成根因已修補。另一個誤判是相信來自自家資料庫的 URL;資料可能先由低信任使用者寫入,之後才由高權限背景工作取出。判斷依據必須是資料控制權與最終 Sink,而不是欄位所在位置。

正常的特殊字元、國際化網域、暫時 DNS 錯誤或第三方服務改址也可能觸發規則。防守端應保留可解釋的拒絕原因與政策版本,讓開發者能修正業務設定,但不能因為出現誤判就把預設政策改成全部允許。

開發與 SOC 觀察點

將入口路由、正規化 Host、解析後位址類別、政策版本與請求結果串在同一個 correlation ID。

建議日誌欄位包含時間、功能、使用者/工作 ID、trace ID、政策結果、正規化 Host、Port、位址類別、Redirect 跳數、耗時、回應大小與結果類別。查詢字串、Header、憑證與完整回應不可直接進入一般日誌。SOC 應把應用事件、DNS、出口代理、網路流量和雲端稽核串成同一時間線。

防禦檢查清單

  • 能否不用完整 URL,而改用已登錄的目的地 ID?
  • Scheme、userinfo、Host、Port、DNS 全部答案與每一個 Redirect 是否受控?
  • 驗證結果是否與實際連線綁定,重試時是否重新套用政策?
  • 是否設定連線/總逾時、回應大小、內容型別與方法限制?
  • 工作負載身分、網段與出口代理是否遵循最小權限?
  • 能否用 trace ID 還原來源、政策、DNS、連線與結果?

重點整理與下一篇

SSRF 是什麼:從網址輸入到伺服器代替你發送請求的核心是控制『伺服器最後實際連到哪裡』。字串驗證只是入口;真正可靠的方案還要涵蓋解析一致性、位址分類、Client 行為、出口限制與可觀測性。下一篇會沿著系列順序,把這些控制套到另一個常見 SSRF 邊界。

參考資料與更新日期

更新日期:2026-07-20

贊(0) 贊助
未經允許不得轉載:波波的寂寞世界 » SSRF 是什麼:從網址輸入到伺服器代替你發送請求

波波的寂寞世界

Facebook聯繫我們

覺得文章有幫助,歡迎贊助支持本站

感謝你的支持,我會持續整理資安筆記、實務經驗與有價值的技術內容。

贊助本站