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

moonlightL發表於2017-10-12

原文地址:Web 漏洞分析與防禦之 CSRF(二)
部落格地址:www.extlight.com

一、全稱

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

二、原理

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

三、攻擊方式

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

3.1 提交 form 表單

下圖為模擬攻擊演示圖:

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 進行讀寫。

3.2 點選超連結

如果目標網站允許 get 請求,可通過超連結攻擊。如下圖:

image
image

超連結原始碼如下:

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

3.3 載入圖片方式

更加粗暴的方式就是通過圖片傳送請求,如下圖:

image
image

圖片原始碼如下:

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

四、防禦

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 的請求頭,使用者傳送請求後,在後端獲取該請求頭,判斷它的值是否包含目標網站的域名。如果包含說明操作合法。

五、參考資料

相關文章