Web安全 之 CSRF攻擊

本文演示 Demo 的代碼地址: CSRF

CSRF是什么?

CSRF(Cross Site Request Forgery),翻譯成中文就是跨站點(diǎn)請(qǐng)求偽造。

簡(jiǎn)單地說(shuō),CSRF就是利用了我們的登錄狀態(tài)或者授權(quán)狀態(tài)(請(qǐng)注意“利用”,并沒(méi)有竊取到),然后做一些損害我們自身利益的事情。

在本文的 demo 中會(huì)簡(jiǎn)單演示一下 CSRF 攻擊:
在啟動(dòng)服務(wù)并登錄成功之后,通過(guò)對(duì)瀏覽器進(jìn)行調(diào)試,在請(qǐng)求列表我們可以看到所有文章的id


查看請(qǐng)求.png

對(duì)文章執(zhí)行刪除操作,發(fā)現(xiàn)其實(shí)是執(zhí)行了一個(gè)下面這樣的請(qǐng)求


刪除文章.png
http://localhost:3000/articles/delete/5a2398eb4d39c72e1db2006e

我們新打開(kāi)一個(gè)瀏覽器窗口, 在獲取到的id列表中取一個(gè)替換上面 url 中的id,執(zhí)行請(qǐng)求, 頁(yè)面顯示


刪除成功.png

返回原頁(yè)面,刷新后,發(fā)現(xiàn)又有一篇文章被刪除了。
這就是一個(gè) CSRF 攻擊的過(guò)程


image.png

GET & POST

如 demo 中演示,我們是通過(guò) GET 請(qǐng)求進(jìn)行 CSRF 攻擊的,那我們換成 POST 請(qǐng)求是不是就可以避免 CSRF 攻擊了呢?
其實(shí)并不能,我們可以通過(guò) form 表單偽造一個(gè) POST 請(qǐng)求來(lái)進(jìn)行 CSRF 攻擊。
在瀏覽器中打開(kāi) test.html


test.png

html 代碼如下:

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>CSRF</title>
</head>

<body>
    <form action="http://localhost:3000/articles/delete" method="POST">
        <input type="hidden" name="id" value="5a23ca3a24f5d73343759637">
        <input type="submit" value="點(diǎn)擊中大獎(jiǎng)">
    </form>
</body>

</html>

修改 test.html,取一個(gè)獲取到的文章 id,替換表單中 name 為 id 的 value,此時(shí)點(diǎn)擊按鈕時(shí),發(fā)現(xiàn)同樣可以成功的刪除文章。由此可見(jiàn),POST也能造成 CSRF 攻擊。如此一來(lái),不管哪種訪問(wèn)方式都可能受到攻擊。所以,這并不是GET和POST誰(shuí)更安全的問(wèn)題,POST只是提高了攻擊門檻和成本。

CSRF 的防御

  • 驗(yàn)證碼
    驗(yàn)證碼被認(rèn)為是對(duì)抗 CSRF 攻擊最簡(jiǎn)潔而有效的防御方法。
    CSRF 攻擊的過(guò)程,往往是在用戶不知情的情況下構(gòu)成了網(wǎng)絡(luò)請(qǐng)求。而驗(yàn)證碼,則強(qiáng)制用戶必須與用戶進(jìn)行交互,才能完成最終請(qǐng)求。因此在通常情況下,驗(yàn)證碼能夠很好的遏制 CSRF 攻擊。但是驗(yàn)證碼并非萬(wàn)能,出于用戶體驗(yàn)考慮,網(wǎng)站不能給所有的操作都加上驗(yàn)證碼,因此,驗(yàn)證碼只能作為防御 CSRF 的一種輔助手段,而不能作為最主要的解決方案。
  • Anti CSRF Token
    CSRF 為什么能夠攻擊成功? 其本質(zhì)原因是服務(wù)器無(wú)法識(shí)別你的來(lái)源是否可靠。而操作的所有參數(shù)都是可以被攻擊者猜測(cè)到的。攻擊者只要預(yù)測(cè)出 URL 的所有參數(shù)與參數(shù)值,就能成功的構(gòu)造一個(gè)偽造的請(qǐng)求。
    出于這個(gè)原因,我們可以想到一個(gè)解決方案:把參數(shù)進(jìn)行加密。這樣攻擊者不知道如何解密的情況下是無(wú)法偽造請(qǐng)求的。但是這個(gè)方法也存在一些問(wèn)題。加密后的 URL 將變得非常難讀,對(duì)用戶非常不友好。因此我們需要一個(gè)更加通用的解決方案。這個(gè)方案就是使用 Anti CSRF Token。
    在服務(wù)端生成一個(gè)隨機(jī)的 Token,放在用戶的Session中,或者瀏覽器的 Cookie 中,提交請(qǐng)求時(shí)將 Token 加入到HTTP請(qǐng)求參數(shù)中,服務(wù)器攔截請(qǐng)求,查看發(fā)送的 Token 和服務(wù)端的是否一致,若一致,則允許請(qǐng)求;若不一致,則拒絕請(qǐng)求。而 Token 之所以能夠攔截,就是因?yàn)樗?CSRF 攻擊過(guò)程中幾乎不可能偽造的東西。
    最后我們?cè)偈褂?Token 時(shí),一定要注意 Token 的隨機(jī)性和保密性,不要把 Token 暴露在 GET 請(qǐng)求中哦。

參考

《白帽子講Web安全》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容