鍍金池/ 問答/Python  Linux  網(wǎng)絡(luò)安全  HTML/ 這種破解CSRF防御的方法是否可行?

這種破解CSRF防御的方法是否可行?

我們首先統(tǒng)一一下口徑:
站點(diǎn)A:被攻擊的網(wǎng)站
站點(diǎn)B:偽造請(qǐng)求的網(wǎng)站

一般網(wǎng)站的防御方法是:
判斷請(qǐng)求中的token和cookie中的token是否相同,相同則表示請(qǐng)求發(fā)起者和會(huì)話用戶是同一個(gè)人。

這種防御方法可行的原因是:
站點(diǎn)B無(wú)法獲取到站點(diǎn)A的cookie,所以無(wú)法在請(qǐng)求中添加token。

但,我們假設(shè)站點(diǎn)B知道站點(diǎn)A的某個(gè)頁(yè)面表單里有隱藏的token字段,那么,站點(diǎn)B在自己的頁(yè)面中寫一個(gè)隱藏的iframe去請(qǐng)求這個(gè)頁(yè)面。(這里有一個(gè)問題,iframe會(huì)創(chuàng)建新的會(huì)話嗎?但不管會(huì)不會(huì),都有如下可能)

  1. iframe不會(huì)生成新的會(huì)話。那么對(duì)于用戶而言,假設(shè)用戶在訪問站點(diǎn)A后沒有關(guān)閉站點(diǎn)又去訪問了站點(diǎn)B,那么站點(diǎn)B中的iframe和站點(diǎn)A屬于同一個(gè)會(huì)話,也就是說(shuō)他們的token相同。這個(gè)時(shí)候站點(diǎn)B通過預(yù)先寫好的腳本去獲取到iframe中的token,然后在偽造的請(qǐng)求中加入這個(gè)token,能否成功?
  2. iframe會(huì)生成新的會(huì)話。那也就是說(shuō)站點(diǎn)B的iframe中的token和站點(diǎn)A的token值是不相同的,但是可以使用以下方法去偽造請(qǐng)求:站點(diǎn)B不是直接在頁(yè)面中添加偽造請(qǐng)求,而是在iframe里去添加偽造請(qǐng)求,由于iframe中是站點(diǎn)A的會(huì)話,所以請(qǐng)求會(huì)帶著站點(diǎn)A的cookie一起發(fā)出去,由于iframe和站點(diǎn)A共用一套cookie(因?yàn)橥颍跃统晒ΡI用了用戶的身份。這種方法可行嗎?

---------- 補(bǔ)充 -----------

經(jīng)過驗(yàn)證,iframe并不會(huì)產(chǎn)生新的會(huì)話,而是會(huì)沿用未關(guān)閉的站點(diǎn)A的會(huì)話。

也就是說(shuō),iframe中表單的token字段已經(jīng)可見,關(guān)鍵在于腳本是否能夠獲取到(跨域獲取iframe中的內(nèi)容)。

回答
編輯回答
陪我終

我想你對(duì)csrf是不是有一些誤會(huì)。。。

首先,iframe跨域嵌套基本是不可行的,這點(diǎn)你可以試試各大網(wǎng)站,你用iframe嵌套它們,并嘗試獲取iframe中的內(nèi)容,會(huì)被拒絕。

然后,csrf的攻擊無(wú)需獲取cookie(它的原理是攻擊網(wǎng)站B構(gòu)建一個(gè)a網(wǎng)站的請(qǐng)求,冒充是a網(wǎng)站,然后就成功的讓瀏覽器帶上了cookie-所以,哪怕是http only也無(wú)法阻止,從而身份校驗(yàn)成功-當(dāng)然,這里你應(yīng)該也能看到,最簡(jiǎn)單的判斷referer字段就可以防御了,不過鑒于客戶端是不可信的,所以一般不建議僅僅只校驗(yàn)referer)

再說(shuō)下,目前的csrf防御的一種通用方案是:請(qǐng)求加token(注意,不是cookie作為token,而是主動(dòng)在header請(qǐng)求里加一個(gè)token字段)

這樣,只要你無(wú)法獲取實(shí)際的token,就無(wú)法偽造,所以相對(duì)安全系數(shù)更高。

2018年2月1日 08:02
編輯回答
蔚藍(lán)色

昨天遇到一個(gè)奇葩 跟你的想法一樣。還說(shuō)如果不適應(yīng)iframe 樣式就沒了。。。

2017年7月28日 12:56
編輯回答
糖果果

問題在于,站點(diǎn)B可以讓它的站點(diǎn)不允許在iframe中使用,且跨域的話,站點(diǎn)A的腳本并不能操作iframe中的表單

2018年7月30日 16:09