原文地址:Web 漏洞分析與防禦之 CSRF(二)
部落格地址:www.extlight.com
一、全稱
跨站請求偽造(Cross-site Request Forgery)
二、原理
在使用者登陸目標網站後,後端會返回使用者登陸的憑證到前端(瀏覽器的 cookie)。攻擊者誘使使用者點選某個超連結,該超連結會傳送惡意請求(會攜帶使用者的 cookie),從而冒充使用者完成業務請求(發帖、盜取使用者資金等)。
三、攻擊方式
筆者以網站的發帖功能為案例對 CSRF 攻擊進行簡單的講解。
3.1 提交 form 表單
下圖為模擬攻擊演示圖:
以下是演示圖中,"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 進行讀寫。
3.2 點選超連結
如果目標網站允許 get 請求,可通過超連結攻擊。如下圖:
超連結原始碼如下:
<a href="http://localhost:8080/article/save?userName=李四&content=超連結攻擊">點選獲取現金大獎</a>複製程式碼
3.3 載入圖片方式
更加粗暴的方式就是通過圖片傳送請求,如下圖:
圖片原始碼如下:
<img src="http://localhost:8080/article/save?userName=李四&content=圖片攻擊" />複製程式碼
四、防禦
CSRF 攻擊的一個特點是繞過目標網站的前端頁面(無法獲知頁面的資訊,如:驗證碼,token),在第三方網站傳送請求到目標網站後端。
4.1 禁止第三方網站攜帶 cookie
在網站後端,使用者登陸功能的程式碼中,設定 cookie 的 SameSite 的值為 Strict 返回給瀏覽器。
缺點:目前只有 chrome 和 opera 支援該屬性。
4.2 使用驗證碼
以論壇發帖為例,在發帖時,設定一個驗證碼,發帖後在後端進行校驗。CSRF 攻擊沒法獲取到驗證碼,從而目標網站得到了防禦。
4.3 使用 token
繼續以論壇發帖為例,在論壇後端跳轉發帖頁面的程式碼中隨機生成一個 N 位數的數字/字串作為 token,設定到 cookie 和任意變數名的變數中(最終放入到前端的 form 表單中)。當使用者在頁面發帖後,後端接收和校驗 cookie 中的 token 和 頁面提交的 token 是否一致。如果一致,則說明是使用者合法操作。
4.4 判斷 referer
referer 是 http 的請求頭,使用者傳送請求後,在後端獲取該請求頭,判斷它的值是否包含目標網站的域名。如果包含說明操作合法。