[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="..."
/>