天天看點

4.4 CSRF

https://www.trustedsec.com/blog/setting-the-referer-header-using-javascript/ 通過 js 僞造 referer

簡介

主要參考

是什麼?

CSRF Cross-site request forgery 跨站請求僞造。

SSRF Server-side request forgery 服務端請求僞造。
原理是?

CSRF 屬于用戶端漏洞。

我們知道,通常在網頁上執行的操作會通過 http 請求發送給伺服器。

假設使用者已經登入網站,網站有一些敏感功能(例如更改驗證郵箱)。如果攻擊者事先捕獲好這個更改郵箱的資料包,通過某種手段誘使使用者發送這個請求資料包,即更改了使用者的郵箱。

成功的 csrf 攻擊就是以受害者的身份發送 http 請求。具體來說就是 發送請求以執行某些功能,或者讀取請求的響應以擷取使用者敏感資訊。

實際攻擊中存在的限制

根據原理,可以看出條件有幾點:

  1. 一個敏感的功能,并且捕捉資料包。

    例如更改郵箱,更改綁定手機号等等。

    網上有的例子是讓網站管理者通過 csrf 添加使用者。但最大的難點是不知道添加使用者的資料包。如果是開源 cms 還可以通過自行搭建擷取資料包。要是非開源,根本沒辦法擷取資料包。

    假設,當服務端收到請求後需要使用者再次輸入密碼确認,或者還存在驗證碼等,那麼 csrf 也就不起作用。

  2. 要能自動處理使用者憑證。

    通常使用者憑證是在 cookie 中,當向目标網站發送請求時浏覽器會自動攜帶 目标網站 的 cookie。

    cookie 中的 samesite 屬性會決定跨域請求是否攜帶此 cookie。
  3. 請求資料包不能有不可預測的參數。

    若有不可預測參數,則發送的請求就是非法的,伺服器當然不認。

    配置良好的 csrf token ,直接就打破這個條件。
  4. 如何讓使用者觸發。

    GET 型比較簡單,可以通過很多方式觸發。例如直接誘使使用者點選連結、通過标簽某些屬性

    <img src />

    、通過 xss 攻擊執行 js 發送。

    但 POST 型就隻能通過 js 發送。

如果進行跨域請求的話,要額外注意。

  • sop 同源政策 和 cors 跨域資源共享,影響擷取跨域請求的響應。
  • cookie 中 samesite 标志:用來緩解 csrf 攻擊。設定得當,任何從第三方網站發送的給目标網站的請求都不會攜帶目标網站的 cookie。
    自 chrome 80 (2019/2)起,若未設定 samesite 标志,則預設當作 Lax 。詳情見
如何防禦?

可以從多個方面考慮:

  1. 從功能點上來說:
    • 敏感功能二次确認,例如要求再輸入一遍驗證碼,加大利用難度。
    • POST 型比 GET 型更難利用,是以可以考慮敏感功能改成 POST 型請求。
  2. csrf token,使資料包不可預測。
  3. samesite 标志,使得來自其它網站的請求不會攜帶 cookie。
  4. 對 referer 頭部進行檢測。

利用思路

如果不符合某一步的話,就放棄吧。。

  1. 首先得得到敏感資料包,觀察網站功能,有無值得利用,擷取其資料包。

    功能必須是隻需要一個或多個資料包就能進行的操作,中間沒有什麼額外驗證過程。

  2. 資料包中是否存在随機參數。

    如果有随機參數,嘗試是否能預測。例如時間戳。

    如果有 csrf token ,則檢查是否存在以下缺陷:

    更改請求方法
    嘗試删除 token
    token 可重用
    token 未和使用者綁定,意思是說一個有效的token 任意使用者都可使用。
    
    頁面存在 xss 漏洞,可以擷取到 csrf token
               
  3. 是否存在其它驗證,是否存在缺陷。

    如果檢查 referer,則看是否存在以下缺陷:

    删除是否影響?
    是否不嚴格比對,即僅比對前字尾等?
    
    通過 js 代碼僞造 referer
               
  4. 根據資料包請求方法不同,進行利用。
    • POST 型:通過 xss 漏洞。
    • GET 型:通過 xss 漏洞。或社會工程學方法誘使使用者通路。

詳細利用方式

參考這篇博文

此處僅摘抄主要方法概述,具體利用代碼請參照原文。

  1. 提取 csrf token:

    通過頁面 xss 漏洞或 懸浮标簽注入來擷取 csrf token

  2. 使用 img 标簽發送 GET 請求:
  3. 使用 表單/Ajax 發送 GET/POST請求:
  4. 發送 Content-Type 為 multipart/form-data 的 POST 請求。上傳檔案
  5. 使用 ajax 擷取 token,然後使用 ajax 發送請求。
  6. 使用 iframe 擷取 token,然後通過 表單發送請求。
  7. 使用 iframe 擷取 token,并通過此 iframe 裡的表單發送。
  8. 通過一個 iframe 擷取 token,然後通過另一個 iframe 發送請求。

其它

補充一下同源政策

4.4 CSRF