2020年5月27日

[資安] 跨站偽造請求(Cross Site Request Forger, CSRF, XSRF) 的說明與預防

Photo by Clint Patterson on Unsplash Photo by Clint Patterson on Unsplash
keywords: csrf, internet security, one-click-attack, session-riding, XSRF

Cross Site Request Forgery 是什麼

跨站偽造請求(cross-site request forgery)也稱為 one-click attacksession 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 在處理此請求時會拋出錯誤。

參考

0 意見:

張貼留言