CSRF攻擊與防御

轉(zhuǎn)載地址:http://www.phpddt.com/reprint/csrf.html

CSRF概念:CSRF跨站點請求偽造(Cross—Site Request Forgery)早敬,跟XSS攻擊一樣忌傻,存在巨大的危害性,你可以這樣來理解:
攻擊者盜用了你的身份搞监,以你的名義發(fā)送惡意請求水孩,對服務(wù)器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作琐驴,比如以你的名義發(fā)送郵件俘种、發(fā)消息,盜取你的賬號绝淡,添加系統(tǒng)管理員宙刘,甚至于購買商品、虛擬貨幣轉(zhuǎn)賬等牢酵。 如下:其中Web A為存在CSRF漏洞的網(wǎng)站悬包,Web B為攻擊者構(gòu)建的惡意網(wǎng)站,User C為Web A網(wǎng)站的合法用戶馍乙。

CSRF攻擊攻擊原理及過程如下:

1. 用戶C打開瀏覽器布近,訪問受信任網(wǎng)站A垫释,輸入用戶名和密碼請求登錄網(wǎng)站A;

2.在用戶信息通過驗證后吊输,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器饶号,此時用戶登錄網(wǎng)站A成功铁追,可以正常發(fā)送請求到網(wǎng)站A季蚂;

3. 用戶未退出網(wǎng)站A之前,在同一瀏覽器中琅束,打開一個TAB頁訪問網(wǎng)站B扭屁;

4. 網(wǎng)站B接收到用戶請求后,返回一些攻擊性代碼涩禀,并發(fā)出一個請求要求訪問第三方站點A料滥;

5. 瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請求艾船,在用戶不知情的情況下攜帶Cookie信息葵腹,向網(wǎng)站A發(fā)出請求。
網(wǎng)站A并不知道該請求其實是由B發(fā)起的屿岂,所以會根據(jù)用戶C的Cookie信息以C的權(quán)限處理該請求践宴,導(dǎo)致來自網(wǎng)站B的惡意代碼被執(zhí)行。 

CSRF攻擊實例!

  • 受害者 Bob 在銀行有一筆存款爷怀,通過對銀行的網(wǎng)站發(fā)送請求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款轉(zhuǎn)到 bob2 的賬號下阻肩。通常情況下,該請求發(fā)送到網(wǎng)站后运授,服務(wù)器會先驗證該請求是否來自一個合法的 session烤惊,并且該 session 的用戶 Bob 已經(jīng)成功登陸。

  • 黑客 Mallory 自己在該銀行也有賬戶吁朦,他知道上文中的 URL 可以把錢進行轉(zhuǎn)帳操作柒室。Mallory 可以自己發(fā)送一個請求給銀行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是這個請求來自 Mallory 而非 Bob逗宜,他不能通過安全認證伦泥,因此該請求不會起作用。

  • 這時锦溪,Mallory 想到使用 CSRF 的攻擊方式不脯,他先自己做一個網(wǎng)站,在網(wǎng)站中放入如下代碼: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”刻诊,并且通過廣告等誘使 Bob 來訪問他的網(wǎng)站防楷。當 Bob 訪問該網(wǎng)站時,上述 url 就會從 Bob 的瀏覽器發(fā)向銀行则涯,而這個請求會附帶 Bob 瀏覽器中的 cookie 一起發(fā)向銀行服務(wù)器复局。大多數(shù)情況下冲簿,該請求會失敗,因為他要求 Bob 的認證信息亿昏。但是峦剔,如果 Bob 當時恰巧剛訪問他的銀行后不久,他的瀏覽器與銀行網(wǎng)站之間的 session 尚未過期角钩,瀏覽器的 cookie 之中含有 Bob 的認證信息吝沫。這時,悲劇發(fā)生了递礼,這個 url 請求就會得到響應(yīng)惨险,錢將從 Bob 的賬號轉(zhuǎn)移到 Mallory 的賬號,而 Bob 當時毫不知情脊髓。等以后 Bob 發(fā)現(xiàn)賬戶錢少了辫愉,即使他去銀行查詢?nèi)罩荆仓荒馨l(fā)現(xiàn)確實有一個來自于他本人的合法請求轉(zhuǎn)移了資金将硝,沒有任何被攻擊的痕跡恭朗。而 Mallory 則可以拿到錢后逍遙法外。

CSRF漏洞檢測:

  • 檢測CSRF漏洞是一項比較繁瑣的工作依疼,最簡單的方法就是抓取一個正常請求的數(shù)據(jù)包痰腮,去掉Referer字段后再重新提交,如果該提交還有效涛贯,那么基本上可以確定存在CSRF漏洞诽嘉。

  • 隨著對CSRF漏洞研究的不斷深入,不斷涌現(xiàn)出一些專門針對CSRF漏洞進行檢測的工具弟翘,如CSRFTester虫腋,CSRF Request Builder等。

  • 以CSRFTester工具為例稀余,CSRF漏洞檢測工具的測試原理如下:使用CSRFTester進行測試時悦冀,首先需要抓取我們在瀏覽器中訪問過的所有鏈接以及所有的表單等信息,然后通過在CSRFTester中修改相應(yīng)的表單等信息睛琳,重新提交盒蟆,這相當于一次偽造客戶端請求。如果修改后的測試請求成功被網(wǎng)站服務(wù)器接受师骗,則說明存在CSRF漏洞历等,當然此款工具也可以被用來進行CSRF攻擊。

防御CSRF攻擊:

  • 目前防御 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 字段辟癌;在請求地址中添加 token 并驗證寒屯;在 HTTP 頭中自定義屬性并驗證。

(1)驗證 HTTP Referer 字段

  • 根據(jù) HTTP 協(xié)議,在 HTTP 頭中有一個字段叫 Referer寡夹,它記錄了該 HTTP 請求的來源地址处面。在通常情況下,訪問一個安全受限頁面的請求來自于同一個網(wǎng)站菩掏,比如需要訪問 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory魂角,用戶必須先登陸 bank.example,然后通過點擊頁面上的按鈕來觸發(fā)轉(zhuǎn)賬事件智绸。這時野揪,該轉(zhuǎn)帳請求的 Referer 值就會是轉(zhuǎn)賬按鈕所在的頁面的 URL,通常是以 bank.example 域名開頭的地址传于。而如果黑客要對銀行網(wǎng)站實施 CSRF 攻擊囱挑,他只能在他自己的網(wǎng)站構(gòu)造請求醉顽,當用戶通過黑客的網(wǎng)站發(fā)送請求到銀行時沼溜,該請求的 Referer 是指向黑客自己的網(wǎng)站。因此游添,要防御 CSRF 攻擊系草,銀行網(wǎng)站只需要對于每一個轉(zhuǎn)賬請求驗證其 Referer 值,如果是以 bank.example 開頭的域名唆涝,則說明該請求是來自銀行網(wǎng)站自己的請求找都,是合法的。如果 Referer 是其他網(wǎng)站的話廊酣,則有可能是黑客的 CSRF 攻擊能耻,拒絕該請求。

  • 這種方法的顯而易見的好處就是簡單易行亡驰,網(wǎng)站的普通開發(fā)人員不需要操心 CSRF 的漏洞晓猛,只需要在最后給所有安全敏感的請求統(tǒng)一增加一個攔截器來檢查 Referer 的值就可以。特別是對于當前現(xiàn)有的系統(tǒng)凡辱,不需要改變當前系統(tǒng)的任何已有代碼和邏輯戒职,沒有風(fēng)險,非常便捷透乾。

  • 然而洪燥,這種方法并非萬無一失。Referer 的值是由瀏覽器提供的乳乌,雖然 HTTP 協(xié)議上有明確的要求捧韵,但是每個瀏覽器對于 Referer 的具體實現(xiàn)可能有差別,并不能保證瀏覽器自身沒有安全漏洞汉操。使用驗證 Referer 值的方法再来,就是把安全性都依賴于第三方(即瀏覽器)來保障,從理論上來講客情,這樣并不安全其弊。事實上癞己,對于某些瀏覽器,比如 IE6 或 FF2梭伐,目前已經(jīng)有一些方法可以篡改 Referer 值痹雅。如果 bank.example 網(wǎng)站支持 IE6 瀏覽器,黑客完全可以把用戶瀏覽器的 Referer 值設(shè)為以 bank.example 域名開頭的地址糊识,這樣就可以通過驗證绩社,從而進行 CSRF 攻擊。

  • 即便是使用最新的瀏覽器赂苗,黑客無法篡改 Referer 值愉耙,這種方法仍然有問題。因為 Referer 值會記錄下用戶的訪問來源拌滋,有些用戶認為這樣會侵犯到他們自己的隱私權(quán)朴沿,特別是有些組織擔心 Referer 值會把組織內(nèi)網(wǎng)中的某些信息泄露到外網(wǎng)中。因此败砂,用戶自己可以設(shè)置瀏覽器使其在發(fā)送請求時不再提供 Referer赌渣。當他們正常訪問銀行網(wǎng)站時,網(wǎng)站會因為請求沒有 Referer 值而認為是 CSRF 攻擊昌犹,拒絕合法用戶的訪問坚芜。

(2)在請求地址中添加 token 并驗證

  • CSRF 攻擊之所以能夠成功,是因為黑客可以完全偽造用戶的請求斜姥,該請求中所有的用戶驗證信息都是存在于 cookie 中鸿竖,因此黑客可以在不知道這些驗證信息的情況下直接利用用戶自己的 cookie 來通過安全驗證。要抵御 CSRF铸敏,關(guān)鍵在于在請求中放入黑客所不能偽造的信息缚忧,并且該信息不存在于 cookie 之中「惆樱可以在 HTTP 請求中以參數(shù)的形式加入一個隨機產(chǎn)生的 token搔谴,并在服務(wù)器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內(nèi)容不正確桩撮,則認為可能是 CSRF 攻擊而拒絕該請求敦第。

  • 這種方法要比檢查 Referer 要安全一些,token 可以在用戶登陸后產(chǎn)生并放于 session 之中店量,然后在每次請求時把 token 從 session 中拿出芜果,與請求中的 token 進行比對,但這種方法的難點在于如何把 token 以參數(shù)的形式加入請求融师。對于 GET 請求右钾,token 將附在請求地址之后,這樣 URL 就變成 http://url?csrftoken=tokenvalue。 而對于 POST 請求來說舀射,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>窘茁,這樣就把 token 以參數(shù)的形式加入請求了。但是脆烟,在一個網(wǎng)站中山林,可以接受請求的地方非常多,要對于每一個請求都加上 token 是很麻煩的邢羔,并且很容易漏掉驼抹,通常使用的方法就是在每次頁面加載時,使用 javascript 遍歷整個 dom 樹拜鹤,對于 dom 中所有的 a 和 form 標簽后加入 token框冀。這樣可以解決大部分的請求,但是對于在頁面加載之后動態(tài)生成的 html 代碼敏簿,這種方法就沒有作用明也,還需要程序員在編碼時手動添加 token。

  • 該方法還有一個缺點是難以保證 token 本身的安全极谊。特別是在一些論壇之類支持用戶自己發(fā)表內(nèi)容的網(wǎng)站诡右,黑客可以在上面發(fā)布自己個人網(wǎng)站的地址安岂。由于系統(tǒng)也會在這個地址后面加上 token轻猖,黑客可以在自己的網(wǎng)站上得到這個 token,并馬上就可以發(fā)動 CSRF 攻擊域那。為了避免這一點咙边,系統(tǒng)可以在添加 token 的時候增加一個判斷,如果這個鏈接是鏈到自己本站的次员,就在后面添加 token败许,如果是通向外網(wǎng)則不加。不過淑蔚,即使這個 csrftoken 不以參數(shù)的形式附加在請求之中市殷,黑客的網(wǎng)站也同樣可以通過 Referer 來得到這個 token 值以發(fā)動 CSRF 攻擊。這也是一些用戶喜歡手動關(guān)閉瀏覽器 Referer 功能的原因刹衫。

(3)在 HTTP 頭中自定義屬性并驗證

  • 這種方法也是使用 token 并進行驗證醋寝,和上一種方法不同的是,這里并不是把 token 以參數(shù)的形式置于 HTTP 請求之中带迟,而是把它放到 HTTP 頭中自定義的屬性里音羞。通過 XMLHttpRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性仓犬,并把 token 值放入其中嗅绰。這樣解決了上種方法在請求中加入 token 的不便,同時,通過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄窘面,也不用擔心 token 會透過 Referer 泄露到其他網(wǎng)站中去翠语。

  • 然而這種方法的局限性非常大。XMLHttpRequest 請求通常用于 Ajax 方法中對于頁面局部的異步刷新财边,并非所有的請求都適合用這個類來發(fā)起啡专,而且通過該類請求得到的頁面不能被瀏覽器所記錄下,從而進行前進制圈,后退们童,刷新,收藏等操作鲸鹦,給用戶帶來不便慧库。另外,對于沒有進行 CSRF 防護的遺留系統(tǒng)來說馋嗜,要采用這種方法來進行防護齐板,要把所有請求都改為 XMLHttpRequest 請求,這樣幾乎是要重寫整個網(wǎng)站葛菇,這代價無疑是不能接受的甘磨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眯停,隨后出現(xiàn)的幾起案子济舆,更是在濱河造成了極大的恐慌,老刑警劉巖莺债,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滋觉,死亡現(xiàn)場離奇詭異,居然都是意外死亡齐邦,警方通過查閱死者的電腦和手機椎侠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來措拇,“玉大人我纪,你說我怎么就攤上這事∝は牛” “怎么了浅悉?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汰蜘。 經(jīng)常有香客問我仇冯,道長,這世上最難降的妖魔是什么族操? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任苛坚,我火速辦了婚禮比被,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泼舱。我一直安慰自己等缀,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布娇昙。 她就那樣靜靜地躺著尺迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冒掌。 梳的紋絲不亂的頭發(fā)上噪裕,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音股毫,去河邊找鬼膳音。 笑死,一個胖子當著我的面吹牛铃诬,可吹牛的內(nèi)容都是我干的祭陷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趣席,長吁一口氣:“原來是場噩夢啊……” “哼兵志!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宣肚,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤想罕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钉寝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧呐,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年嵌纲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥沽。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逮走,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出今阳,到底是詐尸還是另有隱情师溅,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布盾舌,位于F島的核電站墓臭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妖谴。R本人自食惡果不足惜窿锉,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一酌摇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗡载,春花似錦采郎、人聲如沸镐作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火俄。三九已至,卻和暖如春伍玖,著一層夾襖步出監(jiān)牢的瞬間悴务,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工铲掐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吧秕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓迹炼,卻偏偏與公主長得像砸彬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斯入,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載地址:http://www.phpddt.com/reprint/csrf.htmlCSRF概念:CSRF跨站...
    matianhe閱讀 982評論 0 104
  • CSRF是什么砂碉? (Cross Site Request Forgery, 跨站域請求偽造)是一種網(wǎng)絡(luò)的攻擊方式,...
    謝澤閱讀 3,230評論 0 8
  • CSRF概念:CSRF跨站點請求偽造(Cross—Site Request Forgery)刻两,跟XSS攻擊一樣增蹭,存...
    raincoco閱讀 831評論 0 1
  • CSRF 攻擊的應(yīng)對之道web安全之token和CSRF攻擊CSRF Token 的設(shè)計是否有其必要性? CSRF...
    拾壹北閱讀 409評論 0 1
  • http://www.91ri.org/tag/fuzz-bug 通常情況下磅摹,有三種方法被廣泛用來防御CSRF攻擊...
    jdyzm閱讀 4,173評論 0 5