跨站點請求偽造 (CSRF),也稱為 XSRF、Sea Surf 或 Session Riding,是一種攻擊媒介,可誘使 Web 瀏覽器在用戶登錄的應用程序中執行不需要的操作。成功的 CSRF 攻擊對企業和用戶來說都是毀滅性的。它可能導致客戶關系受損、未經授權的資金轉移、密碼更改和數據盜竊——包括會話 cookie 被盜。CSRF 通常使用惡意社會工程進行,例如誘使受害者向服務器發送偽造請求的電子郵件或鏈接。由于毫無戒心的用戶在受到攻擊時通過其應用程序進行了身份驗證,因此無法區分合法請求和偽造請求。
CSRF 示例
在執行攻擊之前,犯罪者通常會研究應用程序,以使偽造的請求看起來盡可能合法。
例如,一個典型的 100 美元銀行轉賬的 GET 請求可能如下所示:
獲取 http://netbank.com/transfer.do?acct=PersonB&amount=$100 HTTP/1.1
黑客可以修改此腳本,從而將 100 美元轉入他們自己的帳戶。現在惡意請求可能看起來像:
獲取 http://netbank.com/transfer.do?acct=AttackerA&amount=$100 HTTP/1.1
壞人可以將請求嵌入到看起來無辜的超鏈接中:
<a >了解更多!</a>
接下來,他可以通過電子郵件將超鏈接分發給大量銀行客戶。那些在登錄銀行賬戶時點擊鏈接的人將無意中發起 100 美元的轉賬。請注意,如果銀行的網站僅使用 POST 請求,則不可能使用 <a> href 標記構建惡意請求。但是,攻擊可以在自動執行嵌入式 JavaScript 的 <form> 標記中進行。
這種形式可能是這樣的:
<body onload="document.forms[0].submit()"> <form action="http://netbank.com/transfer.do" method="POST"> <input type="hidden" name="acct" value="攻擊者A"/> <input type="hidden" name="amount" value="$100"/> <input type="submit" value="查看我的圖片!"/> </表格> </body>
緩解 CSRF 的方法
存在許多有效的方法來預防和緩解 CSRF 攻擊。從用戶的角度來看,預防是保護登錄憑證和拒絕未經授權的行為者訪問應用程序的問題。
最佳實踐包括:
- 在不使用時注銷 Web 應用程序
- 保護用戶名和密碼
- 不允許瀏覽器記住密碼
- 避免在登錄應用程序時同時瀏覽
對于 Web 應用程序,存在多種解決方案來阻止惡意流量和防止攻擊。最常見的緩解方法之一是為每個會話請求或 ID生成唯一的隨機令牌。這些隨后由服務器檢查和驗證。具有重復標記或缺失值的會話請求將被阻止。或者,與其會話 ID 令牌不匹配的請求將被阻止到達應用程序。
雙重提交 cookie 是另一種眾所周知的阻止 CSRF 的方法。與使用唯一令牌類似,隨機令牌被分配給 cookie 和請求參數。然后,服務器在授予對應用程序的訪問權限之前驗證令牌是否匹配。雖然有效,但如果受保護站點鏈接到外部 URL,則令牌可以在多個點暴露,包括在瀏覽器歷史記錄、HTTP 日志文件、記錄 HTTP 請求第一行的網絡設備和引薦來源網址標頭中。這些潛在的弱點使代幣成為一種不完全證明的解決方案。
使用自定義規則防止 CSRF 攻擊
CSRF 攻擊的高度個性化特性阻礙了通用解決方案的開發。但是,可以采用自定義安全策略來防止可能的 CSRF 場景。IncapRules是 Imperva 云專有的自定義規則引擎,可讓客戶創建自己的安全策略。這些策略是使用直觀的語法生成的,可以即時修改,從而增強我們默認的?Web 應用程序防火墻?配置。
使用 IncapRules,您可以創建一個策略,根據您的 HTTP 引用標頭內容過濾對敏感頁面和功能的請求。這樣做允許從一個簡短的安全域列表中執行請求。這種方法完全對抗 CSRF 攻擊的社會工程方面。無論內容如何,??它都可以防止在安全范圍之外執行惡意請求。或者,您可以在“僅警報”模式下運行規則以跟蹤可能的利用嘗試,或提供驗證碼以提醒粗心的用戶。