懶得整理了填抬,直接貼鏈接了。
參考資料:
讓我們來(lái)談?wù)?CSRF
CSRF
CSRF辆童,跨站請(qǐng)求偽造宜咒,也被稱為one click attack或者session riding。
XSS與CSRF區(qū)別:
- XSS利用站點(diǎn)內(nèi)的信任用戶把鉴,盜取cookie
- CSRF通過偽裝成受信任用戶請(qǐng)求受信任的網(wǎng)站
原理
利用目標(biāo)用戶的合法身份故黑,以目標(biāo)用戶的名義執(zhí)行某些非法操作
例如,一個(gè)轉(zhuǎn)賬案例中庭砍,初始化鏈接為
http://www.xxx.com/pay.php?user=xx&money=100
構(gòu)造惡意鏈接:
http://www.xxx.com/pay.php?user=惡意用戶&money=10000
上述案例中场晶,分析得知這個(gè)過程分為兩個(gè)步驟,首先是會(huì)話驗(yàn)證怠缸,也就是服務(wù)端對(duì)cookie的驗(yàn)證诗轻,驗(yàn)證成功后,接受不了user和money兩個(gè)值凯旭,并進(jìn)行轉(zhuǎn)賬操作概耻。因此CSRF成功利用的條件有兩個(gè):1.用戶已經(jīng)登陸系統(tǒng)。2.用戶訪問對(duì)應(yīng)的URL罐呼。
無(wú)防護(hù)的CSRF漏洞利用
GET型CSRF代碼分析
對(duì)于上面這段代碼,我們只需要構(gòu)造GET型URL侦高,提交username和password參數(shù)嫉柴,以此來(lái)新建對(duì)應(yīng)的用戶名和密碼。例如將下面的URL發(fā)給管理員奉呛,就會(huì)在數(shù)據(jù)庫(kù)中新增一條數(shù)據(jù):
http://.../new_user.php?username=admin&passwpord=123123
如果覺得這種鏈接過于明顯计螺,可以用前端img標(biāo)簽的src屬性對(duì)其進(jìn)行隱藏:
<img src="http://..../new_user.php?username=admin&passwpord=123123">
POST型CSRF代碼分析
攻擊者可以通過開發(fā)者工具查看請(qǐng)求,得知傳參的名字瞧壮,以及這個(gè)請(qǐng)求是post類型登馒,那么就可以構(gòu)造一個(gè)如下的網(wǎng)頁(yè),當(dāng)用戶點(diǎn)擊按鈕時(shí)咆槽,即向數(shù)據(jù)庫(kù)插入了一條新的用戶數(shù)據(jù)
<form action="http://..../new_user.php" method="post">
<input type="hidden" name="username" value="admin_test">
<input type="hidden" name="password" value="admin_test">
<input type="hidden" name="sub" value="Ok">
<input type="submit" name="test" value="我中獎(jiǎng)了">
</form>
CSRF自動(dòng)化探測(cè)
手動(dòng)探測(cè)
手動(dòng)探測(cè)原理在于探測(cè)web應(yīng)用程序具有防止CSRF的措施陈轿。
CSRF漏洞預(yù)防措施:
- 二次驗(yàn)證:一般情況下需要js驗(yàn)證,是否執(zhí)行成功取決于用戶。
- HTTP referer頭
- 是否設(shè)置token
- HTTP自定義頭
如果web應(yīng)用程序的HTTP請(qǐng)求中沒有對(duì)應(yīng)的預(yù)防措施麦射,那么很大程度上就確定存在CSRF漏洞
自動(dòng)化探測(cè)工具
CSRFTester原理:利用代理抓取在瀏覽器中訪問過的所有鏈接以及所有的表單等信息蛾娶,通過在CSRFTester中修改對(duì)應(yīng)的表單等信息,重新提交潜秋,相當(dāng)于以此偽造客戶端請(qǐng)求蛔琅,如果修改的測(cè)試請(qǐng)求成功被網(wǎng)站服務(wù)端接收,則說明存在CSRF漏洞峻呛。
CSRF漏洞token防御
CSRF漏洞實(shí)質(zhì):服務(wù)器無(wú)法準(zhǔn)確判斷當(dāng)前請(qǐng)求是否是合法用戶的自定義操作罗售。如果服務(wù)器在用戶登陸后給予用戶一個(gè)唯一的合法令牌,每一次操作過程中钩述,服務(wù)器都會(huì)驗(yàn)證令牌是否正確寨躁,如果正確執(zhí)行操作,不正確不執(zhí)行操作切距。一般情況下朽缎,給予的令牌會(huì)寫入表單中隱藏域的value值中,隨著表單內(nèi)容進(jìn)行提交谜悟。
簡(jiǎn)單模型:登陸驗(yàn)證->登陸成功后怕轿,給予一個(gè)唯一的令牌斋扰。執(zhí)行操作時(shí),操作過程中驗(yàn)證令牌->成功再進(jìn)行增刪改查
生成token代碼:唯一。例如下面的PHP代碼生成token涧窒。
function generateToken(){
$salt="test".date("h:i:s");
$token=md5($salt);
return $token
}
使用token進(jìn)行CSRF漏洞防御:
1.登陸驗(yàn)證成功后,在會(huì)話session["user_token"]中保存token
2.在后臺(tái)操作中敬扛,增刪改查表單中增加隱藏域hidden粥诫,設(shè)置value為token
3.提交之后進(jìn)行驗(yàn)證token是否正確
CSRF繞過referer技巧
referer防御CSRF原理
當(dāng)用戶點(diǎn)擊被構(gòu)造好的CSRF利用頁(yè)面,那么在執(zhí)行用戶對(duì)應(yīng)操作時(shí)蔑水,提交的HTTP請(qǐng)求中就有對(duì)應(yīng)的referer值邢锯,此時(shí)服務(wù)器端判斷referer值是否與服務(wù)器的域名信息有關(guān),如果不相關(guān)則不執(zhí)行操作搀别。
PHP referer防御代碼編寫
是否包含了某個(gè)域名
if(strpos($_SERVER['HTTP_REFERER'],'xx.com')!==false){
判斷成功
}
else{
判斷失敗
}
繞過referer技巧
如果服務(wù)端只判斷當(dāng)前的referer中是否具有域名丹擎,那么直接可以在站點(diǎn)目錄下新建文件夾進(jìn)行繞過,文件夾的名字為判斷的域名或者ip地址歇父。
GET型CSRF漏洞利用方法
鏈接利用:同上文提到的get型CSRF
iframe利用:iframe標(biāo)簽內(nèi)容將在頁(yè)面家在過程中自動(dòng)進(jìn)行加載蒂培,src指向的位置就是頁(yè)面請(qǐng)求的位置“裆唬可以設(shè)置iframe的style->display:none护戳,以此來(lái)不顯示iframe加載的內(nèi)容,類似于a標(biāo)簽里的href
img標(biāo)簽利用:img標(biāo)簽的內(nèi)容會(huì)隨著頁(yè)面的加載而被請(qǐng)求垂睬,以此src指向的位置會(huì)在頁(yè)面家在過程中進(jìn)行請(qǐng)求
css-background利用:利用css中background樣式中的url來(lái)加載遠(yuǎn)程機(jī)器上的內(nèi)容媳荒,從而對(duì)url中的內(nèi)容發(fā)送http請(qǐng)求
防范
客戶端防范:對(duì)于數(shù)據(jù)庫(kù)的修改請(qǐng)求抗悍,全部使用POST提交,禁止使用GET請(qǐng)求肺樟。
服務(wù)器端防范:一般的做法是在表單里面添加一段隱藏的唯一的token(請(qǐng)求令牌)檐春。
驗(yàn)證碼驗(yàn)證這種只能作為一個(gè)輔助手段,像是二次驗(yàn)證一樣么伯。