什麼是CSRF攻擊?

什麼是 CSRF 攻擊?

CSRF 概念:CSRF(Cross-site request forgery)跨站請求僞造,也被稱爲“One Click Attack”或者 Session Riding,通常縮寫爲 CSRF 或者 XSRF,是一種對網站的惡意利

儘管聽起來像跨站腳本(XSS),但它與 XSS 非常不同,XSS 利用站點內的信任用戶,而 CSRF 則通過僞裝成受信任用戶的請求來利用受信任的網站。

與 XSS 攻擊相比,CSRF 攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難 以防範,所以被認爲比 XSS 更具危險性。

CSRF 攻擊原理

瀏覽器中 HTTP(s) 請求是會自動幫我們把 cookie 帶上傳給服務端的。這樣在每次請求的時候通過 cookie 獲取 session id,然後 通過它在服務端獲取登錄信息即可完成用戶權限的校驗。 本來這也是個不錯的功能。但是由於 cookie 實在是太開放了,如果一個用戶在 A 網站 登錄了,並且在沒有登出的情況下(沒有清除本地信息,包括 cookie),用戶在 B 網站 訪問的時候發送了一個 A 網站的請求,那麼這個請求其實是帶有這個用戶在 A 網站的登 錄信息的。如果這時候 B 站發送的 A 網站請求是用戶不知道的,並且可以進行用戶非本 意操作(獲取信息,修改內容,轉賬等等)。那就是非常嚴重的危害了。以上的過程就是 跨站請求攻擊,即 Cross-Site Request Forgery,即 CSRF。 下面來看一張圖:

接下來按照上面的步驟,基於 NodeJS 服務的代碼來模擬 CSRF 攻擊。

1. 用戶訪問網站 A(localhost:8081)

網站 A 的頁面結構,以及相關交互。

<p>我是 server 1</p>
<button>登陸</button>
<script> 
$('button').on('click', function () {
    $.ajax({
        type: 'GET',
        url: '/login',
        success(data) {
            alert('成功')
        }
    });
})
</script>

服務器 A 的相關代碼 :

const express = require('express');
const cookieParser = require('cookie-parser');
const url = require('url');
const server1 = express();
server1.use(cookieParser());
server1.use(express.static('./server1'));
// 設置登陸接口
server1.get('/login', function (req, res) {
   res.cookie('id', 3000)
   res.end('ok')
});
// 設置查詢接口
server1.get('/getMoney', function (req, res) {
   res.end("" + server1Money);
});
// 設置支付接口
server1.get('/payMoney', function (req, res) {
 // 存在用戶 cookie id 幾個進行交易。
   if (req.cookies.id) {
 // 執行交易過程
   const query = url.parse(req.url, true).query;
   users[query.user] += +query.money;
   users.server1 -= +query.money;
   res.json(users);
 // 不存在跳轉到登陸界面,不允許操作。
   } else {
       res.redirect('/')
   }
});
// 監聽 8081 端口
server1.listen(8081, function () {
   console.log('server is running at 8081');
});

2. 用戶點擊登陸後,離開網站 A,訪問網站 B(localhost:8082)

3. 當用戶點擊鏈接夠,調用的其實是支付的接口。

經歷了這樣的過程,之後完成了一次 CSRF 攻擊,就是利用了瀏覽器裏面 cookie 使用過於 便利,當從有問題的網站發送出來,還是會獲取 cookie 獲取權限,最終導致這樣的問題。

CSRF 的危害

簡單總結 CSRF 漏洞就是利用網站權限校驗方面的漏洞在用戶不知覺的情況下發送請求, 達到“僞裝”用戶的目的。攻擊者利用 CSRF 實現的攻擊主要有以下幾種:

1. 攻擊者能夠欺騙受害用戶完成該受害者所允許的任一狀態改變的操作,比如:更新 賬號細節,完成購物,註銷甚至登錄等操作

2. 獲取用戶的隱私數據

3. 配合其他漏洞攻擊

4. CSRF 蠕蟲

其中 CSRF 蠕蟲如其名所指就是產生蠕蟲效果,會將 CSRF 攻擊一傳十,十傳百。如:某 社區私信好友的接口和獲取好友列表的接口都存在 CSRF 漏洞,攻擊者就可以將其組合成 一個 CSRF 蠕蟲——當一個用戶訪問惡意頁面後通過 CSRF 獲取其好友列表信息,然後再利 用私信好友的 CSRF 漏洞給其每個好友發送一條指向惡意頁面的信息,只要有人查看這個 信息裏的鏈接,CSRF 蠕蟲就會不斷傳播下去,其可能造成的危害和影響非常巨大。

從本質上講,CSRF 漏洞就是黑客將一個 http 接口中需要傳遞的所有參數都預測出來,然 後不管以什麼方式,他都可以根據他的目的來任意調用你的接口,對服務器實現 CURD 操 作,就是對服務器中的數據進行增刪改查。

如何防範 CSRF 攻擊

從上文的描述中我們可以知道 CSRF 有兩個特點:利用 cookie 自動攜帶的特性以及站攻擊。那麼針對這兩個特性可以使用如下解決方法:

檢查 Referer 字段

大家都知道 HTTP 頭中有一個 Referer 字段,這個字段用以標明請求來源於哪個地址。 通過在網站中校驗請求的該字段,我們能知道請求是否是從本站發出的。我們可以拒絕一 切非本站發出的請求,這樣避免了 CSRF 的跨站特性。這種方式利用了客戶端無法構造 Referrer 的特性,雖然簡單,不過當網站域名有多個, 或者經常變換域名的時候會變得非常的麻煩,同時也具有一定的侷限性。

Token 驗證

由於 CSRF 是利用了瀏覽器自動傳遞 cookie 的特性,另外一個防禦思路就是校驗信息不 通過 cookie 傳遞,在其他參數中增加隨機加密串進行校驗。爲每一個提交增加一個指定 串參數,該參數服務端通過頁面下發,放到 localStorage 中,每次請求的時候補充到提 交參數中,服務端通過校驗該參數是否一致來判斷是否是用戶請求。由於 CSRF 攻擊中攻 擊者是無從事先得知該字符串,所以服務端就可以通過校驗該值拒絕可以請求。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章