CSRF攻擊原理及預防手段

JayChen發表於2019-02-16

CSRF全程 Cross Site Request Forgery, 跨站域請求偽造.這種攻擊方式相對於XSS,SQL隱碼攻擊等攻擊方式比較晚被發現,今天就來講解下這種攻擊方式以及避免方式.

攻擊過程

  • 假設abc使用者登入銀行的網站進行操作, 同時也訪問了攻擊者預先設定好的網站.

  • abc點選了攻擊者網站的某一個連結,這個連結是http://www.bank.com/xxxx指向銀行,銀行伺服器會根據這個連結攜帶的引數會進行轉賬操作.

  • 銀行伺服器在執行轉賬操作之前會進行SESSION驗證是否登入, 但是由於abc已經登入了銀行網站,攻擊者的連結也是www.bank.com.所以攻擊的連結就會攜帶session id到銀行伺服器.

  • 由於session id是正確的,所以銀行會判斷操作是由本人發起的,執行轉賬操作.

演示

根據上面的說明,我們來模擬一下攻擊的過程.

  • www.bank.comwww.hacker.com.使用者abc登入www.bank.com網站之後點選了www.hacker.com的點選抽大獎的誘騙連結

  • 此連結會向www.bank.com發起一個post請求.由於請求域名為www.bank.com,所以請求會攜帶www.bank.com的session id.

www.hacker.com的程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="http://www.bank.com/transfer.php">
    <input type="hidden" name="from" value="abc">
    <input type="hidden" name="money" value="10000">
    <input type="hidden" name="to" value="hacker">
    <input type="button" onclick="submit()" value="點選抽大獎">
</form>
</body>

可以發現,www.hacker.com的網頁中包含了一個向www.bank.com發起的post請求.並且表單都沒隱藏了,只有一個誘騙使用者點選的按鈕.

完整的例項程式碼可以在github上找到.傳送門.

預防

從上面的例子 可以看到csrf攻擊.黑客不能拿到cookie,也沒辦法對伺服器返回的內容進行解析.唯一能做的就是給伺服器傳送請求.通過傳送請求改變伺服器中的資料.上面的例子中攻擊者誘導使用者點選連結進行轉賬操作,使得銀行資料庫中受害者的金額發生了改變.

瞭解了csrf攻擊的原理和目標,提出了兩種防禦手段

referer 驗證

根據HTTP協議,在http請求頭中包含一個referer的欄位,這個欄位記錄了該http請求的原地址.通常情況下,執行轉賬操作的post請求www.bank.com/transfer.php應該是點選www.bank.com網頁的按鈕來觸發的操作,這個時候轉賬請求的referer應該是www.bank.com.而如果黑客要進行csrf攻擊,只能在自己的網站www.hacker.com上偽造請求.偽造請求的referer是www.hacker.com.所以我們通過對比post請求的referer是不是www.bank.com就可以判斷請求是否合法.

這種方式驗證比較簡單,網站開發者只要在post請求之前檢查referer就可以,但是由於referer是由瀏覽器提供的.雖然http協議有要求不能篡改referer的值.但是一個網站的安全性絕對不能交由其他人員來保證.

token 驗證

從上面的樣式可以發現,攻擊者偽造了轉賬的表單,那麼網站可以在表單中加入了一個隨機的token來驗證.token隨著其他請求資料一起被提交到伺服器.伺服器通過驗證token的值來判斷post請求是否合法.由於攻擊者沒有辦法獲取到頁面資訊,所以它沒有辦法知道token的值.那麼偽造的表單中就沒有該token值.伺服器就可以判斷出這個請求是偽造的.

相關文章