常見的Web攻擊手段——CSRF攻擊

1、什麼是CSRF攻擊?

跨站請求僞造(Cross-Site Request Forgery, CSRF),惡意網站經過腳本向當前用戶瀏覽器打開的其它頁面的 URL 發起惡意請求,因爲同一瀏覽器進程下 Cookie 可見性,致使用戶身份被盜用,完成惡意網站腳本中指定的操做。html

儘管聽起來跟XSS跨站腳本攻擊有點類似,但事實上CSRF與XSS差異很大,XSS利用的是站點內的信任用戶,而CSRF則是經過假裝來自受信任用戶的請求來利用受信任的網站。瀏覽器

你能夠這麼理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義向第三方網站發送惡意請求。 CRSF能作的事情包括利用你的身份發郵件、發短信、進行交易轉帳等,甚至盜取你的帳號。安全

2、CSRF攻擊原理

CSRF的攻擊原理以下圖所示。服務器

  1. 首先用戶C瀏覽並登陸了受信任站點A;
  2. 登陸信息驗證經過之後,站點A會在返回給瀏覽器的信息中帶上已登陸的cookie,cookie信息會在瀏覽器端保存必定時間(根據服務端設置而定);
  3. 完成這一步之後,用戶在沒有登出(清除站點A的cookie)站點A的狀況下,訪問惡意站點B;
  4. 這時惡意站點 B的某個頁面向站點A發起請求,而這個請求會帶上瀏覽器端所保存的站點A的cookie;
  5. 站點A根據請求所帶的cookie,判斷此請求爲用戶C所發送的。

所以,站點A會報據用戶C的權限來處理惡意站點B所發起的請求,而這個請求可能以用戶C的身份發送 郵件、短信、消息,以及進行轉帳支付等操做,這樣惡意站點B就達到了僞造用戶C請求站點 A的目的。cookie

受害者只須要作下面兩件事情,攻擊者就可以完成CSRF攻擊:架構

  • 登陸受信任站點 A,並在本地生成cookie;
  • 在不登出站點A(清除站點A的cookie)的狀況下,訪問惡意站點B。

不少狀況下所謂的惡意站點,頗有多是一個存在其餘漏洞(如XSS)的受信任且被不少人訪問的站點,這樣,普通用戶可能在不知不覺中便成爲了受害者。分佈式

3、CSRF防護

1. 儘可能使用POST,限制GET網站

GET接口太容易被拿來作CSRF攻擊,看第一個示例就知道,只要構造一個img標籤,而img標籤又是不能過濾的數據。接口最好限制爲POST使用,GET則無效,下降攻擊風險。spa

固然POST並非萬無一失,攻擊者只要構造一個form就能夠,但須要在第三方頁面作,這樣就增長暴露的可能性。架構設計

2. 瀏覽器Cookie策略

IE六、七、八、Safari會默認攔截第三方本地Cookie(Third-party Cookie)的發送。可是Firefox二、三、Opera、Chrome、Android等不會攔截,因此經過瀏覽器Cookie策略來防護CSRF攻擊不靠譜,只能說是下降了風險。

PS:Cookie分爲兩種,Session Cookie(在瀏覽器關閉後,就會失效,保存到內存裏),Third-party Cookie(即只有到了Exprie時間後纔會失效的Cookie,這種Cookie會保存到本地)。

PS:另外若是網站返回HTTP頭包含P3P Header,那麼將容許瀏覽器發送第三方Cookie。

3. 加驗證碼

驗證碼,強制用戶必須與應用進行交互,才能完成最終請求。在一般狀況下,驗證碼能很好遏制CSRF攻擊。可是出於用戶體驗考慮,網站不能給全部的操做都加上驗證碼。所以驗證碼只能做爲一種輔助手段,不能做爲主要解決方案。

4. Referer Check

Referer Check在Web最多見的應用就是「防止圖片盜鏈」。同理,Referer Check也能夠被用於檢查請求是否來自合法的「源」(Referer值是不是指定頁面,或者網站的域),若是都不是,那麼就很可能是CSRF攻擊。

可是由於服務器並非何時都能取到Referer,因此也沒法做爲CSRF防護的主要手段。可是用Referer Check來監控CSRF攻擊的發生,卻是一種可行的方法。

5. Anti CSRF Token

如今業界對CSRF的防護,一致的作法是使用一個Token(Anti CSRF Token)。

例子:

1. 用戶訪問某個表單頁面。

2. 服務端生成一個Token,放在用戶的Session中,或者瀏覽器的Cookie中。

3. 在頁面表單附帶上Token參數。

4. 用戶提交請求後, 服務端驗證表單中的Token是否與用戶Session(或Cookies)中的Token一致,一致爲合法請求,不是則非法請求。

這個Token的值必須是隨機的,不可預測的。因爲Token的存在,攻擊者沒法再構造一個帶有合法Token的請求實施CSRF攻擊。另外使用Token時應注意Token的保密性,儘可能把敏感操做由GET改成POST,以form或AJAX形式提交,避免Token泄露。

注意:

CSRF的Token僅僅用於對抗CSRF攻擊。當網站同時存在XSS漏洞時候,那這個方案也是空談。因此XSS帶來的問題,應該使用XSS的防護方案予以解決。

參考

文章《Web安全之CSRF攻擊

書籍《大型分佈式網站架構設計與實踐》

相關文章
相關標籤/搜索