引言:
昨天搞google iframe時(shí),接觸到了點(diǎn)擊劫持(clickjacking)的概念。以前看《圖解HTTP》的時(shí)候也接觸到了這個(gè)概念【大學(xué)時(shí)候還接觸到SQL注入、XSS跨站腳本攻擊(Cross Site Scripting),跨站請(qǐng)求偽造(Cross-site request forgery,簡(jiǎn)稱CSRF或XSRF),服務(wù)器端請(qǐng)求偽造SSRF等相關(guān)概念】。今天查了相關(guān)資料,發(fā)現(xiàn)一篇好文章,現(xiàn)轉(zhuǎn)載如下:
點(diǎn)擊劫持是一種比較常見(jiàn)的基于瀏覽器的攻擊,曾一度備受關(guān)注的 Facebook ‘likejacking’ 騙局攻擊、Adobe Flash Player 網(wǎng)站漏洞利用、Twitter 的 Don’t click 攻擊等,都利用了點(diǎn)擊劫持技術(shù)。可見(jiàn)點(diǎn)擊劫持從未走遠(yuǎn),它可能帶來(lái)的安全問(wèn)題更加不容小覷。
一、 什么是點(diǎn)擊劫持技術(shù)
點(diǎn)擊劫持 (Clickjacking) 技術(shù)又稱為界面?zhèn)窝b攻擊 (UI redress attack ),是一種視覺(jué)上的欺騙手段。攻擊者使用一個(gè)或多個(gè)透明的 iframe 覆蓋在一個(gè)正常的網(wǎng)頁(yè)上,然后誘使用戶在該網(wǎng)頁(yè)上進(jìn)行操作,當(dāng)用戶在不知情的情況下點(diǎn)擊透明的 iframe 頁(yè)面時(shí),用戶的操作已經(jīng)被劫持到攻擊者事先設(shè)計(jì)好的惡意按鈕或鏈接上。攻擊者既可以通過(guò)點(diǎn)擊劫持設(shè)計(jì)一個(gè)獨(dú)立的惡意網(wǎng)站,執(zhí)行釣魚(yú)攻擊等;也可以與 XSS 和 CSRF 攻擊相結(jié)合,突破傳統(tǒng)的防御措施,提升漏洞的危害程度。
二、 點(diǎn)擊劫持原理及實(shí)例
點(diǎn)擊劫持漏洞 (Clickjacking) 是由網(wǎng)絡(luò)安全專家 Robert Hansen 和 Jeremiah Grossman 在 OWASP (Open Web Application Security Project) 會(huì)議上提出的,現(xiàn)場(chǎng)還對(duì)該漏洞的危害作了演示。第14屆Black Hat大會(huì)上,安全專家 Paul Stone 講解了Clickjacking 的拖拽(Drag-and-Drop)技術(shù),這項(xiàng)技術(shù)使黑客的攻擊手法更加靈活多變,同時(shí)能夠突破許多傳統(tǒng)的安全防御措施,獲取更多的用戶信息,增加了Clickjacking 漏洞的危害性。
攻擊者在點(diǎn)擊劫持漏洞利用實(shí)現(xiàn)過(guò)程中使用 iframe 作為目標(biāo)網(wǎng)頁(yè)載體。iframe 是 HTML 標(biāo)準(zhǔn)中的一個(gè)標(biāo)簽,可以創(chuàng)建包含另外一個(gè)頁(yè)面的內(nèi)聯(lián)框架,在點(diǎn)擊劫持漏洞利用中主要用來(lái)載入目標(biāo)網(wǎng)頁(yè)。點(diǎn)擊劫持典型的攻擊原理示意圖如圖1所示:
攻擊者實(shí)施攻擊的一般步驟是:
- 黑客創(chuàng)建一個(gè)網(wǎng)頁(yè)利用iframe包含目標(biāo)網(wǎng)站;
2)隱藏目標(biāo)網(wǎng)站,使用戶無(wú)法察覺(jué)到目標(biāo)網(wǎng)站存在;
3)構(gòu)造網(wǎng)頁(yè),誘騙用戶點(diǎn)擊特定按鈕 (圖1中的PLAY!按鈕); - 用戶在不知情的情況下點(diǎn)擊按鈕,觸發(fā)執(zhí)行惡意網(wǎng)頁(yè)的命令。
(一)、點(diǎn)擊劫持利用技術(shù)
比較重要的點(diǎn)擊劫持漏洞利用技術(shù)包括目標(biāo)網(wǎng)頁(yè)隱藏、點(diǎn)擊操作劫持、拖拽技術(shù)。
1、目標(biāo)網(wǎng)頁(yè)隱藏技術(shù)
目標(biāo)網(wǎng)頁(yè)隱藏技術(shù)原理是攻擊者在惡意網(wǎng)站上通過(guò) iframe 載入目標(biāo)網(wǎng)頁(yè),然并隱藏目標(biāo)網(wǎng)頁(yè),欺騙用戶點(diǎn)擊隱藏的惡意鏈接。目前主要的網(wǎng)頁(yè)隱藏技術(shù)有兩種:CSS隱藏技術(shù)和雙iframe隱藏技術(shù)。
CSS 隱藏技術(shù)的原理是利用 CSS 技術(shù)控制網(wǎng)頁(yè)內(nèi)容顯示的效果。其中opacity參數(shù)表示元素的透明度,取值范圍為0~1,默認(rèn)值為1表示不透明, 取值為0時(shí)元素在網(wǎng)頁(yè)中完全透明顯示。當(dāng)設(shè)置目標(biāo) iframe 的opacity 屬性小于或等于0.1,用戶就無(wú)法看到含惡意代碼的目標(biāo)網(wǎng)頁(yè)。
雙iframe隱藏技術(shù)使用內(nèi)聯(lián)框架和外聯(lián)框架。內(nèi)聯(lián)框架的主要功能是載入目標(biāo)網(wǎng)頁(yè),并將目標(biāo)網(wǎng)頁(yè)定位到特定按鈕或者鏈接。外聯(lián)框架的主要功能是篩選,只顯示內(nèi)聯(lián)框架中特定的按鈕。
2、點(diǎn)擊操作劫持
在成功隱藏目標(biāo)網(wǎng)頁(yè)后,攻擊者下一個(gè)目標(biāo)是欺騙用戶點(diǎn)擊特定的按鈕,最簡(jiǎn)單實(shí)用的方法是使用社會(huì)工程學(xué)。例如,將攻擊按鈕外觀設(shè)計(jì)成類似QQ消息的提示按鈕,誘使用戶點(diǎn)擊從而觸發(fā)攻擊行為。另外一種思路是使用腳本代碼以及其他技術(shù)增加用戶點(diǎn)擊特定按鈕的概率。主要方法如JavaScript實(shí)現(xiàn)鼠標(biāo)跟隨技術(shù)、按鍵劫持 (Stroke jacking) 技術(shù)等。
3、拖拽(Drag and Drop)技術(shù)
主流的瀏覽器都有drag-and-drop API 接口,供網(wǎng)站開(kāi)發(fā)人員創(chuàng)建交互式網(wǎng)頁(yè)。但是,這些 API 接口在設(shè)計(jì)時(shí)沒(méi)有考慮很多的安全性問(wèn)題,導(dǎo)致通過(guò)拖拽就可以實(shí)現(xiàn)跨域操作。利用拖拽技術(shù),攻擊者可以突破很多已有的安全防御措施,
利用拖拽技術(shù),攻擊者可以輕易將文本注入到目標(biāo)網(wǎng)頁(yè)。在實(shí)際實(shí)施過(guò)程中,攻擊者欺騙用戶選擇輸入框的內(nèi)容,完成拖拽操作。另外一種方式是,通過(guò)瀏覽器的 API 接口將 iframe 中的內(nèi)容拖拽到目標(biāo)網(wǎng)頁(yè)的 text area 中,攻擊者就可以獲得用戶網(wǎng)頁(yè)中存在的敏感信息。
(二)、點(diǎn)擊劫持實(shí)例
以下是一個(gè)簡(jiǎn)單的點(diǎn)擊劫持攻擊實(shí)例:
攻擊者構(gòu)造一個(gè)惡意鏈接誘使用戶訪問(wèn),若用戶不慎打開(kāi)了此鏈接,用戶看到的是正常的頁(yè)面。此例中制作了一個(gè)簡(jiǎn)單的“CLICK HERE !”,如圖2所示:
實(shí)際上這個(gè)頁(yè)面是由兩個(gè) iframe 嵌套而成,用戶看到的是一個(gè)正常的頁(yè)面。實(shí)則在其表面,覆蓋了一個(gè)惡意鏈接的頁(yè)面,click here按鍵的操作也相應(yīng)的落在了這個(gè)惡意的頁(yè)面上,對(duì)于整個(gè)過(guò)程,用戶全然不知。
攻擊者是怎樣把這個(gè)惡意頁(yè)面隱藏起來(lái)的呢?這主要是通過(guò)設(shè)置 CSS 中 div 元素的不透明度來(lái)實(shí)現(xiàn)的,在 CSS 中聲明 opacity 用來(lái)設(shè)置一個(gè)元素的透明度。現(xiàn)在主流的瀏覽器都支持opacity屬性,取值為由浮點(diǎn)數(shù)字和單位標(biāo)識(shí)符組成,不可為負(fù)。Opacity 取值為1的元素是完全不透明的,反之取值為0時(shí)為全透明,即用戶是看不見(jiàn)的。攻擊者正是利用了opacity為0來(lái)隱藏了這個(gè)頁(yè)面。
接下來(lái),我們不妨把 opacity 值改為0.5,即設(shè)置表面的 iframe 為半透明,是不是就可以看見(jiàn)攻擊者想要隱藏的那部分內(nèi)容呢?結(jié)果如大家所料,我們就能夠隱約看見(jiàn)被攻擊者隱藏的iframe。如圖3:
圖3 攻擊者構(gòu)造的惡意網(wǎng)頁(yè)(opacity值為0.5)
可以看出,在button上面其實(shí)覆蓋了一個(gè)釣魚(yú)網(wǎng)站,在不經(jīng)意間,用戶就已經(jīng)落入攻擊者制作的陷阱,被劫持到一個(gè)虛假的購(gòu)物網(wǎng)站中。
三、 點(diǎn)擊劫持與其他漏洞的結(jié)合技術(shù)
點(diǎn)擊劫持技術(shù)如果結(jié)合其他漏洞進(jìn)行攻擊,將突破某些安全措施,實(shí)現(xiàn)更大范圍的攻擊。
(一)、結(jié)合 CSRF 漏洞
CSRF (Cross-Site Request Forgery CSRF)是指跨站點(diǎn)請(qǐng)求偽造漏洞,目前廣泛使用的CSRF漏洞防御技術(shù)是 token 識(shí)別技術(shù)。token 是網(wǎng)站給每一次 HTTP 連接分配的隨機(jī)數(shù),用來(lái)標(biāo)識(shí)不同的用戶身份。對(duì)于網(wǎng)站開(kāi)發(fā)人員,最方便實(shí)用的方法是將 token 存儲(chǔ)在頁(yè)面隱藏的表單中,最終跟隨信息共同提交到服務(wù)器端。服務(wù)器檢查該參數(shù),判斷用戶身份的真實(shí)性。因此成功實(shí)施 CSRF 攻擊的關(guān)鍵因素是正確獲取 token 值,攻擊者需要將載入目標(biāo)網(wǎng)頁(yè) iframe 中 token 自動(dòng)添加到 src 屬性后面。使用HTTP “GET”方法的表單會(huì)自動(dòng)完成上述步驟,實(shí)現(xiàn)攻擊WEB應(yīng)用程序。Twitter 蠕蟲(chóng)攻擊就是利用點(diǎn)擊劫持漏洞來(lái)實(shí)現(xiàn)CSRF攻擊。
(二)、結(jié)合 XSS 漏洞
Clickjacking 和反射型 XSS (跨站點(diǎn)腳本漏洞) 結(jié)合,轉(zhuǎn)變?yōu)榇鎯?chǔ)型 XSS 漏洞。反射型 XSS 漏洞最重要的特征是難于利用。通過(guò) Clickjacking 漏洞,反射型 XSS 可以轉(zhuǎn)化為存儲(chǔ)型 XSS 漏洞,只要用戶點(diǎn)擊觸發(fā)此漏洞,就可以在用戶瀏覽器上執(zhí)行任意的JavaScript 代碼,因此具有極大的危害性。
四、 點(diǎn)擊劫持漏洞的防御
點(diǎn)擊劫持漏洞防御措施可以從兩個(gè)方面考慮:服務(wù)器端防御和客戶端防御。服務(wù)器端防御主要涉及到用戶身份驗(yàn)證,客戶端防御主要涉及到瀏覽器的安全。
(一)、服務(wù)器端防御
服務(wù)器端防御點(diǎn)擊劫持漏洞的思想是結(jié)合瀏覽器的安全機(jī)制進(jìn)行防御,主要的防御方法介紹如下。
1、 X-FRAME-OPTIONS 機(jī)制
在微軟發(fā)布新一代的瀏覽器Internet Explorer 8.0中首次提出全新的安全機(jī)制:X-FRAME-OPTIONS。該機(jī)制有兩個(gè)選項(xiàng):DENY 和 SAMEORIGIN。DENY表示任何網(wǎng)頁(yè)都不能使用 iframe 載入該網(wǎng)頁(yè),SAMEORIGIN表示符合同源策略的網(wǎng)頁(yè)可以使用 iframe載入該網(wǎng)頁(yè)。如果瀏覽器使用了這個(gè)安全機(jī)制,在網(wǎng)站發(fā)現(xiàn)可疑行為時(shí),會(huì)提示用戶正在瀏覽 網(wǎng)頁(yè)存在安全隱患,并建議用戶在新窗口中打開(kāi)。這樣攻擊者就無(wú)法通過(guò) iframe 隱藏目標(biāo)的網(wǎng)頁(yè)。
2、 使用 FrameBusting 代碼
點(diǎn)擊劫持攻擊需要首先將目標(biāo)網(wǎng)站載入到惡意網(wǎng)站中,使用 iframe 載入網(wǎng)頁(yè)是最有效的方法。Web安全研究人員針對(duì) iframe 特性提出 Frame Busting 代碼,使用 JavaScript 腳本阻止惡意網(wǎng)站載入網(wǎng)頁(yè)。如果檢測(cè)到網(wǎng)頁(yè)被非法網(wǎng)頁(yè)載入,就執(zhí)行自動(dòng)跳轉(zhuǎn)功能。Frame Busting代碼是一種有效防御網(wǎng)站被攻擊者惡意載入的方法,網(wǎng)站開(kāi)發(fā)人員使用Frame Busting代碼阻止頁(yè)面被非法載入。需要指出的情況是,如果用戶瀏覽器禁用JavaScript腳本,那么FrameBusting代碼也無(wú)法正常運(yùn)行。所以,該類代碼只能提供部分保障功能。
3、 使用認(rèn)證碼認(rèn)證用戶
點(diǎn)擊劫持漏洞通過(guò)偽造網(wǎng)站界面進(jìn)行攻擊,網(wǎng)站開(kāi)發(fā)人員可以通過(guò)認(rèn)證碼識(shí)別用戶,確定是用戶發(fā)出的點(diǎn)擊命令才執(zhí)行相應(yīng)操作。識(shí)別用戶的方法中最有效的方法是認(rèn)證碼認(rèn)證。例如,在網(wǎng)站上廣泛存在的發(fā)帖認(rèn)證碼,要求用戶輸入圖形中的字符,輸入某些圖形的特征等。
(二)、客戶端防御
由于點(diǎn)擊劫持攻擊的代碼在客戶端執(zhí)行,因此客戶端有很多機(jī)制可以防御此漏洞。
1、 升級(jí)瀏覽器
最新版本的瀏覽器提供很多防御點(diǎn)擊劫持漏洞的安全機(jī)制,對(duì)于普通的互聯(lián)網(wǎng)用戶,經(jīng)常更新修復(fù)瀏覽器的安全漏洞,能夠最有效的防止惡意攻擊。
2、 NoScript 擴(kuò)展
對(duì)于Firefox的用戶,使用 NoScript 擴(kuò)展能夠在一定程度上檢測(cè)和阻止點(diǎn)擊劫持攻擊。利用 NoScript 中 ClearClick 組件能夠檢測(cè)和警告潛在的點(diǎn)擊劫持攻擊,自動(dòng)檢測(cè)頁(yè)面中可能不安全的頁(yè)面。
五、 結(jié)束語(yǔ)
互聯(lián)網(wǎng)行業(yè)的快速發(fā)展帶來(lái)了越來(lái)越多的安全性問(wèn)題,同時(shí)也給用戶數(shù)據(jù)和信息帶來(lái)巨大的威脅。點(diǎn)擊劫持漏洞也會(huì)隨著社交網(wǎng)站和移動(dòng)互聯(lián)網(wǎng)的發(fā)展,越來(lái)越多的被關(guān)注,如果利用點(diǎn)擊劫持漏洞與其它已有的 Web 漏洞相結(jié)合,會(huì)產(chǎn)生更大的危害性,也是需要安全研究人員要進(jìn)一步研究的問(wèn)題。
轉(zhuǎn)載自:攻防:點(diǎn)擊劫持攻擊與防御技術(shù)簡(jiǎn)介
六、推薦資料
web安全相關(guān)書(shū)籍:
1、白帽子講Web安全