跨站請求偽造 (CSRF)
? 跨站請求偽造(CSRF,Cross-Site Request Forgery) 是一種網絡攻擊方式,攻擊者誘使受害者在未經其授權的情況下執行特定操作。CSRF 利用受害者已登錄的身份和瀏覽器自動發送的認證信息(如 Cookie)來冒充受害者,發起未經授權的請求。此攻擊通常會導致嚴重的安全問題,特別是在銀行、電子商務和社交網絡等網站上。
CSRF 攻擊的工作原理
銀行轉賬操作案例
-
用戶登錄銀行網站
用戶訪問銀行網站并登錄,提交登錄憑據后,銀行生成會話 Cookie 并存儲在瀏覽器中:Cookie: JSESSIONID=randomid
用戶在登錄后未注銷,瀏覽器保存此 Cookie 用于后續的認證。
-
銀行提供的合法轉賬表單
銀行網站的轉賬表單如下:<form method="post" action="https://bank.example.com/transfer"><input type="text" name="amount" placeholder="Amount" /><input type="text" name="routingNumber" placeholder="Routing Number" /><input type="text" name="account" placeholder="Account Number" /><input type="submit" value="Transfer" /> </form>
用戶提交數據后,瀏覽器發送如下請求:
POST /transfer HTTP/1.1 Host: bank.example.com Cookie: JSESSIONID=randomid Content-Type: application/x-www-form-urlencodedamount=200&routingNumber=1234&account=5678
-
攻擊者設置陷阱
攻擊者創建了一個惡意網站,并設計了一段 HTML 代碼模擬銀行的轉賬操作:<form method="post" action="https://bank.example.com/transfer"><input type="hidden" name="amount" value="500" /><input type="hidden" name="routingNumber" value="attackerRouting" /><input type="hidden" name="account" value="attackerAccount" /><input type="submit" value="Click to Claim Prize" /> </form>
攻擊者誘使用戶訪問該頁面,用戶無意間點擊了提交按鈕,觸發請求。
-
后果
瀏覽器發送以下請求到銀行服務器:POST /transfer HTTP/1.1 Host: bank.example.com Cookie: JSESSIONID=randomid Content-Type: application/x-www-form-urlencodedamount=500&routingNumber=attackerRouting&account=attackerAccount
銀行服務器因為依賴 Cookie 自動認證,誤以為是用戶本人發起的合法操作,將資金轉入攻擊者賬戶。
CSRF 的核心特點
- 自動發送憑據
瀏覽器會自動攜帶與目標網站相關的 Cookie 和其他認證信息。 - 用戶無感知
用戶通常不會察覺攻擊的發生,因為它可能嵌入在正常網頁或隱藏的代碼中。 - 利用受信任身份
服務器將受害者的身份視為合法,因此執行攻擊者設計的操作。
CSRF 攻擊的危害
- 資金損失:攻擊者可通過偽造請求進行轉賬或支付操作。
- 數據篡改:攻擊者可修改用戶數據,如更改密碼、郵箱等。
- 賬戶劫持:攻擊者可利用 CSRF 攻擊獲取用戶權限,進一步控制賬戶。
- 服務濫用:攻擊者可利用受害者的身份執行惡意操作,如發送垃圾郵件或發起 DDoS 攻擊。
防范 CSRF 攻擊的方法
1. 使用 CSRF Token
-
在表單或請求中添加一個隨機生成的 Token,服務器驗證該 Token 是否匹配。
-
示例:
<form method="post" action="/transfer"><input type="hidden" name="csrf_token" value="randomly_generated_token" /><input type="text" name="amount" /><input type="submit" value="Transfer" /> </form>
2. 驗證請求來源
-
檢查
Referer
或Origin
頭部,確保請求來自合法的源。 -
示例:
Referer: https://bank.example.com Origin: https://bank.example.com
3. 使用 SameSite Cookie
-
設置 Cookie 的
SameSite
屬性為Strict
或Lax
,防止跨站請求攜帶 Cookie。 -
示例:
Set-Cookie: JSESSIONID=randomid; SameSite=Strict
4. 限制安全方法
- 確保安全方法(如
GET
、HEAD
、OPTIONS
)是只讀的,不用于修改數據。 - 示例:
- 使用
POST
或PUT
方法執行寫操作。 - 避免使用
GET
方法執行敏感操作。
- 使用
5. 雙重認證
- 對敏感操作(如轉賬、修改密碼)要求用戶進行雙重認證,例如輸入短信驗證碼。
6. 定期安全測試
- 使用自動化工具(如 OWASP ZAP)進行安全測試,檢查是否存在 CSRF 漏洞。
其他防護建議
- 避免直接使用 GET 方法進行狀態改變:避免使用 GET 請求來執行會影響服務器狀態的操作,例如提交表單、修改數據等。始終使用 POST 方法來進行更改操作。
- 對應用進行安全審計和滲透測試:定期進行 CSRF 漏洞檢測,包括使用自動化工具(如 OWASP ZAP)進行測試,確保應用程序沒有 CSRF 漏洞。
- 教育用戶:雖然大部分防護措施都在技術層面,但用戶教育也很重要。提醒用戶不要隨便點擊未知網站的鏈接或填寫不明網站的表單。
擴展閱讀
- OWASP CSRF Prevention Cheat Sheet
- 《Web應用程序安全權威指南》