Web安全之CSRF攻擊的防禦措施

2021-09-19 16:37:45 字數 2748 閱讀 7813

cross site request forgery,中文是:跨站點請求偽造。

csrf攻擊者在使用者已經登入目標**之後,誘使使用者訪問乙個攻擊頁面,利用目標**對使用者的信任,以使用者身份在攻擊頁面對目標**發起偽造使用者操作的請求,達到攻擊目的。

舉個例子

簡單版:

假如有個加關注的get介面,bloguserguid引數很明顯是關注人id,如下:

那我只需要在我的一篇博文內容裡面寫乙個img標籤:

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

公升級版:

假如還是有個加關注的介面,不過已經限制了只獲取post請求的資料。這個時候就做乙個第三方的頁面,但裡面包含form提交**,然後通過qq、郵箱等社交工具傳播,**使用者去開啟,那開啟過的使用者就中招了。

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

這樣是用問題的,由於同源策略的原因,iframe內容根本載入不出來,所以裡面form提交當然不會執行。

ps:我嘗試了chrome、ie11、firefox,情況都是這樣。

所以可以用嵌多一層頁面方式解決,如下:

第乙個展示頁面(test):

第二個隱藏頁面(test2):

csrf get

這樣就可以解決了,有人會問為什麼要加多一層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策略

ie6、7、8、safari會預設攔截第三方本地cookie(third-party cookie)的傳送。但是firefox2、3、opera、chrome、android等不會攔截,所以通過瀏覽器cookie策略來防禦csrf攻擊不靠譜,只能說是降低了風險。

ps:cookie分為兩種,session cookie(在瀏覽器關閉後,就會失效,儲存到記憶體裡),third-party cookie(即只有到了exprie時間後才會失效的cookie,這種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安全》

Web安全之CSRF攻擊

csrf是什麼?csrf cross site request forgery 中文是跨站點請求偽造。csrf攻擊者在使用者已經登入目標 之後,誘使使用者訪問乙個攻擊頁面,利用目標 對使用者的信任,以使用者身份在攻擊頁面對目標 發起偽造使用者操作的請求,達到攻擊目的。舉個例子 簡單版 假如有個加關注...

Web安全之CSRF攻擊

源文位址 csrf是什麼?csrf cross site request forgery 中文是跨站點請求偽造。csrf攻擊者在使用者已經登入目標 之後,誘使使用者訪問乙個攻擊頁面,利用目標 對使用者的信任,以使用者身份在攻擊頁面對目標 發起偽造使用者操作的請求,達到攻擊目的。舉個例子 簡單版 假如...

Web安全之CSRF攻擊

跨站點請求偽造 cross site request forgery 攻擊者盜用合法使用者的身份,傳送惡意請求到伺服器,然而對伺服器來說,請求是完全合法的,於是伺服器在完全不知情的情況下完成了攻擊者所期望的操作。首先使用者瀏覽並登入了受信任站點a,通過站點a驗證後,授權資料儲存在站點a產生的cook...