Web 漏洞分析與防護之 CSRF(二)

原文地址:Web 漏洞分析與防護之 CSRF(二)
博客地址:www.extlight.comjavascript

1、全稱

跨站請求僞造(Cross-site Request Forgery)html

2、原理

在用戶登錄目標網站後,後端會返回用戶登錄的憑證到前端(瀏覽器的 cookie)。攻擊者誘使用戶點擊某個超連接,該超連接會發送惡意請求(會攜帶用戶的 cookie),從而冒充用戶完成業務請求(發帖、盜取用戶資金等)。前端

3、攻擊方式

筆者以網站的發帖功能爲案例對 CSRF 攻擊進行簡單的講解。java

3.1 提交 form 表單

下圖爲模擬攻擊演示圖:chrome

image
image

如下是演示圖中,"CSRF 攻擊.html" 文件的源碼。後端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試</title>
</head>
<body>
<script type="text/javascript"> document.write(` <form id="myForm" name="myForm" target="csrf" method="post" action="http://localhost:8080/article/save"> <input type="hidden" name="userName" value="李四" /> <textarea name="content">表單攻擊</textarea> </form> `); var iframe = document.createElement("iframe"); iframe.name = "csrf"; iframe.style.display = "none"; document.body.appendChild(iframe); setTimeout(function() { document.getElementById("myForm").submit(); },1000); </script>
</body>
</html>複製代碼

實際案例中,攻擊者會先了解目標網站請求的 url,經過誘惑登錄用戶點擊某個超連接,該連接指向相似上文的 html 頁面(第三方網站)。由於是用戶在本身瀏覽器點擊的超連接,所以會自動攜帶用戶瀏覽器中的 cookie,這樣在第三方網站就能夠冒充用戶發起請求。瀏覽器

須要補充的是,點擊第三方的超連接會攜帶本地瀏覽器的 cookie,可是第三方網站不能對這些 cookie 進行讀寫。cookie

3.2 點擊超連接

若是目標網站容許 get 請求,可經過超連接攻擊。以下圖:app

image
image

超連接源碼以下:post

<a href="http://localhost:8080/article/save?userName=李四&content=超連接攻擊">點擊獲取現金大獎</a>複製代碼

3.3 加載圖片方式

更加粗暴的方式就是經過圖片發送請求,以下圖:

image
image

圖片源碼以下:

<img src="http://localhost:8080/article/save?userName=李四&content=圖片攻擊" />複製代碼

4、防護

CSRF 攻擊的一個特色是繞過目標網站的前端頁面(沒法獲知頁面的信息,如:驗證碼,token),在第三方網站發送請求到目標網站後端。

在網站後端,用戶登錄功能的代碼中,設置 cookie 的 SameSite 的值爲 Strict 返回給瀏覽器。

缺點:目前只有 chrome 和 opera 支持該屬性。

4.2 使用驗證碼

以論壇發帖爲例,在發帖時,設置一個驗證碼,發帖後在後端進行校驗。CSRF 攻擊無法獲取到驗證碼,從而目標網站獲得了防護。

4.3 使用 token

繼續以論壇發帖爲例,在論壇後端跳轉發帖頁面的代碼中隨機生成一個 N 位數的數字/字符串做爲 token,設置到 cookie 和任意變量名的變量中(最終放入到前端的 form 表單中)。當用戶在頁面發帖後,後端接收和校驗 cookie 中的 token 和 頁面提交的 token 是否一致。若是一致,則說明是用戶合法操做。

4.4 判斷 referer

referer 是 http 的請求頭,用戶發送請求後,在後端獲取該請求頭,判斷它的值是否包含目標網站的域名。若是包含說明操做合法。

5、參考資料

相關文章
相關標籤/搜索