點擊劫持 (UI 覆蓋攻擊)
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 上不可見的「轉帳」按鈕。
關鍵條件:
- 目標網站允許在 iframe 中嵌入。
- 用戶已在目標網站上認證。
- 目標操作可以透過單次點擊觸發。
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。
攻擊過程:
- 攻擊者建立了帶有誘人內容的頁面,如「不要點擊這裡」或假的 Flash 播放器按鈕。
- 在這些按鈕後面是一個不可見的 iframe,其中包含針對特定帳號的 Twitter 追蹤按鈕。
- 當用戶點擊時,他們在不知情的情況下追蹤了攻擊者的 Twitter 帳號。
- 被追蹤的帳號隨後發送包含同一惡意頁面連結的私訊。
影響: 該蠕蟲病毒式傳播,一些帳號在數小時內獲得了數十萬追蹤者。它展示了點擊劫持如何在社群平台上實現自我傳播的攻擊。
5. 深度防禦策略
A. X-Frame-Options 標頭
防止框架攻擊的經典防禦手段。
X-Frame-Options: DENYDENY: 頁面不能在任何框架中顯示。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. 用戶互動確認
對於關鍵操作,要求額外確認:
- 重新認證: 敏感操作需要重新輸入密碼。
- 驗證碼: 證明是人類意圖。
- 兩步操作: 要求明確的確認對話框。
