網(wǎng)絡(luò)安全攻防:Web安全之CSRF
CSRF(Cross-Site Request Forgery)跨站請求偽造攻擊。CSRF 是偽造請求,冒充用戶在站內(nèi)的正常操作。我們知道,絕大多數(shù)網(wǎng)站是通過Cookie等方式辨識用戶身份(包括使用服務(wù)器端Session的網(wǎng)站,因?yàn)镾ession ID也是大多保存在Cookie里面的),再予以授權(quán)的。所以,要偽造用戶的正常操作,最好的方法是通過XSS或鏈接欺騙等途徑,讓用戶在本機(jī)(即擁有身份Cookie的瀏覽器端)發(fā)起用戶所不知道的請求。
CSRF這種攻擊方式在2000年已經(jīng)被國外的安全人員提出,但在國內(nèi),直到2006年才開始被關(guān)注,2008年,國內(nèi)外的多個(gè)大型社區(qū)和交互網(wǎng)站分別爆出 CSRF 漏洞,如NYTimes.com(紐約時(shí)報(bào))、Metafilter(一個(gè)大型的博客網(wǎng)站)、Youtube和百度HI。
1. 分類
CSRF漏洞的攻擊一般分為站內(nèi)和站外2種類型。
CSRF站內(nèi)類型的漏洞在一定程度上是由于程序員濫用$_REQUEST類變量造成的,一些敏感的操作本來是要求用戶從表單提交發(fā)起 POST 請求傳參給程序,但是由于使用了$_REQUEST等變量,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創(chuàng)造了條件,一般攻擊者只要把預(yù)測好的請求參數(shù)放在站內(nèi)一個(gè)帖子或留言的圖片鏈接里,受害者瀏覽了這樣的頁面就會被強(qiáng)迫發(fā)起請求。
CSRF 站外類型的漏洞其實(shí)就是傳統(tǒng)意義上的外部提交數(shù)據(jù)問題,一般程序員會考慮給一些留言評論等的表單加上水印以防止SPAM問題,但是為了用戶的體驗(yàn)性,一些操作可能沒有做任何限制,所以攻擊者可以先預(yù)測好請求的參數(shù),在站外的Web頁面里編寫Javascript腳本偽造文件請求或和自動提交的表單來實(shí)現(xiàn)GET、POST請求,用戶在會話狀態(tài)下單擊鏈接訪問站外的Web頁面,客戶端就被強(qiáng)迫發(fā)起請求。
2. 原理
CSRF的原理如圖1所示。
圖1 CSRF原理
這就相當(dāng)于受害者需要在登錄A網(wǎng)站之后,再去訪問B網(wǎng)站,而B網(wǎng)站往往就是一些釣魚網(wǎng)站或詐騙網(wǎng)站。
3. 攻擊場景
可以用一個(gè)例子來說明CSRF的攻擊在生活中的應(yīng)用。
如果銀行A允許以GET請求的形式來轉(zhuǎn)賬,這里大多指的不是實(shí)際生活中的,因?yàn)閷?shí)際生活中銀行不可能只用GET請求轉(zhuǎn)賬。