Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

點擊劫持 (UI 覆蓋攻擊)

| , 3 minutes reading.

1. 定義

點擊劫持 (Clickjacking)(又稱「UI 覆蓋攻擊」)是一種惡意技術,攻擊者欺騙用戶點擊與其感知不同的內容。攻擊者將目標網站載入到透明的 iframe 中,並將其覆蓋在誘餌頁面之上,使得用戶對可見頁面的點擊實際上作用於隱藏的目標網站。

這允許攻擊者劫持原本針對可見頁面的點擊,並將其重新導向到用戶已認證的另一個網站上執行非預期的操作。

2. 技術原理

該攻擊利用瀏覽器使用 CSS 定位和透明度來分層 Web 內容的能力。

攻擊結構:

<!-- 攻擊者頁面 -->
<style>
  iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 500px;
    height: 200px;
    opacity: 0;        /* 不可見 */
    z-index: 2;        /* 在最上層 */
  }
  .decoy-button {
    position: absolute;
    top: 50px;
    left: 100px;
    z-index: 1;        /* 在 iframe 下方 */
  }
</style>

<button class="decoy-button">點擊領取獎品!</button>
<iframe src="https://bank.com/transfer?to=attacker&amount=1000"></iframe>

當用戶點擊「領取獎品」按鈕時,他們實際上點擊了 bank.com 上不可見的「轉帳」按鈕。

關鍵條件:

  1. 目標網站允許在 iframe 中嵌入。
  2. 用戶已在目標網站上認證。
  3. 目標操作可以透過單次點擊觸發。

3. 攻擊流程

sequenceDiagram
    participant Victim as 受害者
    participant AttackerPage as 攻擊者頁面
    participant TargetSite as iframe 中的目標網站

    Victim->>AttackerPage: 造訪惡意頁面

    Note over AttackerPage: 頁面在不可見的<br/>iframe 中載入目標網站

    AttackerPage-->>Victim: 顯示誘餌內容<br/>領取獎品按鈕

    Victim->>AttackerPage: 點擊誘餌按鈕

    Note over Victim,TargetSite: 點擊穿透到<br/>不可見的 iframe

    Victim->>TargetSite: 實際點擊了刪除帳號按鈕

    TargetSite-->>TargetSite: 操作已執行<br/>帳號已刪除

    TargetSite-->>Victim: 隱藏 iframe 中顯示確認頁面

4. 真實案例:Twitter 蠕蟲 (2009)

目標: Twitter「追蹤」按鈕功能。 漏洞類別: 經典點擊劫持 / UI 覆蓋。

漏洞背景: 2009 年,Twitter 沒有實施 frame-busting 或 X-Frame-Options 標頭。任何頁面都可以在 iframe 中嵌入 Twitter。

攻擊過程:

  1. 攻擊者建立了帶有誘人內容的頁面,如「不要點擊這裡」或假的 Flash 播放器按鈕。
  2. 在這些按鈕後面是一個不可見的 iframe,其中包含針對特定帳號的 Twitter 追蹤按鈕。
  3. 當用戶點擊時,他們在不知情的情況下追蹤了攻擊者的 Twitter 帳號。
  4. 被追蹤的帳號隨後發送包含同一惡意頁面連結的私訊。

影響: 該蠕蟲病毒式傳播,一些帳號在數小時內獲得了數十萬追蹤者。它展示了點擊劫持如何在社群平台上實現自我傳播的攻擊。

5. 深度防禦策略

A. X-Frame-Options 標頭

防止框架攻擊的經典防禦手段。

X-Frame-Options: DENY
  • DENY 頁面不能在任何框架中顯示。
  • SAMEORIGIN 頁面只能被同源頁面嵌入框架。

注意: 此標頭現在被視為遺留方案。請改用 CSP frame-ancestors。

B. Content-Security-Policy: frame-ancestors

現代且更靈活的方法。

Content-Security-Policy: frame-ancestors 'self' https://trusted-partner.com
  • 'none' 等同於 X-Frame-Options: DENY。
  • 'self' 僅同源可以嵌入框架。
  • 特定網域: 白名單信任的嵌入方。

C. JavaScript Frame Busting(備選方案)

用於不支援標頭的舊版瀏覽器的遺留技術。

// 基本的框架破解
if (top !== self) {
  top.location = self.location;
}

警告: 這可以透過 sandbox 屬性繞過:

<iframe src="target.com" sandbox="allow-scripts"></iframe>

現代防禦應依賴 HTTP 標頭,而非 JavaScript。

D. SameSite Cookies

即使被嵌入框架,也可防止工作階段 Cookie 在跨站 iframe 上下文中被發送。

Set-Cookie: session=abc123; SameSite=Strict; Secure

這會破壞攻擊,因為目標網站不會將用戶識別為已認證。

E. 用戶互動確認

對於關鍵操作,要求額外確認:

  • 重新認證: 敏感操作需要重新輸入密碼。
  • 驗證碼: 證明是人類意圖。
  • 兩步操作: 要求明確的確認對話框。

6. 參考資料