Logo image
GitHub LinkedIn

【XSS】CSRF 與 CORS 攻擊

Relume placeholder avatar
張三

2022年1月11日

5分鐘閱讀

Relume placeholder image

:::note 這邊是《Beyond XSS:探索網頁前端資安宇宙》第三章讀書會筆記。 這一樓還在蓋,請稍後再來。 :::

CSRF 攻擊

CSRF(Cross-site request forgery)跨站請求偽造,是一種網站應用安全漏洞。該漏洞會導致用戶在不知情的情況下,以其身份對網站發送非預期的請求。這些請求可能包括更改用戶資料、發送郵件等操作。攻擊者通常會通過引誘用戶點擊特定的鏈接或訪問特定的網站,來觸發 CSRF 攻擊。

  1. 攻擊者在自己的網站上放置一個連結,連結到受害者的網站上。
<a href="wendy-website.com/delete?id=1">刪除文章</a>

同時 Cookie 也會被帶入,這樣就可以進行 CSRF 攻擊。

  1. 透過 image
<img src="wendy-website.com/delete?id=1" />
  1. form
<form action="wendy-website.com/delete" method="POST">
  <input type="hidden" name="id" value="1" />
  <input type="submit" value="刪除文章" />
</form>

防禦 CSRF 攻擊

  1. 單純設定 SameSite 屬性

SameSite Cookie 是一種 Cookie 的屬性,可以讓瀏覽器在發送跨站請求時,不會帶上 Cookie。這樣就可以防止 CSRF 攻擊。

  • 可以設定 StrictLaxStrict 表示完全禁止第三方 Cookie,Lax 表示只有 GET 方法會帶上 Cookie。

  • Lax: 只有 GET 方法會帶上 Cookie,POST 方法不會帶上 Cookie。

  • Strict: 完全禁止第三方 Cookie。

document.cookie = 'name=value; SameSite=Lax';
  1. 準備兩組 Cookie
  • 一組是 SameSite 設定為 Strict,另一組是 SameSite 設定為 Lax
document.cookie = 'name=value; SameSite=Strict'; // 允許 POSt 方法
document.cookie = 'name=value; SameSite=Lax'; // 允許 GET 方法 => 應用於需要使用者體驗的場景

但是有可能被繞過

  1. 透過 GET 方法
GET http://wendy-website.com/delete?id=1
  1. 透過表單提交
<form action="wendy-website.com/delete" method="POST">
  <input type="hidden" name="id" value="1" />
  <input type="submit" value="刪除文章" />
</form>

可以防禦 Same Origin 但可能防禦不到 Same Site

  • facebook.com
  • sandbox.facebook.com

攻擊網站範例

  1. Subdomain Takeover

Subdomain Takeover 是一種網站應用安全漏洞。當一個子域名指向的服務不再使用時,攻擊者可以註冊該子域名,並將其指向自己的服務。這樣攻擊者就可以在該子域名上執行任意 JavaScript 代碼,進而竊取用戶的 Cookie。

  • S3 被刪除、但是 DNS 設定還在
  1. 錯誤的 CORS 設定
const domain = 'huli.tw';

// 避免未知的假設
if (origin === domain) {
  res.setHeader('Access-Control-Allow-Origin', domain);
}

透過子網域的 Cookie 去覆蓋主網域的 Cookie

s3.holi.tw 可以覆蓋 holi.tw 的 Cookie

防禦

  1. 使用 __Host- 的 Cookie 屬性
  • 例如:__Host-__Secure-
  1. 分流:
  • 主網域:放重要的
  • 子網域:放不重要的

探索更多精彩內容

繼續閱讀,了解更多技術與個人經歷的精彩文章。