[點晴永久免費OA][轉帖]計算機網絡知識----網絡安全----CSRF(跨站請求偽造 )
當前位置:點晴教程→點晴OA辦公管理信息系統
→『 經驗分享&問題答疑 』
一、簡介跨站請求偽造攻擊,英文全稱是Cross-site request forgery,簡稱為CSRF。 攻擊者誘導用戶進入一個第三方網站,然后該網站向被攻擊網站發送跨站請求。如果用戶在被攻擊網站中保存了登錄狀態,那么攻擊者就可以利用這個登錄狀態,繞過后臺的用戶驗證,冒充用戶向服務器執行一些操作。 CSRF 攻擊的本質:本質是利用 cookie 會在同源請求中攜帶發送給服務器的特點,以此來實現用戶的冒充。 如何攻擊從簡介中我們得知,攻擊者需要誘導用戶進入一個第三方網站。
從總結中可以看出,若想完成CSRF攻擊,要同時滿足2各條件
總結來說天時地利人和。 二、CSRF攻擊分類2.1 GET 類型的 CSRFGET 類型的 CSRF 利用非常簡單,只需要一個 HTTP 請求,一般這樣使用 假設:網站A,銀行賬戶轉行,通過GET請求來完成 危險網站B,其中有一段代碼 <img src="http://mybank.example/transfer?account=ying&for=hacker&money=10000"> 若這時候訪問了網站B,黑客將轉賬的請求接口隱藏在 img 標簽內,欺騙瀏覽器這是一張圖片資源。當該頁面被加載時,瀏覽器會自動發起 img 的資源請求,如果服務器沒有對該請求做判斷的話,那么服務器就會認為該請求是一個轉賬請求,于是用戶賬戶上的 10000 就被轉移到黑客的賬戶上去了。 2.2 POST類型的 CSRF還以上面的轉賬為例子進行說明 <form action="http://mybank.example/transfer" method=POST> <input type="hidden" name="account" value="ying" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script> 若訪問了該頁面,表單會自定提交。相當于進行了一次POST請求。 POST類型的攻擊通常比GET要求更加嚴格一點,但仍并不復雜。任何個人網站、博客,被黑客上傳頁面的網站都有可能是發起攻擊的來源,后端接口不能將安全寄托在僅允許POST上面。 2.3 鏈接類型的CSRF這點通俗來說,就是點擊了危險網站的鏈接。通常是在論壇中發布的圖片中嵌入惡意鏈接,或者以廣告的形式誘導用戶中招。 <a href="http://mybank.example/transfer?account=ying&for=hacker&money=10000" taget="_blank"> 驚喜驚喜,快來領?。?! <a/> 三、防御3.1 同源檢測CSRF大多來自第三方網站,那么我們就直接禁止外域(或者不受信任的域名)對我們發起請求。 在HTTP協議中,每一個異步請求都會攜帶兩個Header,用于標記來源域名:
這兩個Header在瀏覽器發起請求時,大多數情況會自動帶上,并且不能由前端自定義內容。 服務器可以通過解析這兩個Header中的域名,確定請求的來源域。 使用Origin Header確定來源域名在部分與CSRF有關的請求中,請求的Header中會攜帶Origin字段。字段內包含請求的域名(不包含path及query),如果Origin存在,那么直接使用Origin中的字段確認來源域名就可以。 但是會有2種特殊情況,Origin是不存在的:
使用Referer Header確定來源域名根據HTTP協議,在HTTP頭中有一個字段叫Referer,記錄了該HTTP請求的來源地址。 這種方法并非萬無一失,Referer的值是由瀏覽器提供的,雖然HTTP協議上有明確的要求,但是每個瀏覽器對于Referer的具體實現可能有差別,并不能保證瀏覽器自身沒有安全漏洞。使用驗證 Referer 值的方法,就是把安全性都依賴于第三方(即瀏覽器)來保障,從理論上來講,這樣并不是很安全。在部分情況下,攻擊者可以隱藏,甚至修改自己請求的Referer。 在以下情況下Referer沒有或者不可信:
因此,服務器的策略是優先判斷 Origin,如果請求頭中沒有包含 Origin 屬性,再根據實際情況判斷是否使用 Referer 值,從而增加攻擊難度。 無法確認來源域名情況如果 Origin 和 Referer 都不存在,建議直接進行阻止,特別是如果您沒有使用隨機 CSRF Token(參考下方)作為第二次檢查。 如何阻止外域請求通過Header的驗證,我們可以知道發起請求的來源域名,這些來源域名可能是網站本域,或者子域名,或者有授權的第三方域名,又或者來自不可信的未知域名。 我們已經知道了請求域名是否是來自不可信的域名,我們直接阻止掉這些的請求,就能防御CSRF攻擊了嗎? 且慢!當一個請求是頁面請求(比如網站的主頁),而來源是搜索引擎的鏈接(例如百度的搜索結果),也會被當成疑似CSRF攻擊。所以在判斷的時候需要過濾掉頁面請求情況,通常Header符合以下情況: Accept: text/html Method: GET 但相應的,頁面請求就暴露在了CSRF的攻擊范圍之中。如果你的網站中,在頁面的GET請求中對當前用戶做了什么操作的話,防范就失效了。 例如,下面的頁面請求: GET https://example.com/addComment?comment=XXX&dest=orderId 注:這種嚴格來說并不一定存在CSRF攻擊的風險,但仍然有很多網站經常把主文檔GET請求掛上參數來實現產品功能,但是這樣做對于自身來說是存在安全風險的。 另外,前面說過,CSRF大多數情況下來自第三方域名,但并不能排除本域發起。如果攻擊者有權限在本域發布評論(含鏈接、圖片等,統稱UGC),那么它可以直接在本域發起攻擊,這種情況下同源策略無法達到防護的作用。 綜上所述:同源驗證是一個相對簡單的防范方法,能夠防范絕大多數的CSRF攻擊。但這并不是萬無一失的,對于安全性要求較高,或者有較多用戶輸入內容的網站,我們就要對關鍵的接口做額外的防護措施。 3.2 CSRF TokenCSRF攻擊之所以能夠成功,是因為服務器誤把攻擊者發送的請求當成了用戶自己的請求。那么我們可以要求所有的用戶請求都攜帶一個CSRF攻擊者無法獲取到的Token。服務器通過校驗請求是否攜帶正確的Token,來把正常的請求和攻擊的請求區分開,也可以防范CSRF的攻擊。 CSRF Token 原理
我們需要知道的是:
3.3 雙重 Cookie 認證
3.4 Samesite Cookie 屬性Google起草了一份草案來改進HTTP協議,那就是為Set-Cookie響應頭新增Samesite屬性,它用來標明這個 Cookie是個“同站 Cookie”,同站Cookie只能作為第一方Cookie,不能作為第三方Cookie,Samesite 有兩個屬性值,Strict 為任何情況下都不可以作為第三方 Cookie ,Lax 為可以作為第三方 Cookie , 但必須是Get請求 參考: 3.5 其他方法驗證碼和密碼被認為是對抗CSRF攻擊最簡潔而有效的防御方法。 四、總結4.1 CSRF攻擊特點
CSRF通常是跨域的,因為外域通常更容易被攻擊者掌控。但是如果本域下有容易被利用的功能,比如可以發圖和鏈接的論壇和評論區,攻擊可以直接在本域下進行,而且這種攻擊更加危險。
4.2 與XSS的區別本質來說:
該文章在 2023/5/17 16:37:45 編輯過 |
關鍵字查詢
相關文章
正在查詢... |