點(diǎn)擊劫持是一種誘騙用戶點(diǎn)擊不可見或偽裝成其他元素的網(wǎng)頁元素的攻擊。這可能會(huì)導(dǎo)致用戶無意中下載惡意軟件、訪問惡意網(wǎng)頁、提供憑據(jù)或敏感信息、轉(zhuǎn)賬或在線購買產(chǎn)品。
通常,點(diǎn)擊劫持是通過在用戶看到的頁面頂部的 iframe 內(nèi)顯示一個(gè)不可見的頁面或 HTML 元素來執(zhí)行的。用戶認(rèn)為他們點(diǎn)擊的是可見頁面,但實(shí)際上他們點(diǎn)擊的是移調(diào)到其頂部的附加頁面中的不可見元素。
不可見頁面可能是惡意頁面,也可能是用戶不打算訪問的合法頁面——例如,用戶銀行網(wǎng)站上授權(quán)轉(zhuǎn)賬的頁面。
點(diǎn)擊劫持攻擊有多種變體,例如:
- Likejacking??– 一種操縱 Facebook“喜歡”按鈕的技術(shù),導(dǎo)致用戶“喜歡”他們實(shí)際上不打算喜歡的頁面。
- Cursorjacking??– 一種 UI 修復(fù)技術(shù),可將用戶感知到的位置的光標(biāo)更改為另一個(gè)位置。Cursorjacking 依賴于 Flash 和 Firefox 瀏覽器中的漏洞,這些漏洞現(xiàn)已修復(fù)。
點(diǎn)擊劫持攻擊示例
- 攻擊者創(chuàng)建了一個(gè)有吸引力的頁面,承諾為用戶提供免費(fèi)的塔希提島之旅。
- 在后臺(tái),攻擊者檢查用戶是否登錄到他的銀行站點(diǎn),如果是,則加載啟用資金轉(zhuǎn)移的屏幕,使用查詢參數(shù)將攻擊者的銀行詳細(xì)信息插入表單。
- 銀行轉(zhuǎn)賬頁面顯示在免費(fèi)禮物頁面上方的一個(gè)不可見的 iframe 中,“確認(rèn)轉(zhuǎn)賬”按鈕與用戶可見的“接收禮物”按鈕完全對(duì)齊。
- 用戶訪問該頁面并單擊“Book My Free Trip”按鈕。
- 實(shí)際上,用戶點(diǎn)擊了不可見的 iframe,并點(diǎn)擊了“Confirm Transfer”按鈕。資金轉(zhuǎn)移給攻擊者。
- 用戶被重定向到包含免費(fèi)禮物信息的頁面(不知道后臺(tái)發(fā)生了什么)。
此示例說明,在點(diǎn)擊劫持攻擊中,無法將惡意操作(在本例中是在銀行網(wǎng)站上)追溯到攻擊者,因?yàn)橛脩羰窃诤戏ǖ卿涀约旱膸舻那闆r下執(zhí)行的。
點(diǎn)擊劫持緩解
防御點(diǎn)擊劫持的一般方法有兩種:
- 客戶端方法?——最常見的方法稱為 Frame Busting。客戶端方法在某些情況下可能有效,但被認(rèn)為不是最佳實(shí)踐,因?yàn)樗鼈兒苋菀妆焕@過。
- 服務(wù)器端方法?——最常見的是 X-Frame-Options。服務(wù)器端方法被安全專家推薦為防御點(diǎn)擊劫持的有效方法。
使用 X-Frame-Options 響應(yīng)標(biāo)頭減輕點(diǎn)擊劫持
X-Frame-Options 響應(yīng)標(biāo)頭作為網(wǎng)頁 HTTP 響應(yīng)的一部分傳遞,指示是否應(yīng)允許瀏覽器在 <FRAME> 或 <IFRAME> 標(biāo)記內(nèi)呈現(xiàn)頁面。
X-Frame-Options 標(biāo)頭允許三個(gè)值:
- DENY??– 不允許任何域在框架內(nèi)顯示此頁面
- SAMEORIGIN??– 允許當(dāng)前頁面顯示在另一個(gè)頁面的框架中,但僅限于當(dāng)前域
- ALLOW-FROM URI——?允許當(dāng)前頁面顯示在框架中,但僅限于特定的 URI——例如?www.example.com/frame-page
使用 SAMEORIGIN 選項(xiàng)來防御點(diǎn)擊劫持
X-Frame-Options 允許內(nèi)容發(fā)布者防止他們自己的內(nèi)容被攻擊者在不可見的框架中使用。DENY 選項(xiàng)是最安全的,它可以防止在框架中使用當(dāng)前頁面。更常見的是,使用 SAMEORIGIN,因?yàn)樗_實(shí)允許使用框架,但將它們限制在當(dāng)前域內(nèi)。
X-Frame-Options 的局限性
- 要跨網(wǎng)站啟用 SAMEORIGIN 選項(xiàng),X-Frame-Options 標(biāo)頭需要作為每個(gè)單獨(dú)頁面的 HTTP 響應(yīng)的一部分返回(不能跨站點(diǎn)應(yīng)用)。
- X-Frame-Options 不支持允許域的白名單,因此它不適用于需要在它們之間顯示框架內(nèi)容的多域站點(diǎn)。
- 單個(gè)頁面上只能使用一個(gè)選項(xiàng),因此,例如,同一頁面不可能在當(dāng)前網(wǎng)站和外部網(wǎng)站上都顯示為框架。
- 并非所有瀏覽器都支持 ALLOW-FROM 選項(xiàng)。
- X-Frame-Options 在大多數(shù)瀏覽器中都是不推薦使用的選項(xiàng)。
點(diǎn)擊劫持測(cè)試——您的網(wǎng)站易受攻擊嗎?
測(cè)試您的網(wǎng)站是否容易受到點(diǎn)擊劫持的基本方法是創(chuàng)建一個(gè) HTML 頁面并嘗試將您網(wǎng)站的敏感頁面包含在 iframe 中。在另一臺(tái) Web 服務(wù)器上執(zhí)行測(cè)試代碼很重要,因?yàn)檫@是點(diǎn)擊劫持攻擊中的典型行為。
使用如下代碼,作為?OWASP 測(cè)試指南的一部分提供:
<html> <頭> <title>點(diǎn)擊劫持測(cè)試頁面</title> </頭> <正文> <p>網(wǎng)站容易受到點(diǎn)擊劫持!</p> <iframe src="http://www.yoursite.com/sensitive-page" width="500" height="500"></iframe> </body> </html>
在瀏覽器中查看 HTML 頁面并對(duì)頁面進(jìn)行評(píng)估,如下所示:
- 如果出現(xiàn)“網(wǎng)站容易受到點(diǎn)擊劫持”的文本,并且在其下方看到敏感頁面的內(nèi)容,?則該頁面容易受到點(diǎn)擊劫持。
- 如果只出現(xiàn)“網(wǎng)站容易受到點(diǎn)擊劫持”的文本,而您沒有看到敏感頁面的內(nèi)容,則該頁面不會(huì)受到最簡單形式的點(diǎn)擊劫持。
但是,還需要額外的測(cè)試來查看頁面上使用了哪些反點(diǎn)擊劫持方法,以及它們是否可以被攻擊者繞過。