CSRF的攻擊與防禦

出處:http://www.h3c.com.cn/About_H3C/Company_Publication/IP_Lh/2012/04/Home/Catalog/201208/751467_30008_0.htm

CSRF是Web應用程序的一種常見漏洞,其攻擊特性是危害性大但非常隱蔽,尤其是在大量Web 2.0技術的應用背景下,攻擊者完全可以在用戶毫無察覺的情況下發起CSRF攻擊。本文將對其基本特性、攻擊原理、攻擊分類、檢測方法及防範手段做一個系統的闡述,並列舉攻擊實例。

文/H3C攻防團隊

1      CSRF漏洞簡介

CSRF(Cross-Site Request Forgery,跨站點僞造請求)是一種網絡攻擊方式,該攻擊可以在受害者毫不知情的情況下以受害者名義僞造請求發送給受攻擊站點,從而在未授權的情況下執行在權限保護之下的操作,具有很大的危害性。具體來講,可以這樣理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發送郵件、發消息,盜取你的賬號,添加系統管理員,甚至於購買商品、虛擬貨幣轉賬等。

CSRF攻擊方式並不爲大家所熟知,實際上很多網站都存在CSRF的安全漏洞。早在2000年,CSRF這種攻擊方式已經由國外的安全人員提出,但在國內,直到2006年纔開始被關注。2008年,國內外多個大型社區和交互網站先後爆出CSRF漏洞,如:百度HI、NYTimes.com(紐約時報)、Metafilter(一個大型的BLOG網站)和YouTube等。但直到現在,互聯網上的許多站點仍對此毫無防備,以至於安全業界稱CSRF爲“沉睡的巨人”,其威脅程度由此“美譽”便可見一斑。

2      CSRF攻擊原理及實例

CSRF攻擊原理

CSRF攻擊原理比較簡單,如圖1所示。其中Web A爲存在CSRF漏洞的網站,Web B爲攻擊者構建的惡意網站,User C爲Web A網站的合法用戶。

圖1 CSRF攻擊原理

1. 用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;

2.在用戶信息通過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登錄網站A成功,可以正常發送請求到網站A;

3. 用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;

4. 網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;

5. 瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據用戶C的Cookie信息以C的權限處理該請求,導致來自網站B的惡意代碼被執行。

CSRF攻擊分類

CSRF漏洞一般分爲站外和站內兩種類型。

CSRF站外類型的漏洞本質上就是傳統意義上的外部提交數據問題。通常程序員會考慮給一些留言或者評論的表單加上水印以防止SPAM問題(這裏,SPAM可以簡單的理解爲垃圾留言、垃圾評論,或者是帶有站外鏈接的惡意回覆),但是有時爲了提高用戶的體驗性,可能沒有對一些操作做任何限制,所以攻擊者可以事先預測並設置請求的參數,在站外的Web頁面裏編寫腳本僞造文件請求,或者和自動提交的表單一起使用來實現GET、POST請求,當用戶在會話狀態下點擊鏈接訪問站外Web頁面,客戶端就被強迫發起請求。

CSRF站內類型的漏洞在一定程度上是由於程序員濫用$_REQUEST類變量造成的。在一些敏感的操作中(如修改密碼、添加用戶等),本來要求用戶從表單提交發起POST請求傳遞參數給程序,但是由於使用了$_REQUEST等變量,程序除支持接收POST請求傳遞的參數外也支持接收GET請求傳遞的參數,這樣就會爲攻擊者使用CSRF攻擊創造條件。一般攻擊者只要把預測的請求參數放在站內一個貼子或者留言的圖片鏈接裏,受害者瀏覽了這樣的頁面就會被強迫發起這些請求。

CSRF攻擊實例

下面以Axous 1.1.1 CSRF Add Admin Vulnerability(漏洞CVE編號:CVE-2012-2629)爲例,介紹CSRF攻擊具體實施過程。

Axous是一款網上商店應用軟件。Axous 1.1.1以及更低版本在實現上存在一個CSRF漏洞,遠程攻擊者可以通過構造特製的網頁,誘使該軟件管理員訪問,成功利用此漏洞的攻擊者可以添加系統管理員。利用此漏洞主要包含以下三個過程:

1. 攻擊者構造惡意網頁。在實施攻擊前,攻擊者需要構造一個與正常添加管理員用戶基本一樣的網頁,在該惡意網頁中對必要的參數項進行賦值,並將該網頁的action指向正常添加管理員用戶時訪問的URL,核心代碼如圖2所示;

2. 攻擊者利用社會工程學誘使Axous系統管理員訪問其構造的惡意網頁;

3. 執行惡意代碼。當系統管理員訪問惡意網頁時,惡意代碼在管理員不知情的情況下以系統管理員的合法權限被執行,攻擊者僞造的管理員賬戶添加成功。

圖2 CSRF攻擊添加管理員核心代碼

3      CSRF 漏洞檢測

檢測CSRF漏洞是一項比較繁瑣的工作,最簡單的方法就是抓取一個正常請求的數據包,去掉Referer字段後再重新提交,如果該提交還有效,那麼基本上可以確定存在CSRF漏洞。

隨着對CSRF漏洞研究的不斷深入,不斷涌現出一些專門針對CSRF漏洞進行檢測的工具,如CSRFTester,CSRF Request Builder等。

以CSRFTester工具爲例,CSRF漏洞檢測工具的測試原理如下:使用CSRFTester進行測試時,首先需要抓取我們在瀏覽器中訪問過的所有鏈接以及所有的表單等信息,然後通過在CSRFTester中修改相應的表單等信息,重新提交,這相當於一次僞造客戶端請求。如果修改後的測試請求成功被網站服務器接受,則說明存在CSRF漏洞,當然此款工具也可以被用來進行CSRF攻擊。

4    CSRF漏洞防禦

CSRF漏洞防禦主要可以從三個層面進行,即服務端的防禦、用戶端的防禦和安全設備的防禦。

4.1      服務端的防禦

目前業界服務器端防禦CSRF攻擊主要有三種策略:驗證HTTP Referer字段,在請求地址中添加token並驗證,在HTTP頭中自定義屬性並驗證。下面分別對這三種策略進行簡要介紹。

4.1.1        驗證HTTP Referer字段

根據HTTP協議,在HTTP頭中有一個字段叫Referer,它記錄了該HTTP請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。比如某銀行的轉賬是通過用戶訪問http://bank.test/test?page=10&userID=101&money=10000頁面完成,用戶必須先登錄bank. test,然後通過點擊頁面上的按鈕來觸發轉賬事件。當用戶提交請求時,該轉賬請求的Referer值就會是轉賬按鈕所在頁面的URL(本例中,通常是以bank. test域名開頭的地址)。而如果攻擊者要對銀行網站實施CSRF攻擊,他只能在自己的網站構造請求,當用戶通過攻擊者的網站發送請求到銀行時,該請求的Referer是指向攻擊者的網站。因此,要防禦CSRF攻擊,銀行網站只需要對於每一個轉賬請求驗證其Referer值,如果是以bank. test開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果Referer是其他網站的話,就有可能是CSRF攻擊,則拒絕該請求。

4.1.2        在請求地址中添加token並驗證

CSRF攻擊之所以能夠成功,是因爲攻擊者可以僞造用戶的請求,該請求中所有的用戶驗證信息都存在於Cookie中,因此攻擊者可以在不知道這些驗證信息的情況下直接利用用戶自己的Cookie來通過安全驗證。由此可知,抵禦CSRF攻擊的關鍵在於:在請求中放入攻擊者所不能僞造的信息,並且該信息不存在於Cookie之中。鑑於此,系統開發者可以在HTTP請求中以參數的形式加入一個隨機產生的token,並在服務器端建立一個攔截器來驗證這個token,如果請求中沒有token或者token內容不正確,則認爲可能是CSRF攻擊而拒絕該請求。

4.1.3        在HTTP頭中自定義屬性並驗證

自定義屬性的方法也是使用token並進行驗證,和前一種方法不同的是,這裏並不是把token以參數的形式置於HTTP請求之中,而是把它放到HTTP頭中自定義的屬性裏。通過XMLHttpRequest這個類,可以一次性給所有該類請求加上csrftoken這個HTTP頭屬性,並把token值放入其中。這樣解決了前一種方法在請求中加入token的不便,同時,通過這個類請求的地址不會被記錄到瀏覽器的地址欄,也不用擔心token會通過Referer泄露到其他網站。

4.2      用戶端的防禦

    對於普通用戶來說,都學習並具備網絡安全知識以防禦網絡攻擊是不現實的。但若用戶養成良好的上網習慣,則能夠很大程度上減少CSRF攻擊的危害。例如,用戶上網時,不要輕易點擊網絡論壇、聊天室、即時通訊工具或電子郵件中出現的鏈接或者圖片;及時退出長時間不使用的已登錄賬戶,尤其是系統管理員,應儘量在登出系統的情況下點擊未知鏈接和圖片。除此之外,用戶還需要在連接互聯網的計算機上安裝合適的安全防護軟件,並及時更新軟件廠商發佈的特徵庫,以保持安全軟件對最新攻擊的實時跟蹤。

4.3      安全設備的防禦

由於從漏洞的發現到補丁的發佈需要一定的時間,而且相當比例的廠商對漏洞反應不積極,再加之部分系統管理員對系統補丁的不夠重視,這些都給了攻擊者可乘之機。鑑於上述各種情況,用戶可以藉助第三方的專業安全設備加強對CSRF漏洞的防禦。

CSRF攻擊的本質是攻擊者僞造了合法的身份,對系統進行訪問。如果能夠識別出訪問者的僞造身份,也就能識別CSRF攻擊。研究發現,有些廠商的安全產品能基於硬件層面對HTTP頭部的Referer字段內容進行檢查來快速準確的識別CSRF攻擊。圖3展示了這種防禦方式的簡圖。目前H3C公司的IPS產品採用了特殊技術,支持對部分常用系統的CSRF漏洞攻擊進行檢測和阻斷。

圖3 安全設備傳統防禦方式

5    結束語

CSRF攻擊作爲一種存在已久的攻擊方式,在大量的商業網站上都可以找出。對廣大系統維護者來說需要深入理解CSRF攻擊,並制定最適合當前系統的防禦方案,在不損害應用程序性能的前提下,提高系統安全性;而對即將開發的網絡應用系統來說,深刻理解CSRF的危害性,在設計階段就考慮到對CSRF的防範將會取得事半功倍的效果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章