[IS] 跨站偽造請求(Cross site request forgery, CSRF)是什麼?
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 在處理此請求時會拋出錯誤。
參考
- Cross-Site Request Forgery Prevention Cheat Sheet @ OWASP Cheat Sheet
- What is Cross-Site Request Forgery? @ Cloud Flare
- Cross Site Request Forgery @ Rails Guides
- 資安補漏洞,越補越大洞 @ iT 邦幫忙