[點(diǎn)晴永久免費(fèi)OA][轉(zhuǎn)帖]計(jì)算機(jī)網(wǎng)絡(luò)知識----網(wǎng)絡(luò)安全----CSRF(跨站請求偽造 )
一、簡介跨站請求偽造攻擊,英文全稱是Cross-site request forgery,簡稱為CSRF。 攻擊者誘導(dǎo)用戶進(jìn)入一個第三方網(wǎng)站,然后該網(wǎng)站向被攻擊網(wǎng)站發(fā)送跨站請求。如果用戶在被攻擊網(wǎng)站中保存了登錄狀態(tài),那么攻擊者就可以利用這個登錄狀態(tài),繞過后臺的用戶驗(yàn)證,冒充用戶向服務(wù)器執(zhí)行一些操作。 CSRF 攻擊的本質(zhì):本質(zhì)是利用 cookie 會在同源請求中攜帶發(fā)送給服務(wù)器的特點(diǎn),以此來實(shí)現(xiàn)用戶的冒充。 如何攻擊從簡介中我們得知,攻擊者需要誘導(dǎo)用戶進(jìn)入一個第三方網(wǎng)站。
從總結(jié)中可以看出,若想完成CSRF攻擊,要同時滿足2各條件
總結(jié)來說天時地利人和。 二、CSRF攻擊分類2.1 GET 類型的 CSRFGET 類型的 CSRF 利用非常簡單,只需要一個 HTTP 請求,一般這樣使用 假設(shè):網(wǎng)站A,銀行賬戶轉(zhuǎn)行,通過GET請求來完成 危險網(wǎng)站B,其中有一段代碼 <img src="http://mybank.example/transfer?account=ying&for=hacker&money=10000"> 若這時候訪問了網(wǎng)站B,黑客將轉(zhuǎn)賬的請求接口隱藏在 img 標(biāo)簽內(nèi),欺騙瀏覽器這是一張圖片資源。當(dāng)該頁面被加載時,瀏覽器會自動發(fā)起 img 的資源請求,如果服務(wù)器沒有對該請求做判斷的話,那么服務(wù)器就會認(rèn)為該請求是一個轉(zhuǎn)賬請求,于是用戶賬戶上的 10000 就被轉(zhuǎn)移到黑客的賬戶上去了。 2.2 POST類型的 CSRF還以上面的轉(zhuǎn)賬為例子進(jìn)行說明 <form action="http://mybank.example/transfer" method=POST> <input type="hidden" name="account" value="ying" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script> 若訪問了該頁面,表單會自定提交。相當(dāng)于進(jìn)行了一次POST請求。 POST類型的攻擊通常比GET要求更加嚴(yán)格一點(diǎn),但仍并不復(fù)雜。任何個人網(wǎng)站、博客,被黑客上傳頁面的網(wǎng)站都有可能是發(fā)起攻擊的來源,后端接口不能將安全寄托在僅允許POST上面。 2.3 鏈接類型的CSRF這點(diǎn)通俗來說,就是點(diǎn)擊了危險網(wǎng)站的鏈接。通常是在論壇中發(fā)布的圖片中嵌入惡意鏈接,或者以廣告的形式誘導(dǎo)用戶中招。 <a href="http://mybank.example/transfer?account=ying&for=hacker&money=10000" taget="_blank"> 驚喜驚喜,快來領(lǐng)?。。?nbsp; <a/> 三、防御3.1 同源檢測CSRF大多來自第三方網(wǎng)站,那么我們就直接禁止外域(或者不受信任的域名)對我們發(fā)起請求。 在HTTP協(xié)議中,每一個異步請求都會攜帶兩個Header,用于標(biāo)記來源域名:
這兩個Header在瀏覽器發(fā)起請求時,大多數(shù)情況會自動帶上,并且不能由前端自定義內(nèi)容。 服務(wù)器可以通過解析這兩個Header中的域名,確定請求的來源域。 使用Origin Header確定來源域名在部分與CSRF有關(guān)的請求中,請求的Header中會攜帶Origin字段。字段內(nèi)包含請求的域名(不包含path及query),如果Origin存在,那么直接使用Origin中的字段確認(rèn)來源域名就可以。 但是會有2種特殊情況,Origin是不存在的:
使用Referer Header確定來源域名根據(jù)HTTP協(xié)議,在HTTP頭中有一個字段叫Referer,記錄了該HTTP請求的來源地址。 這種方法并非萬無一失,Referer的值是由瀏覽器提供的,雖然HTTP協(xié)議上有明確的要求,但是每個瀏覽器對于Referer的具體實(shí)現(xiàn)可能有差別,并不能保證瀏覽器自身沒有安全漏洞。使用驗(yàn)證 Referer 值的方法,就是把安全性都依賴于第三方(即瀏覽器)來保障,從理論上來講,這樣并不是很安全。在部分情況下,攻擊者可以隱藏,甚至修改自己請求的Referer。 在以下情況下Referer沒有或者不可信:
因此,服務(wù)器的策略是優(yōu)先判斷 Origin,如果請求頭中沒有包含 Origin 屬性,再根據(jù)實(shí)際情況判斷是否使用 Referer 值,從而增加攻擊難度。 無法確認(rèn)來源域名情況如果 Origin 和 Referer 都不存在,建議直接進(jìn)行阻止,特別是如果您沒有使用隨機(jī) CSRF Token(參考下方)作為第二次檢查。 如何阻止外域請求通過Header的驗(yàn)證,我們可以知道發(fā)起請求的來源域名,這些來源域名可能是網(wǎng)站本域,或者子域名,或者有授權(quán)的第三方域名,又或者來自不可信的未知域名。 我們已經(jīng)知道了請求域名是否是來自不可信的域名,我們直接阻止掉這些的請求,就能防御CSRF攻擊了嗎? 且慢!當(dāng)一個請求是頁面請求(比如網(wǎng)站的主頁),而來源是搜索引擎的鏈接(例如百度的搜索結(jié)果),也會被當(dāng)成疑似CSRF攻擊。所以在判斷的時候需要過濾掉頁面請求情況,通常Header符合以下情況: Accept: text/html Method: GET 但相應(yīng)的,頁面請求就暴露在了CSRF的攻擊范圍之中。如果你的網(wǎng)站中,在頁面的GET請求中對當(dāng)前用戶做了什么操作的話,防范就失效了。 例如,下面的頁面請求: GET https://example.com/addComment?comment=XXX&dest=orderId 注:這種嚴(yán)格來說并不一定存在CSRF攻擊的風(fēng)險,但仍然有很多網(wǎng)站經(jīng)常把主文檔GET請求掛上參數(shù)來實(shí)現(xiàn)產(chǎn)品功能,但是這樣做對于自身來說是存在安全風(fēng)險的。 另外,前面說過,CSRF大多數(shù)情況下來自第三方域名,但并不能排除本域發(fā)起。如果攻擊者有權(quán)限在本域發(fā)布評論(含鏈接、圖片等,統(tǒng)稱UGC),那么它可以直接在本域發(fā)起攻擊,這種情況下同源策略無法達(dá)到防護(hù)的作用。 綜上所述:同源驗(yàn)證是一個相對簡單的防范方法,能夠防范絕大多數(shù)的CSRF攻擊。但這并不是萬無一失的,對于安全性要求較高,或者有較多用戶輸入內(nèi)容的網(wǎng)站,我們就要對關(guān)鍵的接口做額外的防護(hù)措施。 3.2 CSRF TokenCSRF攻擊之所以能夠成功,是因?yàn)榉?wù)器誤把攻擊者發(fā)送的請求當(dāng)成了用戶自己的請求。那么我們可以要求所有的用戶請求都攜帶一個CSRF攻擊者無法獲取到的Token。服務(wù)器通過校驗(yàn)請求是否攜帶正確的Token,來把正常的請求和攻擊的請求區(qū)分開,也可以防范CSRF的攻擊。 CSRF Token 原理
我們需要知道的是:
3.3 雙重 Cookie 認(rèn)證
3.4 Samesite Cookie 屬性Google起草了一份草案來改進(jìn)HTTP協(xié)議,那就是為Set-Cookie響應(yīng)頭新增Samesite屬性,它用來標(biāo)明這個 Cookie是個“同站 Cookie”,同站Cookie只能作為第一方Cookie,不能作為第三方Cookie,Samesite 有兩個屬性值,Strict 為任何情況下都不可以作為第三方 Cookie ,Lax 為可以作為第三方 Cookie , 但必須是Get請求 參考: 3.5 其他方法驗(yàn)證碼和密碼被認(rèn)為是對抗CSRF攻擊最簡潔而有效的防御方法。 四、總結(jié)4.1 CSRF攻擊特點(diǎn)
CSRF通常是跨域的,因?yàn)橥庥蛲ǔ8菀妆还粽哒瓶?。但是如果本域下有容易被利用的功能,比如可以發(fā)圖和鏈接的論壇和評論區(qū),攻擊可以直接在本域下進(jìn)行,而且這種攻擊更加危險。
4.2 與XSS的區(qū)別本質(zhì)來說:
該文章在 2023/5/17 16:37:45 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |