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