前幾天上網(wǎng)打開163首頁時,發(fā)現(xiàn)頁面底部莫名其妙的出現(xiàn)一個邊框。這在以前可是未曾有過的,而且以后也絕不可能會有這么丑陋的設(shè)計。
趨于好奇心,立刻在邊框上點了右鍵審查元素。尼瑪,不看不知道,網(wǎng)易首頁的HTML何時變得這么劣質(zhì)了?
沒有doctype聲明,連title元素都沒有。script還是language=JScript風(fēng)格,這得追溯到多少個世紀前了~ 最劣質(zhì)的是框架居然還是frameset>元素。。。
不用說,這顯然不是網(wǎng)易的頁面。頁面里的ad字樣,早已深深的出買了它,這就是個廣告頁面!
話說生在天朝,對于各種劫持早已司空見慣。
在網(wǎng)頁里劫持廣告,油價2塊錢一升的時代就有了,過了世界末日依舊存在,說明其中的利益是巨大的。
不用計算,用手指估算下就知道了。我朝有好幾億電腦和手機用戶,每天有無數(shù)個網(wǎng)頁被打開。哪怕在1%的網(wǎng)頁里插一個廣告,都有數(shù)百上千萬次的展示數(shù)量,其中的商機不言而喻。。。
盡管對此有些無奈,但只要插入的廣告不影響正常上網(wǎng),也沒什么意見。如果水平夠高,完全可以偽裝成頁面里本來的廣告,至少形式上一樣,看不出任何的破綻。這樣非但不BS,反倒會有些佩服。
然而,至今見過的各種廣告劫持代碼,簡直一個比一個劣質(zhì)。這一次見到的,算是垃圾中的戰(zhàn)斗機了。隨便找個網(wǎng)頁編輯器,自動生成的HTML也比這強多了,再隨便找些css稍微修飾下,完全就不會被一眼看出是山寨套牌網(wǎng)頁了。尼瑪?shù)倪@本身就是暗地里的干活,卻沒有任何簡單的加密混淆,還光明正大的明文寫著廣告字樣,這不是赤果果的秀智商下限嗎?
不過今天既然花時間吐槽這破玩意,就干脆再深入的討論討論未來可能還會出現(xiàn)的變招。
Lv1. 當(dāng)前最常見的:把被劫持的網(wǎng)頁套在自己的空殼里
其實這樣做的目的很明確,讓廣告顯示在瀏覽器的最上方。一般為了達到這個效果,會把廣告顯示在頁面的右下角,蓋住被劫持頁面的滾動條,看起來就像是浮動在瀏覽器之外一樣!
這招夠狠,乍一看,還真以為是QQ之類的軟件彈出的消息框呢。不過只要把瀏覽器窗口退出最大化,順便再拖一下窗口,廣告也跟著動起來了:)假李鬼就瞬間原形畢露了!
防范措施
這種劫持毫無技術(shù)含量可言,反劫持也相當(dāng)容易。只要在自己網(wǎng)頁里驗證下window.top,是不是在合法的URL列表里。如果不是,那就不允許被內(nèi)嵌在其他網(wǎng)頁內(nèi)。更好的辦法就是把top地址提交到后臺服務(wù)器上,統(tǒng)計下究竟有哪些網(wǎng)站套了自己的頁面。
Lv2. 在返回網(wǎng)頁里插入外鏈script>
這種做法相比之前的,要隱蔽的多,至少不會把人家網(wǎng)頁的源文件給替換了。
當(dāng)然,如果僅僅是在網(wǎng)頁的最后面插入script>,那還是能被瞬間揭穿,甚至?xí)蠖?,因為這太山寨了!有哪個正常的網(wǎng)頁會在/html>后面跟內(nèi)容呢?只有掛馬的腳本。。。
不過,要是放對地方,還真不能一眼看出。例如把廣告的script src="">插在head>/head>其中的密密麻麻引用外部js的地方,至少能混上一段時間了。
防范措施
一般來說,插入的script>大多都是外鏈形式的,這樣廣告變換會比較靈活。對于這種劫持,就要使用類似殺毒軟件掃描可疑模塊的原理。
廣告不管怎樣插,最終都會以靜態(tài)HTML留在網(wǎng)頁里,這是不容抹去鐵證!
當(dāng)我們的網(wǎng)頁HTML加載完畢,觸發(fā)DOMContentLoaded時,我們可以開始掃描一遍DOM內(nèi)所有的script>標簽。如果發(fā)現(xiàn)有不在信任列表里的src,那么網(wǎng)頁很有可能被注入了可疑的腳本!
我們可以提交可疑腳本的url到后臺服務(wù)器,做進一步認證。如果確實有風(fēng)險,那么必須彈出警告框提醒用戶。
Lv3. 在返回網(wǎng)頁里插入內(nèi)置script>
相比外鏈的腳本,內(nèi)置的就棘手的多。外鏈的url域名的總是那么幾個,可以簡單的實現(xiàn)過濾。但內(nèi)置腳本就千變?nèi)f化了!隨機變量名,插入廢代碼,各種玄乎。。。不過,魔高一尺,道高一丈~
防范措施
想最簡單的對付這種劫持,我們必須預(yù)先默認個規(guī)定,來識別真假腳本元素。我們給自己的script>元素設(shè)置個固定的標簽,例如script myjs="true">。當(dāng)然具體的標簽名和值是經(jīng)常變動的,對于劫持程序來說,顯然不知道會有這么個規(guī)矩,仍然傻乎乎的插入script>.../script>。
于是在之后的"肅反運動"中,可以直接清洗掉了。。。
Lv4. 在返回網(wǎng)頁的script>里混入廣告代碼
隨著劫持程序不斷升級,招數(shù)會變的越來越狠。說不定某天,劫持程序內(nèi)置一個html語義分析器,智能的把廣告腳本合并混淆到頁面原先的js里!
若要真是這樣,那么之前說的給自己的腳本元素加上特征碼也無濟于事了。因為特務(wù)已深深的混入到了我們內(nèi)部,真真假假很難被識別!
最致命的是,腳本未必都是放在script>/script>,也有可能是element onxxx="">的內(nèi)聯(lián)形式。。。這下麻煩大了,我得想想怎么解決。。。
防范措施
對于這種情況,還真找不到一個簡單的方法來識別。唯一能走通的路,就是在發(fā)布HTML時,記錄下文件的Hash值??梢园阎祵懭刖W(wǎng)頁,或者存在數(shù)據(jù)庫里。
當(dāng)網(wǎng)頁內(nèi)容加載完成時,我們通過ajax再次讀取當(dāng)前頁面的內(nèi)容(一般來說讀的就是當(dāng)前頁面的緩存數(shù)據(jù))。通過同樣的算法算出頁面的校驗值,和原始值一比對,就知道頁面是否被第三方篡改了。
我們還可以把篡改過的html發(fā)到后臺,找出字符串差異部分,讓技術(shù)人員分析分析到底做了哪些手腳。
當(dāng)然,這只限于靜態(tài)網(wǎng)頁。
Lv5. 在返回網(wǎng)頁的外鏈腳本里混入廣告代碼
這招可算是終極篇 ———— 它完全不修改任何HTML內(nèi)容!
然而,一般的網(wǎng)頁多多少少要外鏈幾個js文件吧。于是,那些外鏈的腳本就成了香餑餑的肥肉被盯上了!
當(dāng)然也可以像驗證html那樣,事先計算出所有的js文件的hash值,然后再使用ajax重新讀數(shù)據(jù)認證比對。
不過可別忘了,外鏈js的路徑可以是任意的,而ajax只能讀取同源站點。而且,外鏈的script>也無法讀取其text內(nèi)容。于是當(dāng)我們使用站點外的js文件時,劫持程序可以肆無忌憚的從中混入代碼!
防范措施
由于受到沙箱策略的嚴格控制,我們根本無法獲得外部js內(nèi)的實際內(nèi)容,所以:走為上。盡量不使用外部站點的js文件。
對于自己站點,但不是同個域名的,可以使用Flash的URLLoader跨域加載,只需部署一個crossdomain.xml即可。
Lv6. 把返回網(wǎng)頁的圖片內(nèi)容替換成廣告圖片
這樣的流量劫持已經(jīng)超越人類了,趕緊派一個神做了它吧。。。
防范措施
理論上,完全可以解決。事實上,也沒問題,只是工作量巨大。。。
不過外鏈圖片不管同源還是跨域的,都可以由Flash直接讀取,所以可以和html和js一樣,我們使用文件二進制的Hash比對,同樣可以驗證圖片數(shù)據(jù)是否被劫持。
當(dāng)然要事先要計算出站點下或外鏈圖片的hash值,客戶端也要分析出當(dāng)前頁面里用到的圖片,并逐個驗證。這不得不說是個蛋疼的過程。。。
============================================
暫時就YY到這里,以后有新的想法或更好的解決方案,繼續(xù)來這里補充。
大家有什么巧妙的檢測方法,歡迎留言~
上面說了一大堆,其本質(zhì)無法就是在客戶端,把使用到的資源和服務(wù)器原始資源二進制校驗,將出現(xiàn)問題的資源反饋給后臺記錄,找出安全隱患。
雖然這里假象嵌入的僅僅是廣告腳本,然而這種腳本擁有和頁面內(nèi)其他腳本一樣的權(quán)限,因此可以輕而易舉的獲得用戶的cookie。
嵌入的腳本甚至可以通過WebSocket連接到黑客控制臺,發(fā)送你的鼠標和鍵盤的一舉一動,以及頁面上顯示的內(nèi)容;對方還可以遠程控制,讓js在頁面里悄悄執(zhí)行各種意想不到的操作。。。