? ? ? ? 不覺(jué)間來(lái)到新公司已經(jīng)兩個(gè)月了,憑借在下的勤勞努力厚臉皮終于在新公司拿到了勞動(dòng)合同,在下欣喜若狂間不禁想要寫一篇短文來(lái)紀(jì)念一下。??
? ? ? ? 介于在下的細(xì)心、正直、身材好,我被分到了公司的支付中心做前端,負(fù)責(zé)全公司的支付業(yè)務(wù)。既然是涉及到錢的東西,那就不是像以前隨便寫寫業(yè)務(wù),封裝個(gè)對(duì)象,弄個(gè)抽象類就完事了的。
? ? ? ? 上一篇把XSS攻擊仔細(xì)介紹了一下,今天讓我們來(lái)細(xì)聊一下CSRF是怎么搞的吧。
? ? ? ? CSRF全名喚做Cross Site Request Forgery,中文名叫跨站點(diǎn)請(qǐng)求偽造。其本質(zhì)是在用戶已經(jīng)登錄的前提下,引誘用戶點(diǎn)擊釣魚(yú)網(wǎng)站地址,由于用戶已經(jīng)獲取到了正規(guī)網(wǎng)站的cookie,所以在請(qǐng)求正規(guī)網(wǎng)站的時(shí)候就可以跳過(guò)其對(duì)cookie的限制。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——高級(jí)裝逼工程師 Yubble
? ? ? ? 情景再現(xiàn):
????????下面我們來(lái)簡(jiǎn)單的擼一下這個(gè)場(chǎng)景,比如我現(xiàn)在有一個(gè)正規(guī)的退款功能頁(yè)面,他可以長(zhǎng)這個(gè)樣子:


? ? ? ? 這個(gè)UI很簡(jiǎn)約的頁(yè)面就是我們登錄進(jìn)來(lái)的主頁(yè)面,它的cookie中包含用戶的token...

? ? ? ? 此時(shí)間我如果是一個(gè)好流弊的黑客,我通過(guò)我臭不要臉的手段在頁(yè)面里塞入一段鏈接來(lái)誘導(dǎo)用戶進(jìn)入我的釣魚(yú)網(wǎng)站。比方說(shuō)我塞入了這樣一條連接。

? ? ? ? 恰巧受害者又是一位ikun,她不顧一切狠狠地點(diǎn)了進(jìn)去,結(jié)果跳進(jìn)了我事先寫好的陷阱頁(yè)面里~各位請(qǐng)看:

? ? ? ? 吶,現(xiàn)在這位小迷妹已經(jīng)進(jìn)入了我的釣魚(yú)網(wǎng)站,她現(xiàn)在只要點(diǎn)擊任意一個(gè)轉(zhuǎn)賬的請(qǐng)求就會(huì)帶上剛剛登陸的正規(guī)網(wǎng)站的cookie觸發(fā)退款了。
? ? ? ? 原理解答:
? ? ? ? 看到這里的客爺一定已經(jīng)憋了一大堆問(wèn)題想要質(zhì)問(wèn)在下,哈哈,反正你也打不到我.....客爺留步,都看到這了再往下看下去吧~
? ? ? ? 我們知道兩個(gè)不同域名的網(wǎng)站是無(wú)法共享cookie的,且我的點(diǎn)擊退款按鈕發(fā)送的請(qǐng)求也是需要后端來(lái)驗(yàn)證cookie中包含的token值的,如下:

? ? ? ? 問(wèn)題1:那么用戶是如何在訪問(wèn)我的testyubble.com域名的時(shí)候?qū)royubble.com域名下的token帶上的呢?
? ? ? ? 答案就在于,我在釣魚(yú)網(wǎng)站點(diǎn)擊“點(diǎn)我給之前的正規(guī)網(wǎng)站發(fā)個(gè)請(qǐng)求(轉(zhuǎn)賬)(get)”按鈕的時(shí)候給html插入了一條iframe:

? ? ? ? 我們大家都知道jsonp之所以可以發(fā)送跨域請(qǐng)求就是因?yàn)閟rc這個(gè)屬性不受同源策略的影響,所以我在釣魚(yú)網(wǎng)站頁(yè)面插入了iframe標(biāo)簽,它就用get的方式訪問(wèn)了這個(gè)http://proyubble.com/returnMoney這個(gè)接口。但是!為什么我可以攜帶上proyubble.com的cookie呢,因?yàn)?b>當(dāng)我登錄proyubble.com這個(gè)路徑的時(shí)候,cookie就已經(jīng)種到我瀏覽器中了,雖然在testyubble.com這個(gè)域名下看不到,但是如果頁(yè)面中存在包含proyubble.com域名的iframe中的話,cookie是會(huì)被瀏覽器自動(dòng)帶上的。

? ? ? ? 發(fā)送了iframe的請(qǐng)求后,Cookies就存在了兩個(gè)域名下的內(nèi)容,查看proyubble.com這個(gè)域名的時(shí)候,可以看到早已存在瀏覽器中的cookie被展示出來(lái)了。
? ? ? ? 所以,如果要完成csrf攻擊,首先要保證被攻擊者是在已經(jīng)登錄被攻擊網(wǎng)站的前提下。
? ? ? ? 問(wèn)題2:src里放的鏈接只能按get方法訪問(wèn),是不是使用Post提交方式就安全了呢?
? ? ? ? 并不是,post接口也同樣可以被跨站點(diǎn)請(qǐng)求,只不過(guò)要比get接口復(fù)雜一點(diǎn),客爺請(qǐng)看:

? ? ? ? 原理上也是借助了iframe中src不受同源策略的影響,在一個(gè)form中將提交方式設(shè)定為POST,注意target一定要寫成iframe的name,這樣提交POST請(qǐng)求后會(huì)在同一頁(yè)面中的iframe里顯示,不會(huì)進(jìn)行頁(yè)面跳轉(zhuǎn)也不會(huì)打開(kāi)新的頁(yè)面。相當(dāng)于打開(kāi)了一個(gè)域名為proyubble.com的新的窗口,在這個(gè)窗口下做了一次對(duì)proyubble.com/returnPost的POST請(qǐng)求,就這么簡(jiǎn)單的又把老實(shí)的proyubble.com網(wǎng)站攻破了。
? ? ? ? 問(wèn)題3:不法人士是怎么拿到cookie的?
????????這是昨天團(tuán)隊(duì)中一個(gè)伙伴問(wèn)到我的,其實(shí)我從頭到尾都沒(méi)有拿到過(guò)用戶的cookie,因?yàn)槲矣胕frame把正規(guī)頁(yè)面嵌進(jìn)來(lái),所以除非我能在正規(guī)網(wǎng)站植入一個(gè)postMessage,不然我是無(wú)法跨域iframe傳遞信息的。
? ? ? ? 簡(jiǎn)而言之,黑客是在拿不到用戶cookie的情況下,對(duì)用戶行為操作,攻擊了正規(guī)網(wǎng)站。
? ? ? ? 如何預(yù)防:
? ? ? ? 方法一:sameSite
? ? ? ? ? ? ? ? 在cookie中設(shè)置sameSite屬性,google主導(dǎo)貢獻(xiàn)了這個(gè)方案,是專門用來(lái)預(yù)防sameSite攻擊的。它的作用就是限制cookie在不同域名下跟隨http請(qǐng)求一起提交。
? ? ? ? 方法二:Referrer Check
? ? ? ? ? ? ? ? 這其實(shí)是sameSite出現(xiàn)之前的一個(gè)老式方案,它的實(shí)現(xiàn)在于每次客戶端向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,服務(wù)器可以在http頭中接收到referrer信息,來(lái)確保這個(gè)請(qǐng)求是否是安全域名中發(fā)送過(guò)來(lái)的。
? ? ? ? 方法三:Anti CSRF Token
? ? ? ? ? ? ? ? 使用token這種方式還是比較有效的,而且需要將token塞入http的請(qǐng)求頭中作為一個(gè)特別的字段傳輸,這么做可以防止CSRF攻擊的原因有兩點(diǎn):第一,黑客拿不到,現(xiàn)在就算我將token塞入cookie中,黑客用iframe的方式誘導(dǎo)用戶打開(kāi)釣魚(yú)網(wǎng)站,中間也隔了一層iframe,如果黑客想要跨域拿到cookie中的token除非他能在正規(guī)網(wǎng)站中使用postMessage。第二,黑客無(wú)法將token塞入http請(qǐng)求頭中,就算這個(gè)黑客小哥手段高明,真的拿到了cookie中的token,他也是無(wú)法在form的POST方法提交的時(shí)候增加一個(gè)http屬性的。
? ? ? ? 方法四:加驗(yàn)證碼
? ? ? ? ? ? ? ? 在下愚見(jiàn),這種操作會(huì)增加用戶的抵制情緒,慎用!
? ? ? ? 一直想要說(shuō)把安全性的CSRF這塊兒補(bǔ)上,但是一直也沒(méi)騰出功夫來(lái),今天把這塊兒學(xué)完了也算給自己一個(gè)交代。前段時(shí)間我們的支付中心迸發(fā)了一次安全問(wèn)題,是一個(gè)url的漏洞,當(dāng)然要說(shuō)web安全最常見(jiàn)的還是xss和csrf這兩個(gè)。今年的5月份好熱,經(jīng)過(guò)了一年多的戀愛(ài)在下終于和媳婦領(lǐng)證了,在我的精心呵護(hù)下,已經(jīng)將她從一只小可愛(ài)喂成了小肉胖,廢話就到這,各位客爺咱們下次見(jiàn)啦~