目錄
1、概念
2、攻擊原理:視覺欺騙與層疊控制
3、點擊劫持的危害
4、防御點擊劫持
4.1?X-Frame-Options?HTTP 響應頭 (最直接有效)
4.2?Content-Security-Policy?(CSP) HTTP 響應頭 (現代、更強大)
4.3?客戶端 JavaScript 防御 (Frame Busting)
1、概念
點擊劫持(Clickjacking),也被稱為“UI 覆蓋攻擊”或“UI 偽裝攻擊”,是一種惡意技術,攻擊者通過欺騙用戶在不知情的情況下點擊看似無害的網頁元素(如按鈕、鏈接),但實際上點擊的是攻擊者精心隱藏的、位于誘餌頁面透明層下方的另一個頁面的敏感元素(如轉賬按鈕、權限授權按鈕、刪除按鈕等)。
跨域限制的繞過:?同源策略限制了 JavaScript 跨域讀取 iframe 內容,但無法阻止 iframe 的嵌入和接收用戶輸入事件(如點擊)。這是點擊劫持能發生的根本技術基礎。
2、攻擊原理:視覺欺騙與層疊控制
攻擊的關鍵在于利用 HTML 的?iframe
?元素和 CSS 的層疊(z-index)、透明度(opacity)和定位(positioning)屬性:
-
創建透明框架:?攻擊者將目標網站(例如用戶的銀行頁面、社交媒體設置頁面、管理員后臺等)嵌入到一個透明的?
iframe
?中。 -
設計誘餌頁面:?攻擊者精心設計一個看起來無害、有吸引力的頁面(例如一個有趣的游戲、一個免費贈品的領取頁面、一個引人注目的視頻縮略圖等)。這個頁面就是用戶實際看到并與之交互的頁面。
-
覆蓋與定位:?攻擊者使用 CSS 將透明的目標網站?
iframe
?精確地覆蓋在誘餌頁面的特定可點擊元素(如“開始游戲”、“領取獎品”、“播放視頻”按鈕)之上。通常,誘餌按鈕會被做得很大或很誘人,而透明的?iframe
?中的敏感按鈕(如“確認轉賬”、“授權訪問”、“刪除賬戶”)則被定位到恰好位于誘餌按鈕的下方。 -
用戶交互:?用戶被誘騙訪問這個惡意頁面。用戶看到的是誘餌頁面上的按鈕(例如“點擊贏大獎”),并毫無戒心地點擊它。
-
惡意操作執行:?由于透明的?
iframe
?覆蓋在誘餌按鈕之上,用戶的點擊實際上落在了?iframe
?內目標網站的那個敏感按鈕上。如果用戶已經在目標網站登錄(例如瀏覽器保存了登錄狀態),那么這個操作(如轉賬、授權、刪除)就會以用戶的身份成功執行,而用戶對此毫不知情,以為自己只是在玩一個游戲或領取獎品。
3、點擊劫持的危害
-
未經授權的資金轉移:?劫持銀行網站的轉賬操作。
-
賬戶接管:?劫持更改密碼、郵箱或安全設置的按鈕。
-
隱私泄露:?劫持“授權應用訪問”按鈕,將賬戶權限授予惡意應用。
-
社交媒體濫用:?劫持“點贊”、“關注”、“分享”甚至“發布”按鈕,在用戶不知情下發布垃圾信息或不當內容。
-
數據刪除:?劫持“刪除郵件”、“刪除文件”、“刪除賬戶”按鈕。
-
傳播惡意軟件:?劫持“下載”或“安裝”按鈕。
-
竊取敏感信息:?通過拖拽劫持等方式。
4、防御點擊劫持
防御主要依靠網站所有者在服務器端設置 HTTP 響應頭,告訴瀏覽器該頁面是否允許被嵌入到 iframe 中,以及誰可以嵌入:
4.1?X-Frame-Options
?HTTP 響應頭 (最直接有效)
-
DENY
: 頁面絕對不允許被嵌入到任何 iframe 中。 -
SAMEORIGIN
: 頁面只允許被同源網站(相同協議、域名、端口)的頁面嵌入。
4.2?Content-Security-Policy
?(CSP) HTTP 響應頭 (現代、更強大)
-
使用?
frame-ancestors
?指令來指定哪些頁面可以嵌入該頁面。 -
例如:
-
Content-Security-Policy: frame-ancestors 'none';
?(等同于?X-Frame-Options: DENY
) -
Content-Security-Policy: frame-ancestors 'self';
?(等同于?X-Frame-Options: SAMEORIGIN
) -
Content-Security-Policy: frame-ancestors https://trusted.example.com;
?(只允許特定可信域名嵌入)
-
-
CSP 提供了比?
X-Frame-Options
?更細粒度的控制。
4.3?客戶端 JavaScript 防御 (Frame Busting)
-
在頁面中加入腳本,檢測自己是否被嵌套在 iframe 中,如果是,則嘗試跳出框架(如?
if (top != self) top.location = self.location;
)。 -
局限性:?現代瀏覽器有多種方式可以被攻擊者利用來繞過 Frame Busting 腳本(如使用?
sandbox
?屬性限制腳本執行、使用?XSS
?先破壞頁面本身等)。因此,這只能作為輔助手段,不能替代服務端設置 HTTP 頭。