好的,這個標題「借刀殺人」下得非常好,它精準地抓住了 CSRF 與 SSRF 這兩種攻擊的精髓。它們雖然名稱相似,常被混淆,但攻擊的對象、利用的「刀」、以及造成的危害都截然不同。
我們就順著這個比喻,來深入淺出地剖析這兩種攻擊。
CSRF (Cross-Site Request Forgery) 的核心是利用使用者既有的登入狀態,誘騙他們的瀏覽器,在他們不知情的情況下,向一個受信任的網站發送惡意的、會改變狀態的請求。
想像一個經典的銀行轉帳情境:
https://mybank.com
,你的瀏覽器保存了該網站的 Session Cookie。https://evil-site.com
上,放置了一個隱藏的陷阱。這個陷阱可能是一個圖片標籤,或是一個自動提交的表單。https://evil-site.com
。evil-site.com
。頁面中可能包含這樣一行程式碼:
<img src="https://mybank.com/transfer?to=attacker_account&amount=10000" width="1" height="1">
<img>
標籤,便會嘗試去載入 src
屬性中的 URL。mybank.com
時,瀏覽器會自動附上所有 mybank.com
的 Cookie,因為這是瀏覽器的同源策略設計。mybank.com
的伺服器收到這個請求,檢查 Cookie 後發現,這是一個合法的、已登入的使用者發出的請求,於是執行了轉帳操作。在這個過程中,攻擊者從頭到尾沒有拿到你的密碼或 Cookie,他只是「偽造」了一個請求,然後「借用」你的瀏覽器去執行它。攻擊者看不到轉帳成功的頁面回應,但他達成了轉帳的目的。
SameSite
屬性設為 Strict
或 Lax
。這會告訴瀏覽器,在跨站請求中不要發送此 Cookie,從根本上瓦解了 CSRF 的攻擊基礎。這是現代瀏覽器非常有效的防禦機制。SSRF (Server-Side Request Forgery) 的核心是濫用伺服器自身的功能,誘使伺服器代替攻擊者,向內部網路或外部發起惡意的網路請求。
想像一個網站功能,允許使用者「從 URL 上傳頭像」:
http://192.168.1.254/admin
(嘗試存取內部網路的管理後台)http://localhost/server-status
(查看伺服器狀態頁面)file:///etc/passwd
(嘗試讀取伺服器本地的敏感檔案)http://192.168.1.254/admin
發起了請求。在雲端環境中,SSRF 的危害尤其巨大,攻擊者可以利用它來請求雲端服務商的中繼資料服務 (Metadata Service),例如 AWS 的 http://169.254.169.254/
,從而竊取到該伺服器實例的臨時存取金鑰 (Access Keys),進而完全控制受害者的雲端帳戶。
http
和 https
協定,禁用 file://
, gopher://
, dict://
等高風險的 URL 協定。127.0.0.1
, 10.0.0.0/8
, 192.168.0.0/16
)。但這種方法容易被各種技巧(如使用特殊 IP 格式、DNS Rebinding)繞過。CSRF 和 SSRF 都詮釋了「借刀殺人」的精髓,但它們所借的「刀」和要殺的「人」完全不同。
理解這兩者的根本區別,對於設計安全的 Web 應用程式至關重要。