解開(kāi)Twitter的Don't Click攻擊的神秘面紗
原創(chuàng)一、跨站請(qǐng)求偽造還是點(diǎn)擊劫持
遭到Don't Click攻擊(準(zhǔn)確來(lái)說(shuō),它應(yīng)該算是一個(gè)惡作劇,因?yàn)樗鼪](méi)有對(duì)用戶造成實(shí)質(zhì)性的危害。)黑手的用戶將向Twitter張貼下列消息:
Don't Click: http://tinyurl.com/amgzs6
下面是當(dāng)時(shí)的用戶截圖:
![]() |
圖1 |
這看起來(lái)好像是一個(gè)CSRF攻擊,但是當(dāng)您查看發(fā)動(dòng)攻擊的頁(yè)面的源文件后,就會(huì)發(fā)現(xiàn)根本不是這么回事。這個(gè)病毒性的Twitter惡作劇用來(lái)騙您在Twitter張貼回復(fù)的技術(shù)并不是跨站請(qǐng)求偽造,而是另一種高超的技巧:點(diǎn)擊劫持技術(shù)。所有這一切根本就不使用JavaScript代碼(當(dāng)然跨站請(qǐng)求偽造也可以不用腳本),只用了寥寥幾行CSS代碼就搞定了。
二、深入解析Don't Click攻擊
在攻擊頁(yè)面中,含有一個(gè)IFrame,用以加載Twitter,并且?guī)в惺孪忍詈玫南ⅲ?/P>
實(shí)際上,Twitter本身在您單擊“reply”按鈕的時(shí)候,它就在回復(fù)的開(kāi)頭處預(yù)填了內(nèi)容。所以說(shuō),該攻擊使用的策略,與Twitter是一脈相承的。在Iframe之后是一個(gè)按鈕:
這可是一個(gè)巧妙的騙局,它利用了點(diǎn)擊劫持技術(shù):當(dāng)您單擊這個(gè)按鈕的時(shí)候,實(shí)際上是在Twitter上提交一個(gè)表單。但是,它是如何完成的?這可要?dú)w功于CSS了。仔細(xì)看一下這里的CSS:
注意IFrame和按鈕的位置,Twitter的(位于IFrame中的)更新按鈕恰好放在了該頁(yè)面的正常按鈕的上面;并且這里通過(guò)CSS使這個(gè)IFRAME變得完全透明,所以您根本就看不到它。所以,用戶將看到如下的景象:
![]() |
圖2 |
俗話說(shuō),耳聽(tīng)為虛,眼見(jiàn)為實(shí)——真是這樣嗎?很遺憾,有時(shí)候眼睛也會(huì)欺騙我們,因?yàn)樗床坏酵该鞯臇|西。為了弄清真相,我們調(diào)節(jié)內(nèi)嵌框架的透明度,這下您就會(huì)明白是怎么回事了,如圖:
![]() |
圖3 |
好了,現(xiàn)在真相大白了:當(dāng)您覺(jué)得正在點(diǎn)擊(IFrame下面的)普通按鈕的時(shí)候,實(shí)際上卻在單擊(普通按鈕上面那個(gè)透明的)Twitter的“Update”按鈕。假如用戶已經(jīng)登錄到Twitter,那么用戶就會(huì)立即向Twitter張貼表單輸入框中的內(nèi)容。拜Twitter的?Status= URL功能所賜,攻擊者可以輕松貼上下列消息,因?yàn)樵摴δ茉试STwitter預(yù)裝一則消息:
Don’t Click: http://tinyurl.com/amgzs6
在TinyURL的幫助下,可以對(duì)攻擊頁(yè)面的URL做些必要的處理,以便誘騙您的跟蹤者來(lái)進(jìn)一步傳播此“攻擊”,事實(shí)證明這是十分有效的。
三、示例演示
為了更好地進(jìn)行說(shuō)明,我們用一個(gè)示例攻擊頁(yè)面進(jìn)行演示。注意,為了讓讀者看到事實(shí)真相,我們的例子中沒(méi)有將opacity設(shè)為0,因此如果在加載頁(yè)面時(shí)您仔細(xì)觀察的話,將會(huì)看到“Don't Click”按鈕在后臺(tái)先于Twitter之前加載的,之后還會(huì)看到Twitter的更新按鈕又被“繪制”到了“Don't Click”按鈕之上。也就是說(shuō),最后Twitter的更新按鈕把“Don't Click”按鈕完全蓋住了。代碼如下:
現(xiàn)在,當(dāng)讀者使用上面的代碼做實(shí)驗(yàn)時(shí),已經(jīng)看不到Twitter的“update”按鈕了,因?yàn)門(mén)witter已經(jīng)修復(fù)了這個(gè)嚴(yán)重的安全漏洞。但是我們可以看到有一個(gè)不透明的方塊蓋住了先出現(xiàn)的“Don't Click”按鈕。好了,現(xiàn)在介紹一下該漏洞是如何被修復(fù)的。
四、漏洞的修復(fù)
Twitter.com已經(jīng)修補(bǔ)了該漏洞,做法是在它被加載到一個(gè)IFRAME的時(shí)候,利用一些JavaScript進(jìn)行相應(yīng)的檢查:
if (window.top !== window.self) {
window.top.location.href = window.self.location.href; }
所以,現(xiàn)在當(dāng)我們?cè)噲D將Twitter加載到一個(gè)IFRAME中的時(shí)候,會(huì)發(fā)現(xiàn)瀏覽器被自動(dòng)重定向到Twitter,這樣的話,攻擊頁(yè)面就不能得逞了。
五、小結(jié)
本文對(duì)上周Twitter暴露了一個(gè)重大安全漏洞,即Don't Click攻擊進(jìn)行了全面深入的介紹。我們首先介紹了Don't Click攻擊的實(shí)質(zhì),即點(diǎn)擊劫持,并介紹了該技術(shù)的具體實(shí)現(xiàn)代碼。為了讓讀者有一個(gè)感性的認(rèn)識(shí),我們還提供了一個(gè)示例攻擊頁(yè)面,最后介紹了漏洞的修補(bǔ)技術(shù)。
【51CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者!】
【編輯推薦】