什么是CSRF?
跨站請求偽造(Cross-site request forgery)未桥,也被稱為 one-click attack 或者 session riding,通辰姹福縮寫為 CSRF 或者 XSRF冬耿, 是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。跟跨網(wǎng)站腳本(XSS)相比萌壳,XSS利用的是用戶對指定網(wǎng)站的信任亦镶,CSRF 利用的是網(wǎng)站對用戶網(wǎng)頁瀏覽器的信任。
關(guān)于CSRF 攻擊的簡單解釋
跨站請求攻擊袱瓮,簡單地說缤骨,是攻擊者通過一些技術(shù)手段欺騙用戶的瀏覽器去訪問一個自己曾經(jīng)認(rèn)證過的網(wǎng)站并執(zhí)行一些操作(如發(fā)郵件,發(fā)消息尺借,甚至財產(chǎn)操作如轉(zhuǎn)賬和購買商品)绊起。由于瀏覽器曾經(jīng)認(rèn)證過,所以被訪問的網(wǎng)站會認(rèn)為是真正的用戶操作而去執(zhí)行燎斩。這利用了web中用戶身份驗證的一個漏洞:簡單的身份驗證只能保證請求發(fā)自某個用戶的瀏覽器虱歪,卻不能保證請求本身是用戶自愿發(fā)出的蜂绎。
CSRF的原理
- 用戶C打開瀏覽器,訪問受信任網(wǎng)站A笋鄙,輸入用戶名和密碼請求登錄網(wǎng)站A师枣;
- 在用戶信息通過驗證后岸蜗,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器畏浆,此時用戶登錄網(wǎng)站A成功全封,可以正常發(fā)送請求到網(wǎng)站A颂翼;
- 用戶未退出網(wǎng)站A之前,在同一瀏覽器中姐刁,打開一個TAB頁訪問網(wǎng)站B余掖;
- 網(wǎng)站B接收到用戶請求后田篇,返回一些攻擊性代碼许布,并發(fā)出一個請求要求訪問第三方站點A玫膀;
- 瀏覽器在接收到這些攻擊性代碼后,根據(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 把 100w 的存款轉(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夺刑,他不能通過安全認(rèn)證缅疟,因此該請求不會起作用。這時遍愿,Mallory 想到使用 CSRF 的攻擊方式存淫,他先自己做一個網(wǎng)站,在網(wǎng)站中放入如下代碼:
src="http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory"
并且通過廣告等誘使 Bob 來訪問他的網(wǎng)站沼填。當(dāng) Bob 訪問該網(wǎng)站時桅咆,上述 URL 就會從 Bob 的瀏覽器發(fā)向銀行,而這個請求會附帶 Bob 瀏覽器中的 cookie 一起發(fā)向銀行服務(wù)器坞笙。大多數(shù)情況下岩饼,該請求會失敗荚虚,因為他要求 Bob 的認(rèn)證信息。但是忌愚,如果 Bob 當(dāng)時恰巧剛訪問他的銀行后不久曲管,他的瀏覽器與銀行網(wǎng)站之間的 session 尚未過期,瀏覽器的 cookie 之中含有 Bob 的認(rèn)證信息硕糊。這時院水,悲劇發(fā)生了,這個 url 請求就會得到響應(yīng)简十,錢將從 Bob 的賬號轉(zhuǎn)移到 Mallory 的賬號檬某,而 Bob 當(dāng)時毫不知情。等以后 Bob 發(fā)現(xiàn)賬戶錢少了螟蝙,即使他去銀行查詢?nèi)罩净帜眨仓荒馨l(fā)現(xiàn)確實有一個來自于他本人的合法請求轉(zhuǎn)移了資金,沒有任何被攻擊的痕跡胰默。而 Mallory 則可以拿到錢后逍遙法外场斑。
- 這種惡意的網(wǎng)址可以有很多種形式,藏身于網(wǎng)頁中的許多地方牵署。此外漏隐,攻擊者也不需要控制放置惡意網(wǎng)址的網(wǎng)站。例如他可以將這種地址藏在論壇奴迅,博客等任何用戶生成內(nèi)容的網(wǎng)站中青责。這意味著如果服務(wù)器端沒有合適的防御措施的話,用戶即使訪問熟悉的可信網(wǎng)站也有受攻擊的危險取具。
- 透過例子能夠看出脖隶,攻擊者并不能通過CSRF攻擊來直接獲取用戶的賬戶控制權(quán),也不能直接竊取用戶的任何信息暇检。他們能做到的产阱,是欺騙用戶瀏覽器,讓其以用戶的名義執(zhí)行操作占哟。
CSRF的防范措施
檢查Referer字段
HTTP頭中有一個Referer字段心墅,這個字段用以標(biāo)明請求來源于哪個地址。在處理敏感數(shù)據(jù)請求時榨乎,通常來說怎燥,Referer字段應(yīng)和請求的地址位于同一域名下。以上文銀行操作為例蜜暑,Referer字段地址通常應(yīng)該是轉(zhuǎn)賬按鈕所在的網(wǎng)頁地址铐姚,應(yīng)該也位于www.examplebank.com
之下。而如果是CSRF攻擊傳來的請求,Referer字段會是包含惡意網(wǎng)址的地址隐绵,不會位于www.examplebank.com
之下之众,這時候服務(wù)器就能識別出惡意的訪問。這種辦法簡單易行依许,工作量低棺禾,僅需要在關(guān)鍵訪問處增加一步校驗。但這種辦法也有其局限性峭跳,因其完全依賴瀏覽器發(fā)送正確的Referer字段膘婶。雖然http協(xié)議對此字段的內(nèi)容有明確的規(guī)定,但并無法保證來訪的瀏覽器的具體實現(xiàn)蛀醉,亦無法保證瀏覽器沒有安全漏洞影響到此字段悬襟。并且也存在攻擊者攻擊某些瀏覽器,篡改其Referer字段的可能拯刁。添加校驗token
由于CSRF的本質(zhì)在于攻擊者欺騙用戶去訪問自己設(shè)置的地址脊岳,所以如果要求在訪問敏感數(shù)據(jù)請求時,要求用戶瀏覽器提供不保存在cookie中垛玻,并且攻擊者無法偽造的數(shù)據(jù)作為校驗割捅,那么攻擊者就無法再執(zhí)行CSRF攻擊。這種數(shù)據(jù)通常是表單中的一個數(shù)據(jù)項帚桩。服務(wù)器將其生成并附加在表單中棺牧,其內(nèi)容是一個偽亂數(shù)。當(dāng)客戶端通過表單提交請求時朗儒,這個偽亂數(shù)也一并提交上去以供校驗。正常的訪問時参淹,客戶端瀏覽器能夠正確得到并傳回這個偽亂數(shù)醉锄,而通過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個偽亂數(shù)的值浙值,服務(wù)器端就會因為校驗token的值為空或者錯誤恳不,拒絕這個可疑請求。
參考鏈接:
https://blog.csdn.net/u012322925/article/details/51290054
https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0
https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/