![Photo by Clint Patterson on Unsplash Photo by Clint Patterson on Unsplash](https://1.bp.blogspot.com/-pOZLnobhgLY/Xs5QxUR5LvI/AAAAAAADCzQ/cbh30vL2mrA0e6RzvgyGp18lKpn1F0HzgCK4BGAsYHg/w640-h428/clint-patterson-dYEuFB8KQJk-unsplash.jpg)
keywords: csrf, internet security, one-click-attack, session-riding, XSRF
Cross Site Request Forgery 是什麼
跨站偽造請求(cross-site request forgery)也稱為 one-click attack 或 session riding,通常縮寫為 CSRF(有時發音為 sea-surf) 或 XSRF,這是一種利用伺服器所信任的網站來發送惡意請求的攻擊;和 cross-site scripting (XSS) 不同,XSS 是透過在網站上輸入惡意程式碼的方式來進行攻擊,通常利用的是「使用者對目標網站」的信任;而 CSRF 則是攻擊者利用「目標網站對該信用者」的信任。透過 CSRF 攻擊有機會讓使用者在無意間修改受害者的帳號密碼,或將帳戶內的金額轉帳給攻擊者。
CSRF 通常有以下流程:
- 使用者使用正常流程登入「目標網站」
- 「惡意網站」利用目標網站對使用者的信任(credentials),例如 Cookies
- 欺騙使用者到「惡意網站」後,誘使使用者點擊某個按鈕,但這個按鈕可能會送出表單,而該表單的請求對象是對到「目標網站」
- 瀏覽器預設會把使用者在「目標網站」的 Cookie 連帶送出,因此雖然該請求是在「惡意網站」發出,但「目標網站」收到請求時因為帶有 credentials,所以會誤以為是合法的請求。
攻擊可能的樣子
使用者一旦點擊下方的連結,即會向「目標網站」送出 Post 請求:
<!-- - Code from Rails Guides - https://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf --> <a href="http://www.harmless.com/" onclick=" var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit(); return false;" >To the harmless survey</a >
或者使用者只要將滑鼠移過某一張圖片時,即透過 JavaScript 執行指令:
<!-- - Code from Rails Guides - https://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf --> <img src="http://www.harmless.com/img" width="400" height="400" onmouseover="..." />
解決方式
現在多數的框架都支援去防範 CSRF 的攻擊。舉例來說,在 Ruby on Rails 的網頁應用程式中,由本站的表單或透過 AJAX 向伺服器發送的請求中都加上 security token(X-CSRF-Token),並於伺服器端驗證此 Token。由於這個 Token 只能在瀏覽本站時取得,因此攻擊者透過惡意網站試圖向伺服器發送請求時,雖然這個請求帶有認證過的 Cookie,但因為它並沒有帶有合法的 X-CSRF-Token,Rails 在處理此請求時會拋出錯誤。
參考
- WebGoat
- Cross Site Request Forgery @ Rails Guides
- 資安補漏洞,越補越大洞 @ iT 邦幫忙
0 意見:
張貼留言