http://blog.csdn.net/jazywoo123/article/details/8168829
2012.11
你公司網絡上的Web應用程序是否容易遭受跨站請求偽造攻擊呢?這是一個值得討論的問題,因為一次成功的CSRF攻擊的后果往往是破壞性的,會花費公司的大量金錢,甚至導致機密信息丟失。
什么是CSRF(跨站請求偽造)?
CSRF攻擊通過使應用程序相信導致此活動的請求來自應用程序的一個可信用戶,從而誘使應用程序執(zhí)行一種活動(如轉移金融資產、改變賬戶口令等)。用戶可以是公司的一位雇員,企業(yè)合伙人,或者是一個外部的客戶。
CSRF攻擊依賴于這樣一個事實:許多Web應用程序使用cookie,其終結時間相對較長,從而使用戶在通過最初的驗證之后仍能訪問應用程序。
要使CSRF攻擊得逞,潛在的受害者必須使用其瀏覽器進行驗證,并登錄到公司的Web應用程序。只要用戶沒有退出應用程序,瀏覽器中的應用程序的cookie沒被終止,該用戶就是CSRF攻擊的一個潛在受害者。
CSRF攻擊如何運行?
為執(zhí)行CSRF攻擊,黑客需要把一個特別偽造的到達公司應用程序的鏈接放置到其它網頁上或放到電子郵件中。但黑客并不把此鏈接作為一個超級鏈接,而是將它放在一個圖像或腳本標簽中,從而隱藏鏈接,將鏈接作為圖像或腳本的源。
下面是一個來自維基百科的例子:
img src="http://bank.example.com/withdraw?account=bob&amount=100000&for=mallory"
現在,如果受害者在其瀏覽器中查看包含此圖像的網頁,或讀取包含此鏈接的電子郵件程序,瀏覽器會跟蹤鏈接,試圖獲取圖片。如果受害者近來登錄過此站點,其瀏覽器會提供一個用于驗證的cookie,告訴瀏覽器將10萬美元從“bob”的賬戶轉移給“mallory”。一般而言,受害人不會知道執(zhí)行了什么業(yè)務(至少在檢查其賬戶余額之前),因為受害人的瀏覽器在執(zhí)行業(yè)務時并不從bank.example.com那里顯示任何反饋(如一個確認網頁)。
在上面的例子中,該鏈接專門針對bob,限制其實用性。在實踐中,黑客有可能使用一個更為通用的鏈接,可適用于碰巧登錄到企業(yè)Web應用程序的任何潛在受害者。但對黑客來說,偽造一次成功的CSRF攻擊并不容易,因為在攻擊過程中,黑客并不能從Web應用程序獲得任何反饋。這意味著,只有從你的Web應用程序發(fā)出的響應完全可預測時,這種攻擊才可能發(fā)生。
所以說,一個易于遭受攻擊的Web應用程序必須:
1、 準許用戶用一個合法的cookie進行訪問,其到期時間必須足夠長。
2、 在提交適當的URL(可從外部站點發(fā)送)時,準許執(zhí)行交易。
3、 以一種可預測的方法進行響應。
CSRF攻擊可以達到什么目標?
雖然CSRF攻擊僅能在Web應用程序中執(zhí)行業(yè)務,其后果卻可能蔓延很廣。例如,這會導致受害人在不知情的情況下向論壇發(fā)帖子、訂閱郵件列表、網購或股票交易,或變更用戶名或口令。對受到受害人防火墻保護的所有應用程序而言,CSRF攻擊都能發(fā)揮作用。如果受害者的機器位于受限的某個IP范圍,就會使得黑客訪問此范圍內的相關應用程序。
還有一種CSRF變種,稱為登錄CSRF,它能夠使用攻擊者的登錄憑證記錄受害人在Web應用程序中的活動。這將使黑客以后可以登錄進入并檢索關于受害人的信息,如用戶活動歷史,或由受害者所提交的任何機密信息。
五大方法減輕Web應用程序易受CSRF攻擊的風險
限制驗證cookie的到期時間。這些cookie的合法時間越短,黑客利用你的Web應用程序的機會就越小。不過,這個時間越短,用戶就越不方便。因此,你需要在安全性和方便性之間進行平衡。
執(zhí)行重要業(yè)務之前,要求用戶提交額外的信息。要求用戶在進行重要業(yè)務前輸入口令,這可以防止黑客發(fā)動CSRF攻擊(只要瀏覽器中沒有包含口令),因為這種重要信息無法預測或輕易獲得。
使用秘密的無法預測的驗證符號。當保存在用戶瀏覽器中的cookie僅由一次會話確認時,CSRF攻擊才會有效。所以在每次HTTP請求(當然攻擊者無法提前知道)中都有附加的特定會話的信息,這樣就可以挫敗CSRF攻擊。不過,如果這種應用程序存在跨站腳本漏洞,黑客就有可能訪問這種驗證符號。
使用定制的HTTP報頭。如果執(zhí)行交易的所有請求都使用XMLHttpRequest并附加一個定制的HTTP報頭,同時拒絕缺少定制報頭的任何請求,就可以用XMLHttpRequest API來防御CSRF攻擊。由于瀏覽器通常僅準許站點將定制的HTTP報頭發(fā)送給相同站點,從而了防止由CSRF攻擊的源站點所發(fā)起的交易。
檢查訪問源的報頭。在瀏覽者發(fā)送HTTP請求時,它通常會包含源自訪問源報頭的URL。理論上講,你可以使用這些信息來阻止源自其它任何站點(而不是來自Web應用程序自身)的請求。不過,訪問源報頭并不總是可用的,(例如,有些單位由于私密性的緣故而將它剝離了),或者這個報頭容易被欺騙,所以說,這條措施并不真正有效。