參考:https://tech.meituan.com/2018/10/11/fe-security-csrf.html
一仇让、CSRF(跨站偽造請(qǐng)求)
首先丧叽,CSRF是攻擊者對(duì)瀏覽器的欺騙。
攻擊者誘導(dǎo)受害者進(jìn)入第三方網(wǎng)站假瞬,在第三方網(wǎng)站中,向被攻擊網(wǎng)站發(fā)送跨站請(qǐng)求懦傍。利用受害者在被攻擊網(wǎng)站已經(jīng)獲得注冊(cè)憑證(cookie)芦劣,繞過(guò)后臺(tái)用戶驗(yàn)證,達(dá)到冒充用戶對(duì)被攻擊網(wǎng)站執(zhí)行某項(xiàng)操作的目的寸认。
流程:
- 受害者登錄A網(wǎng)站(a.com)串慰,保留了登錄憑證Cookie
- 攻擊者誘導(dǎo)受害者訪問b.com
- b.com向a.com發(fā)請(qǐng)求:a.com/act=xx。瀏覽器會(huì)以為是用戶發(fā)請(qǐng)求灸叼,就默認(rèn)攜帶a.com的Cookie
- a.com接收到請(qǐng)求后庆捺,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證捉腥,誤以為是受害者自己發(fā)送的請(qǐng)求你画。
-
a.com以受害者的名義執(zhí)行了act=xx。
6.攻擊完成拟逮,攻擊者在受害者不知情的情況下剥槐,冒充受害者,讓a.com執(zhí)行了自己定義的操作颅崩。
栗子:
一沿后、GET類型的CSRF
假如博客園有個(gè)加關(guān)注的GET接口朽砰,blogUserGuid參數(shù)很明顯是關(guān)注人Id喉刘,如下:
然后我只用在我的博客里加一個(gè)img標(biāo)簽
就有人會(huì)打開博客睦裳,自動(dòng)加關(guān)注廉邑。
二倒谷、POST類型的CSRF
假如還是有個(gè)加關(guān)注的接口,不過(guò)已經(jīng)限制了只獲取POST請(qǐng)求的數(shù)據(jù)牵祟。這個(gè)時(shí)候就做一個(gè)第三方的頁(yè)面抖格,誘惑用戶去打開,打開過(guò)的用戶就中招了筝尾。
最好要加一層iframe,因?yàn)椴患觟frame頁(yè)面會(huì)重定向站辉,降低攻擊的隱蔽性。弄一個(gè)表單殊霞,用戶已打開,就自動(dòng)提交绷蹲。
特點(diǎn):
- 攻擊一般發(fā)起在第三方網(wǎng)站顾孽,而不是被攻擊的網(wǎng)站。被攻擊的網(wǎng)站無(wú)法防止攻擊發(fā)生拦英。
- 攻擊利用受害者在被攻擊網(wǎng)站的登錄憑證测秸,冒充受害者提交操作灾常;而不是直接竊取數(shù)據(jù)钞瀑。
- 整個(gè)過(guò)程攻擊者并不能獲取到受害者的登錄憑證慷荔,僅僅是“冒用”。
- 跨站請(qǐng)求可以用各種方式:圖片URL监徘、超鏈接吧碾、CORS、Form提交等等户敬。部分請(qǐng)求方式可以直接嵌入在第三方論壇睁本、文章中,難以進(jìn)行追蹤抄瑟。
CSRF通常是跨域的枉疼,因?yàn)橥庥蛲ǔ8菀妆还粽哒瓶亍5侨绻居蛳掠腥菀妆焕玫墓δ埽?strong>比如可以發(fā)圖和鏈接的論壇和評(píng)論區(qū)惹资,攻擊可以直接在本域下進(jìn)行航闺,而且這種攻擊更加危險(xiǎn)。
防護(hù)策略:
一般CSRF由第三方網(wǎng)站發(fā)起侮措,你無(wú)法防止被攻擊福铅,只能增強(qiáng)自己網(wǎng)站的防御能力來(lái)提升安全性。
CSRF有兩個(gè)特點(diǎn):
- 通常發(fā)生在第三方域名
- CSRF攻擊者只是使用Cookie笆包,但是不能獲取Cookie
針對(duì)這兩點(diǎn),有如下防御措施:
1. 同源檢測(cè)
檢查請(qǐng)求頭的referer和origin庵佣。
對(duì)于origin,可直接確定域名通今,不含有query和path肛根。
但是,有些情況臼氨,origin不存在芭届,如IE11的cors請(qǐng)求,褂乍,302重定向。(因?yàn)橹囟ㄏ蚨际嵌际钦?qǐng)求新的服務(wù)器的url屡拨,瀏覽器不想把此服務(wù)器的源泄露給新的服務(wù)器褥实。)
對(duì)于referer,referer是瀏覽器掛上的,但是referer可以通過(guò)手動(dòng)設(shè)置referer policy給隱藏掉叫胖,攻擊者可以發(fā)不帶referer字段的請(qǐng)求。
因此怎棱,攔截沒有origin和referer的請(qǐng)求绷跑,十分重要。
但是對(duì)于在本域的csrf谬运,這種檢測(cè)是防御不了的。
2. CSRF token
這個(gè)是基于攻擊者無(wú)法獲取用戶的信息(cookie梆暖、header和網(wǎng)頁(yè))。csrf之所以成功是因?yàn)榉?wù)器識(shí)別不出來(lái)到底是攻擊者網(wǎng)站發(fā)的請(qǐng)求還是用戶發(fā)的厚掷。
因此我們要求用戶請(qǐng)求都攜帶一個(gè)csrf無(wú)法獲取到的token。
在用戶打開頁(yè)面的時(shí)候冒黑,服務(wù)器給用戶生成一個(gè)隨機(jī)字符串+日期的token勤哗,token也放在服務(wù)器的session中,之后再加載頁(yè)面豁延,用js遍歷dom樹,給所有的form和a標(biāo)簽加token诱咏。
對(duì)于get請(qǐng)求缴挖,token加載query里,對(duì)于post幻林,如表單冲甘,token加載value里。
這個(gè)方法在沒有泄露token的話是十分安全的砌梆,但是對(duì)于所有的頁(yè)面及里面的表單進(jìn)行token驗(yàn)證贬循,不能有一種通用的攔截方式來(lái)統(tǒng)一攔截,對(duì)于后臺(tái)來(lái)講烂瘫,攔截檢查工作量大。
3. 雙重Cookie
1.1. 在用戶訪問網(wǎng)站頁(yè)面時(shí)坟比,向請(qǐng)求域名注入一個(gè)Cookie,內(nèi)容為隨機(jī)字符串
2.2 在前端向后端發(fā)起請(qǐng)求時(shí)怜校,取出Cookie注竿,并添加到URL的參數(shù)中
3.3 后端接口驗(yàn)證Cookie中的字段與URL參數(shù)中的字段是否一致,不一致則拒絕
優(yōu)點(diǎn):
1.無(wú)需使用Session裙顽,適用面更廣,易于實(shí)施愈犹。
2.Token儲(chǔ)存于客戶端中闻丑,不會(huì)給服務(wù)器帶來(lái)壓力。
3.相對(duì)于Token勋锤,實(shí)施成本更低侥祭,可以在前后端統(tǒng)一攔截校驗(yàn),而不需要一個(gè)個(gè)接口和頁(yè)面添加谈宛。
缺點(diǎn):
1.如果有其他漏洞(例如XSS)胎署,攻擊者可以注入Cookie,那么該防御方式失效径筏。
2.難以做到子域名的隔離障陶。
4. samesite Cookie
Set-Cookie響應(yīng)頭中新增的屬性聊训,由strict 和lax 模式,strick模式下的cookie鼓寺,若由第三方網(wǎng)站請(qǐng)求,請(qǐng)求中不會(huì)含有這個(gè)cookie字段妈候。lax相反,為第三方cookie啸胧。
栗子:假如淘寶網(wǎng)站用來(lái)識(shí)別用戶登錄與否的 Cookie 被設(shè)置成了 Samesite=Strict幔虏,那么用戶從百度搜索頁(yè)面甚至天貓頁(yè)面的鏈接點(diǎn)擊進(jìn)入淘寶后,淘寶都不會(huì)是登錄狀態(tài)陷谱,因?yàn)樘詫毜姆?wù)器不會(huì)接受到那個(gè) Cookie,其它網(wǎng)站發(fā)起的對(duì)淘寶的任意請(qǐng)求都不會(huì)帶上那個(gè) Cookie烟逊。
二、XSS(跨網(wǎng)站腳本攻擊)
- 攻擊者通過(guò)在目標(biāo)網(wǎng)站上注入惡意腳本宪躯,使之在用戶的瀏覽器上運(yùn)行眷唉。利用這些惡意腳本,攻擊者可獲取用戶的敏感信息如 Cookie冬阳、SessionID 等党饮,進(jìn)而危害數(shù)據(jù)安全肝陪。
- 惡意代碼未經(jīng)過(guò)濾刑顺,與網(wǎng)站正常的代碼混在一起;瀏覽器無(wú)法分辨哪些腳本是可信的狼讨,導(dǎo)致惡意腳本被執(zhí)行。
- 在部分情況下政供,由于輸入的限制布隔,注入的惡意腳本比較短。但可以通過(guò)引入外部的腳本(重定向)招刨,并由瀏覽器執(zhí)行,來(lái)完成比較復(fù)雜的攻擊策略沉眶。
防御:
XSS攻擊有兩要素
- 攻擊者提交惡意代碼
- 瀏覽器無(wú)法識(shí)別惡意代碼沦寂,就執(zhí)行惡意代碼淘衙。