iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
Security

跨出第一步:D 從0到0.1的Web security 系列 第 20

Day 19: 借刀殺人:淺談 CSRF (跨站請求偽造) 與 SSRF (伺服器端請求偽造)

  • 分享至 

  • xImage
  •  

好的,這個標題「借刀殺人」下得非常好,它精準地抓住了 CSRF 與 SSRF 這兩種攻擊的精髓。它們雖然名稱相似,常被混淆,但攻擊的對象、利用的「刀」、以及造成的危害都截然不同。

我們就順著這個比喻,來深入淺出地剖析這兩種攻擊。


一、 CSRF (跨站請求偽造) - 挾持你的瀏覽器行兇

CSRF (Cross-Site Request Forgery) 的核心是利用使用者既有的登入狀態,誘騙他們的瀏覽器,在他們不知情的情況下,向一個受信任的網站發送惡意的、會改變狀態的請求。

  • 借來的刀受害者已通過認證的瀏覽器 (Browser Session)。這把刀(瀏覽器)本身是合法的,並且握在受害者手上。
  • 殺人的目標網站上的使用者帳號。攻擊者想利用你的身份去執行某些操作。
  • 作案手法:攻擊者並不直接攻擊網站,而是想辦法驅動受害者的瀏覽器去攻擊網站。

攻擊流程與範例

想像一個經典的銀行轉帳情境:

  1. 受害者登入:你(受害者)登入了你的網路銀行 https://mybank.com,你的瀏覽器保存了該網站的 Session Cookie。
  2. 攻擊者設下陷阱:攻擊者在一個他自己控制的惡意網站 https://evil-site.com 上,放置了一個隱藏的陷阱。這個陷阱可能是一個圖片標籤,或是一個自動提交的表單。
  3. 誘騙受害者:你收到一封釣魚郵件,內容是「快來看可愛貓咪的照片!」,連結指向 https://evil-site.com
  4. 觸發攻擊:你點擊連結,瀏覽器載入 evil-site.com。頁面中可能包含這樣一行程式碼:
    <img src="https://mybank.com/transfer?to=attacker_account&amount=10000" width="1" height="1">
    
  5. 瀏覽器自動「行兇」
    • 你的瀏覽器看到 <img> 標籤,便會嘗試去載入 src 屬性中的 URL。
    • 在發送這個請求到 mybank.com 時,瀏覽器會自動附上所有 mybank.com 的 Cookie,因為這是瀏覽器的同源策略設計。
    • mybank.com 的伺服器收到這個請求,檢查 Cookie 後發現,這是一個合法的、已登入的使用者發出的請求,於是執行了轉帳操作。
    • 你完全不知情,直到發現帳戶餘額少了 10000 元。

在這個過程中,攻擊者從頭到尾沒有拿到你的密碼或 Cookie,他只是「偽造」了一個請求,然後「借用」你的瀏覽器去執行它。攻擊者看不到轉帳成功的頁面回應,但他達成了轉帳的目的

防禦策略

  1. Anti-CSRF Token (首選防禦):伺服器在每個表單中都生成一個獨一無二、不可預測的隨機 Token。當使用者提交表單時,伺服器會驗證這個 Token 是否匹配。由於攻擊者無法猜到這個 Token,因此他偽造的請求會因為缺少合法的 Token 而被拒絕。
  2. SameSite Cookie 屬性:在設定 Cookie 時,將 SameSite 屬性設為 StrictLax。這會告訴瀏覽器,在跨站請求中不要發送此 Cookie,從根本上瓦解了 CSRF 的攻擊基礎。這是現代瀏覽器非常有效的防禦機制。
  3. 檢查 Referer 或 Origin 標頭:驗證請求的來源是否為合法的網域。但此方法較不可靠,因為這些標頭可能被竄改或被瀏覽器策略性地移除。

二、 SSRF (伺服器端請求偽造) - 綁架你的伺服器作亂

SSRF (Server-Side Request Forgery) 的核心是濫用伺服器自身的功能,誘使伺服器代替攻擊者,向內部網路或外部發起惡意的網路請求。

  • 借來的刀易受攻擊的 Web 伺服器本身。這把刀(伺服器)通常位於防火牆之後,擁有內部網路的存取權限。
  • 殺人的目標伺服器所在的內部網路資源(如資料庫、內部管理後台、雲端服務的中繼資料 API)。
  • 作案手法:攻擊者尋找網站上那些會「根據使用者輸入的 URL 去抓取資源」的功能,並提供一個惡意的 URL,讓伺服器成為他的代理人。

攻擊流程與範例

想像一個網站功能,允許使用者「從 URL 上傳頭像」:

  1. 易受攻擊的功能:使用者在個人資料頁面輸入一個圖片 URL,伺服器會去抓取這個 URL 的內容並存為使用者的頭像。
  2. 攻擊者的惡意輸入:攻擊者不輸入正常的圖片 URL,而是輸入一個指向內部網路或本地檔案的 URL:
    • http://192.168.1.254/admin (嘗試存取內部網路的管理後台)
    • http://localhost/server-status (查看伺服器狀態頁面)
    • file:///etc/passwd (嘗試讀取伺服器本地的敏感檔案)
  3. 伺服器被「綁架」去請求
    • Web 伺服器接收到這個惡意 URL,由於程式邏輯不嚴謹,它就真的向 http://192.168.1.254/admin 發起了請求。
    • 因為這個請求是從伺服器本身(內部網路)發起的,它可以輕易繞過防火牆,存取到那些不對外開放的內部服務。
    • 伺服器抓取到內部管理後台的頁面內容後,可能會將其作為「圖片」處理失敗,但在錯誤訊息中,可能會洩漏內部服務的 Banner、標題等敏感資訊,攻擊者由此可以進一步探測內網。

在雲端環境中,SSRF 的危害尤其巨大,攻擊者可以利用它來請求雲端服務商的中繼資料服務 (Metadata Service),例如 AWS 的 http://169.254.169.254/,從而竊取到該伺服器實例的臨時存取金鑰 (Access Keys),進而完全控制受害者的雲端帳戶。

防禦策略

  1. 白名單驗證 (首選防禦):最嚴格也最有效的防禦。在程式碼中寫死一份允許請求的域名/IP 白名單。任何不在白名單中的請求,一律禁止。
  2. 限制協定:只允許 httphttps 協定,禁用 file://, gopher://, dict:// 等高風險的 URL 協定。
  3. 黑名單隔離 (較弱):禁止請求內網 IP 段(如 127.0.0.1, 10.0.0.0/8, 192.168.0.0/16)。但這種方法容易被各種技巧(如使用特殊 IP 格式、DNS Rebinding)繞過。
  4. 統一出口 IP 並配置防火牆:如果伺服器需要對外請求,應統一透過一個網路地址轉換 (NAT) 閘道,並在閘道上設定嚴格的防火牆規則,限制其只能存取必要的外部服務。

結論

CSRF 和 SSRF 都詮釋了「借刀殺人」的精髓,但它們所借的「刀」和要殺的「人」完全不同。

  • CSRF 是挾持用戶,利用用戶對網站的信任,去攻擊用戶自己的帳號。
  • SSRF 是綁架伺服器,利用伺服器對內部網路的信任,去攻擊內部系統。

理解這兩者的根本區別,對於設計安全的 Web 應用程式至關重要。


上一篇
• Day 18: 我的留言怎麼變成了惡意腳本?淺談 XSS
系列文
跨出第一步:D 從0到0.1的Web security 20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言