引言:CSRF是一種網絡攻擊方式,該攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在未授權的情況下執行在權限保護之下的操作,具有很大的危害性。深刻理解CSRF的危害性,對CSRF的防范將會取得事半功倍的效果。
CSR F(Cross-siterequest forgery),中文名稱為跨站請求偽造,也被稱為CSRF/XSRF。
CSRF是一種網絡攻擊方式,該攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在未授權的情況下執行在權限保護之下的操作,具有很大的危害性。
可以這樣理解CSRF:攻擊者盜用了用戶的身份,以用戶的名義發送惡意請求,對服務器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以用戶的名義發送郵件、發消息,盜取用戶的賬號,添加系統管理員等。
用戶如有以下行為,將可能受到攻擊:登錄受信任網站A,并在本地生成Cookie;在不登出A的情況下,訪問危險網站B。
但除此之外,依舊不能保證以下情況不會發生:
1.不能保證登錄了一個網站后,不再打開一個Tab頁面并訪問另外的網站。
2.不能保證關閉瀏覽器后,用戶本地的Cookie立刻過期,上次的會話已經結束。(事實上關閉瀏覽器不能結束一個會話)。
3.有些網站可能是一個存在其他漏洞的可信任的經常被人訪問的網站。
CSRF漏洞一般分為站外和站內兩種類型。CSRF站外類型的漏洞本質上就是傳統意義上的外部提交數據問題。通常程序員會考慮給一些留言或者評論的表單加上水印以防止SPAM問題,但是有時為了提高用戶的體驗性,可能沒有對一些操作做任何限制,所以攻擊者可以事先預測并設置請求的參數,在站外的Web頁面里編寫腳本偽造文件請求,或者和自動提交的表單一起使用來實現GET、POST請求,當用戶在會話狀態下點擊鏈接訪問站外Web頁面,客戶端就被強迫發起請求。
CSRF站內類型的漏洞在一定程度上是由于程序員濫用$_REQUEST類變量造成的。在一些敏感的操作中(如修改密碼、添加用戶等),本來要求用戶從表單提交發起POST請求傳遞參數給程序,但是由于使用了$_REQUEST等變量,程序除支持接收POST請求傳遞的參數外也支持接收GET請求傳遞的參數,這樣就會為攻擊者使用CSRF攻擊創造條件。一般如果把預測的請求參數放在站內或者留言的圖片鏈接中,用戶瀏覽了這樣的頁面就會被強迫發起這些請求。
CSRF攻擊是源于Web的隱式身份驗證機制。Web的身份驗證機制雖然可以保證一個請求是來自于某個用戶的瀏覽器,但卻無法保證該請求是用戶批準發送的。
先抓取一個正常請求的數據包,然后去掉referer字段再重新提交,如果還是有效那基本上就存在問題了。當然參數可能含有不能預測的參數(如userid之類),這個時候就看這個不可預測的參數能不能通過其他手段比如Flash拿到,如果能,則還是存在問題。還有就是試著改post為get,因為有些程序是不區分get/post的。
可以用一些專門針對CSRF漏洞進行檢測的工具,如 CSRFTester,CSRF Request Builder等。
CSRF的防御可以從服務端和客戶端兩方面著手,防御效果是從服務端著手效果比較好,現在一般的CSRF防御也都在服務端進行。
1.服務端進行CSRF防御
服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加偽隨機數。
Cookie Hashing(所有表單都包含同一個偽隨機值):這可能是最簡單的解決方案了,因為攻擊者不能獲得第三方的Cookie(理論上),所以表單中的數據也就構造失敗了。這個方法已經可以杜絕99%的CSRF攻擊了,還有1%由于用戶的Cookie很容易由于網站的XSS漏洞而被盜取,但是一般的攻擊者看到有需要算Hash值,基本都會放棄,某些除外,所以如果需要100%的杜絕,這個不是最好的方法。
驗證碼:這個方案的思路是:每次的用戶提交都需要用戶在表單中填寫一個圖片上的隨機字符串。這個方案可以完全解決CSRF,但個人覺得在易用性方面似乎不是太好,還有是驗證碼圖片的使用涉及了一個被稱為MHTML的Bug,可能在某些版本的微軟IE中受影響。
One-Time Tokens(不同的表單包含一個不同的偽隨機值):在實現One-Time Tokens時,需要注意一點:就是“并行會話的兼容”。如果用戶在一個站點上同時打開了兩個不同的表單,CSRF保護措施不應該影響到他對任何表單的提交。考慮一下如果每次表單被裝入時站點生成一個偽隨機值來覆蓋以前的偽隨機值將會發生什么情況:用戶只能成功地提交他最后打開的表單,因為所有其他的表單都含有非法的偽隨機值。必須小心操作以確保CSRF保護措施不會影響選項卡式的瀏覽或者利用多個瀏覽器窗口瀏覽一個站點。
CSRF攻擊作為一種存在已久的攻擊方式,在大量的商業網站上都可以找出。對廣大系統維護者來說需要深入理解CSRF攻擊,并制定最適合當前系統的防御方案,在不損害應用程序性能的前提下提高系統安全性,而對即將開發的網絡應用系統來說,深刻理解CSRF的危害性,在設計階段就考慮到對CSRF的防范將會取得事半功倍的效果。