我們知道了同源策略可以隔離各個(gè)站點(diǎn)之間的 DOM 交互、頁(yè)面數(shù)據(jù)和網(wǎng)絡(luò)通信,雖然嚴(yán)格的同源策略會(huì)帶來更多的安全,但是也束縛了 Web。這就需要在安全和自由之間找到一個(gè)平衡點(diǎn),所以我們默認(rèn)頁(yè)面中可以引用任意第三方資源,然后又引入 CSP 策略來加以限制;默認(rèn) XMLHttpRequest 和 Fetch 不能跨站請(qǐng)求資源,然后又通過 CORS 策略來支持其跨域。
所以安全性降低了,為了更好的技術(shù)應(yīng)用,同時(shí)也帶來了更多的安全隱患,如XSS,CSRF。
目錄:
什么是CSRF
CSRF攻擊過程
CSRF分類
CSRF攻擊原理
CSRF漏洞挖掘
CSRF攻擊的防御
寫在前面:本篇文章將帶大家詳細(xì)了解Web漏洞之CSRF(跨站請(qǐng)求偽造漏洞),文章內(nèi)容較長(zhǎng),請(qǐng)內(nèi)心閱讀。后面會(huì)持續(xù)更新Web漏洞系列文章,感興趣的可以關(guān)注我!
一、什么是CSRF?
跨站請(qǐng)求偽造,冒用Cookie中的信息,發(fā)起請(qǐng)求攻擊。
CSRF(Cross-site request forgery)跨站請(qǐng)求偽造:攻擊者誘導(dǎo)受害者進(jìn)入第三方網(wǎng)站,在第三方網(wǎng)站中,向被攻擊網(wǎng)站發(fā)送跨站請(qǐng)求。利用受害者在被攻擊網(wǎng)站已經(jīng)獲取的注冊(cè)憑證,繞過后臺(tái)的用戶驗(yàn)證,達(dá)到冒充用戶對(duì)被攻擊的網(wǎng)站執(zhí)行某項(xiàng)操作的目的。
二、CSRF攻擊過程
滿足了上面的必要條件才可以觸發(fā)
當(dāng)用戶已經(jīng)登錄成功了一個(gè)網(wǎng)站
然后通過被誘導(dǎo)進(jìn)了第三方網(wǎng)站「釣魚網(wǎng)站」
跳轉(zhuǎn)過去了自動(dòng)提交表單,冒用受害者信息
后臺(tái)則正常走邏輯將用戶提交的表單信息進(jìn)行處理
三、CSRF分類
CSRF(Cross-Site Request Forgery),跟XSS漏洞攻擊一樣,存在巨大的危害性。
你可以這么來理解:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求,對(duì)服務(wù)器來說這個(gè)請(qǐng)求是完全合法的,但是卻完成了攻擊者所期望的一個(gè)操作,比如以你的名義發(fā)送郵件、發(fā)消息,盜取你的賬號(hào),添加系統(tǒng)管理員,甚至于購(gòu)買商品、虛擬貨幣轉(zhuǎn)賬等
1. GET型:
如果一個(gè)網(wǎng)站某個(gè)地方的功能,比如用戶修改郵箱是通過GET請(qǐng)求進(jìn)行修改的。如:/user.php?id=1&email=123@163.com ,這個(gè)鏈接的意思是用戶id=1將郵箱修改為123@163.com。當(dāng)我們把這個(gè)鏈接修改為 /user.php?id=1&email=abc@163.com ,然后通過各種手段發(fā)送給被攻擊者,誘使被攻擊者點(diǎn)擊我們的鏈接,當(dāng)用戶剛好在訪問這個(gè)網(wǎng)站,他同時(shí)又點(diǎn)擊了這個(gè)鏈接,那么悲劇發(fā)生了。這個(gè)用戶的郵箱被修改為 abc@163.com 了
2.POST型:
在普通用戶的眼中,點(diǎn)擊網(wǎng)頁(yè)->打開試看視頻->購(gòu)買視頻是一個(gè)很正常的一個(gè)流程??墒窃诠粽叩难壑锌梢运阏?,但又不正常的,當(dāng)然不正常的情況下,是在開發(fā)者安全意識(shí)不足所造成的。攻擊者在購(gòu)買處抓到購(gòu)買時(shí)候網(wǎng)站處理購(gòu)買(扣除)用戶余額的地址。比如:/coures/user/handler/25332/buy.php 。通過提交表單,buy.php處理購(gòu)買的信息,這里的25532為視頻ID。那么攻擊者現(xiàn)在構(gòu)造一個(gè)鏈接,鏈接中包含以下內(nèi)容
<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script> document.forms[0].submit(); </script>
當(dāng)用戶訪問該頁(yè)面后,表單會(huì)自動(dòng)提交,相當(dāng)于模擬用戶完成了一次POST操作,自動(dòng)購(gòu)買了id為25332的視頻,從而導(dǎo)致受害者余額扣除
四、CSRF攻擊原理

用戶輸入賬號(hào)信息請(qǐng)求登錄A網(wǎng)站。
A網(wǎng)站驗(yàn)證用戶信息,通過驗(yàn)證后返回給用戶一個(gè)cookie
在未退出網(wǎng)站A之前,在同一瀏覽器中請(qǐng)求了黑客構(gòu)造的惡意網(wǎng)站B
B網(wǎng)站收到用戶請(qǐng)求后返回攻擊性代碼,構(gòu)造訪問A網(wǎng)站的語(yǔ)句
瀏覽器收到攻擊性代碼后,在用戶不知情的情況下攜帶cookie信息請(qǐng)求了A網(wǎng)站。此時(shí)A網(wǎng)站不知道這是由B發(fā)起的。那么這時(shí)黑客就可以進(jìn)行一下騷操作了!
兩個(gè)條件:a 用戶訪問站點(diǎn)A并產(chǎn)生了cookie
b 用戶沒有退出A同時(shí)訪問了B
五、CSRF漏洞挖掘
抓取一個(gè)正常請(qǐng)求的數(shù)據(jù)包,如果沒有Referer字段和token,那么極有可能存在CSRF漏洞
如果有Referer字段,但是去掉Referer字段后再重新提交,如果該提交還有效,那么基本上可以確定存在CSRF漏洞。
利用工具進(jìn)行CSRF檢測(cè)。如:CSRFTESTER,CSRF REQUEST BUILDER等
使用burpsuite快速生成CSRF poc
當(dāng)我們發(fā)現(xiàn)一個(gè)頁(yè)面存在CSRF漏洞后,可以通過burpsuite快速生成攻擊代碼

點(diǎn)擊復(fù)制html ,然后保存在本地

雙擊打開,當(dāng)受害者點(diǎn)擊就執(zhí)行了我們的CSRF代碼

六、CSRF攻擊的防御
1.驗(yàn)證 HTTP Referer 字段
根據(jù) HTTP 協(xié)議,在 HTTP 頭中有一個(gè)字段叫 Referer,它記錄了該 HTTP 請(qǐng)求的來源地址。在通常情況下,訪問一個(gè)安全受限頁(yè)面的請(qǐng)求來自于同一個(gè)網(wǎng)站,比如需要訪問 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用戶必須先登陸 bank.example,然后通過點(diǎn)擊頁(yè)面上的按鈕來觸發(fā)轉(zhuǎn)賬事件。這時(shí),該轉(zhuǎn)帳請(qǐng)求的 Referer 值就會(huì)是轉(zhuǎn)賬按鈕所在的頁(yè)面的 URL,通常是以 bank.example 域名開頭的地址。而如果黑客要對(duì)銀行網(wǎng)站實(shí)施 CSRF 攻擊,他只能在他自己的網(wǎng)站構(gòu)造請(qǐng)求,當(dāng)用戶通過黑客的網(wǎng)站發(fā)送請(qǐng)求到銀行時(shí),該請(qǐng)求的 Referer 是指向黑客自己的網(wǎng)站。因此,要防御 CSRF 攻擊,銀行網(wǎng)站只需要對(duì)于每一個(gè)轉(zhuǎn)賬請(qǐng)求驗(yàn)證其 Referer 值,如果是以 bank.example 開頭的域名,則說明該請(qǐng)求是來自銀行網(wǎng)站自己的請(qǐng)求,是合法的。如果 Referer 是其他網(wǎng)站的話,則有可能是黑客的 CSRF 攻擊,拒絕該請(qǐng)求
這種方法的顯而易見的好處就是簡(jiǎn)單易行,網(wǎng)站的普通開發(fā)人員不需要操心 CSRF 的漏洞,只需要在最后給所有安全敏感的請(qǐng)求統(tǒng)一增加一個(gè)攔截器來檢查 Referer 的值就可以。特別是對(duì)于當(dāng)前現(xiàn)有的系統(tǒng),不需要改變當(dāng)前系統(tǒng)的任何已有代碼和邏輯,沒有風(fēng)險(xiǎn),非常便捷
然而,這種方法并非萬無一失。Referer 的值是由瀏覽器提供的,雖然 HTTP 協(xié)議上有明確的要求,但是每個(gè)瀏覽器對(duì)于 Referer 的具體實(shí)現(xiàn)可能有差別,并不能保證瀏覽器自身沒有安全漏洞。使用驗(yàn)證 Referer 值的方法,就是把安全性都依賴于第三方(即瀏覽器)來保障,從理論上來講,這樣并不安全。事實(shí)上,對(duì)于某些瀏覽器,比如 IE6 或 FF2,目前已經(jīng)有一些方法可以篡改 Referer 值。如果 bank.example 網(wǎng)站支持 IE6 瀏覽器,黑客完全可以把用戶瀏覽器的 Referer 值設(shè)為以 bank.example 域名開頭的地址,這樣就可以通過驗(yàn)證,從而進(jìn)行 CSRF 攻擊。即便是使用最新的瀏覽器,黑客無法篡改 Referer 值,這種方法仍然有問題。因?yàn)?Referer 值會(huì)記錄下用戶的訪問來源,有些用戶認(rèn)為這樣會(huì)侵犯到他們自己的隱私權(quán),特別是有些組織擔(dān)心 Referer 值會(huì)把組織內(nèi)網(wǎng)中的某些信息泄露到外網(wǎng)中。因此,用戶自己可以設(shè)置瀏覽器使其在發(fā)送請(qǐng)求時(shí)不再提供 Referer。當(dāng)他們正常訪問銀行網(wǎng)站時(shí),網(wǎng)站會(huì)因?yàn)檎?qǐng)求沒有 Referer 值而認(rèn)為是 CSRF 攻擊,拒絕合法用戶的訪問

2.在請(qǐng)求地址中添加 token 并驗(yàn)證(Anti-CSRF token)
CSRF 攻擊之所以能夠成功,是因?yàn)楹诳涂梢酝耆珎卧煊脩舻恼?qǐng)求,該請(qǐng)求中所有的用戶驗(yàn)證信息都是存在于 cookie 中,因此黑客可以在不知道這些驗(yàn)證信息的情況下直接利用用戶自己的 cookie 來通過安全驗(yàn)證。要抵御 CSRF,關(guān)鍵在于在請(qǐng)求中放入黑客所不能偽造的信息,并且該信息不存在于 cookie 之中??梢栽?HTTP 請(qǐng)求中以參數(shù)的形式加入一個(gè)隨機(jī)產(chǎn)生的 token,并在服務(wù)器端建立一個(gè)攔截器來驗(yàn)證這個(gè) token,如果請(qǐng)求中沒有 token 或者 token 內(nèi)容不正確,則認(rèn)為可能是 CSRF 攻擊而拒絕該請(qǐng)求
這種方法要比檢查 Referer 要安全一些,token 可以在用戶登陸后產(chǎn)生并放于 session 之中,然后在每次請(qǐng)求時(shí)把 token 從 session 中拿出,與請(qǐng)求中的 token 進(jìn)行比對(duì),但這種方法的難點(diǎn)在于如何把 token 以參數(shù)的形式加入請(qǐng)求。對(duì)于 GET 請(qǐng)求,token 將附在請(qǐng)求地址之后,這樣 URL 就變成 http://url?csrftoken=tokenvalue。而對(duì)于 POST 請(qǐng)求來說,要在 form 的最后加上 ,這樣就把 token 以參數(shù)的形式加入請(qǐng)求了。但是,在一個(gè)網(wǎng)站中,可以接受請(qǐng)求的地方非常多,要對(duì)于每一個(gè)請(qǐng)求都加上 token 是很麻煩的,并且很容易漏掉,通常使用的方法就是在每次頁(yè)面加載時(shí),使用 javascript 遍歷整個(gè) dom 樹,對(duì)于 dom 中所有的 a 和 form 標(biāo)簽后加入 token。這樣可以解決大部分的請(qǐng)求,但是對(duì)于在頁(yè)面加載之后動(dòng)態(tài)生成的 html 代碼,這種方法就沒有作用,還需要程序員在編碼時(shí)手動(dòng)添加 token
該方法還有一個(gè)缺點(diǎn)是難以保證 token 本身的安全。特別是在一些論壇之類支持用戶自己發(fā)表內(nèi)容的網(wǎng)站,黑客可以在上面發(fā)布自己個(gè)人網(wǎng)站的地址。由于系統(tǒng)也會(huì)在這個(gè)地址后面加上 token,黑客可以在自己的網(wǎng)站上得到這個(gè) token,并馬上就可以發(fā)動(dòng) CSRF 攻擊。為了避免這一點(diǎn),系統(tǒng)可以在添加 token 的時(shí)候增加一個(gè)判斷,如果這個(gè)鏈接是鏈到自己本站的,就在后面添加 token,如果是通向外網(wǎng)則不加。不過,即使這個(gè) csrftoken 不以參數(shù)的形式附加在請(qǐng)求之中,黑客的網(wǎng)站也同樣可以通過 Referer 來得到這個(gè) token 值以發(fā)動(dòng) CSRF 攻擊。這也是一些用戶喜歡手動(dòng)關(guān)閉瀏覽器 Referer 功能的原因
3.在 HTTP 頭中自定義屬性并驗(yàn)證
這種方法也是使用 token 并進(jìn)行驗(yàn)證,和上一種方法不同的是,這里并不是把 token 以參數(shù)的形式置于 HTTP 請(qǐng)求之中,而是把它放到 HTTP 頭中自定義的屬性里。通過 XMLHttpRequest 這個(gè)類,可以一次性給所有該類請(qǐng)求加上 CSRFToken 這個(gè) HTTP 頭屬性,并把 token 值放入其中。這樣解決了上種方法在請(qǐng)求中加入 token 的不便,同時(shí),通過 XMLHttpRequest 請(qǐng)求的地址不會(huì)被記錄到瀏覽器的地址欄,也不用擔(dān)心 token 會(huì)透過 Referer 泄露到其他網(wǎng)站中去文章來源:http://www.zghlxwxcb.cn/news/detail-777131.html
然而這種方法的局限性非常大。XMLHttpRequest 請(qǐng)求通常用于 Ajax 方法中對(duì)于頁(yè)面局部的異步刷新,并非所有的請(qǐng)求都適合用這個(gè)類來發(fā)起,而且通過該類請(qǐng)求得到的頁(yè)面不能被瀏覽器所記錄下,從而進(jìn)行前進(jìn),后退,刷新,收藏等操作,給用戶帶來不便。另外,對(duì)于沒有進(jìn)行 CSRF 防護(hù)的遺留系統(tǒng)來說,要采用這種方法來進(jìn)行防護(hù),要把所有請(qǐng)求都改為 XMLHttpRequest 請(qǐng)求,這樣幾乎是要重寫整個(gè)網(wǎng)站,這代價(jià)無疑是不能接受的文章來源地址http://www.zghlxwxcb.cn/news/detail-777131.html
到了這里,關(guān)于Web漏洞之CSRF(跨站請(qǐng)求偽造漏洞)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!