當我們在手機上訪問網頁時,經常會看到一些不屬于網頁本身的內容,常見的是在網頁中加入一些別人的廣告,這種情況很明顯是被劫持了。如果調試網頁的話,大概會出現類似于下面的網頁代碼:
<script type="text/javascript" id="wf_float_url" src="http://ssp.0531kt.com/l7.js"></script>
<link rel="stylesheet" type="text/css">
<script src="http://api.youxiaoad.com/js/adapi.js" type="text/javascript"></script>
很明顯,這就是廣告服務商提供內容的地方了。那它是怎么來的呢,下面我們就先分析下網頁劫持的種類吧。
網頁劫持的分類
網頁劫持是目前黑帽SEO或者說黑產最喜歡的一種網頁引流方式,此手法往往通過入侵網站,修改網站源代碼、放寄生蟲程序、設置二級目錄反向代理等實現。網頁劫持可以分為服務端劫持、客戶端劫持、百度快照劫持、百度搜索劫持等等;表現形式可以是劫持跳轉,也可以是劫持呈現的網頁內容,目前被廣泛應用于私服、博彩等暴利行業(yè)。 大致分類如下:
1、被瀏覽的網站域名泛解析
所謂“泛域名解析”是指:利用通配符* (星號)來做次級域名以實現所有的次級域名均指向同一IP地址。在域名前添加任何子域名,均可訪問到所指向的WEB地址。也就是客戶的域名#.com之下所設的*.#.com全部解析到同一個IP地址上去。比如客戶設1.#.com就會自己自動解析到與#.com同一個IP地址上去。
域名惡意泛解析則是域名被黑客或其它別有用心的操作并泛解析到其它服務器上制作許多垃圾頁面。這些被惡意泛解析的頁面大多數為賭博、足球等惡意非法內容。
域名被惡意泛解析后,會對網站的權重和流量有直接性的影響,導致權重降低,流量減少。進而導致惡意信息被收錄,被誤認為是惡意欺詐性非法網站,不利于網站的用戶體驗。如果惡意泛解析如果不能及時處理,則會對網站SEO及用戶體驗造成致命的影響。
對于此問題,首先是檢查域名解析是否被泛解。看見惡意域名泛解析后不要刪除泛解析, 先修改泛解析(*.xxx.com)到自己的服務器IP上;然后,修改域名賬號密碼。域名被惡意解析,肯定是賬戶密碼信息泄露或者是dns域名服務器被攻擊,避免再次被修改;之后是制作404頁面。因為泛解析被修改,之前百度收錄的內容用戶無法訪問,通過404處理降低損失,提高用戶體驗。當然,如果已經收錄的泛二級域名太多而不好處理時,可以將被惡意泛解析的域名重新解析到自己的空間,統一處理成404錯誤頁;最后向百度站長提交死鏈。統計百度已收錄的惡意二級頁面鏈接地址(可以使用抓取工具提取),最后制作成一個txt格式的文件上傳到網站空間,在百度站長工具里提交給百度處理。
2、用戶瀏覽的瀏覽器被劫持
當你打開一個瀏覽器進行網頁內容瀏覽的時候,這個網頁會自動出現一個瀏覽器的廣告新聞,實際上瀏覽器本身沒有投放任何的廣告,這個是被別人惡意利用劫持了瀏覽器,只要用戶打開瀏覽器就會蹦出來這個廣告。
3、黑客入侵
黑客入侵就是把用戶所瀏覽的網站給侵入后植入一些木馬程序,也就是我們平時所說的黑客入侵,掛馬,把你的網站植入一些寄生蟲病毒等。本來想進入“京東”的網站,結果進入了“天貓”的網站,那么這個就是被黑客入侵了。很多是黑客入侵這個主站以后,在他的上面掛上了木馬病毒,寄生蟲病毒等,這個東西不會長久,但是會不停的繁衍更新,可能你搜索完這次,展現給你,下次你再搜索,它又在這個網站的另外一個頁面出現。
4、運營商劫持
假設你的頁面不是泛解析,也不是你網站程序被黑客侵犯,那么就歸于這個“不可描述”的劫持了,也就是運營商被劫持了,網頁被非法的修改攔截了。使用HTTP請求請求一個網站頁面的時候,網絡運營商會在正常的數據流中插入精心設計的網絡數據報文,讓客戶端(通常是瀏覽器)展示“錯誤”的數據,通常是一些彈窗,宣傳性廣告或者直接顯示某網站的內容。
用戶瀏覽的瀏覽器被劫持和運營商劫持同屬于客戶端劫持,大概分為以下類型:
I、跳轉型劫持:用戶輸入地址A,但是跳轉到地址B。如常見的header劫持:
<meta http-equiv=“refresh“ content=“10; url=http://thief.one“>
利用的就是Meta Refresh Tag(自動轉向),將流量引走。
II、注入型劫持:在正常的網頁中注入廣告代碼(js、iframe等),實現頁面彈窗提醒或者底部廣告等。
???1),注入js類劫持:在正常的頁面注入js代碼實現劫持。
???2),iframe類劫持:將正常網頁嵌套iframe或者頁面增加iframe。
???3),篡改頁面類劫持:正常頁面出現多余的劫持網頁標簽,導致頁面整體大小發(fā)生變化。
客戶端劫持的實現方式
客戶端劫持的實現方式有鏈路劫持攻擊等,TCP鏈路劫持其實就是指網絡鏈路上偵聽、偽造TCP包,達到控制目標網絡鏈路的行為。最常見的就是某些設備實現的對非法站點的訪問攔截,以及一些地區(qū)運營商的網頁植入廣告行為。目前發(fā)現的TCP鏈路劫持攻擊一般有兩種形式:中斷訪問型(分為單向發(fā)包和雙向發(fā)包)和替換頁面型。
防范鏈路劫持比較困難,畢竟攻擊者控制著網絡鏈路。不過并非不可能,一是網站全程使用SSL,再一個就是在客戶端或(和)服務器丟棄偽造的TCP包。在通常的運營商的劫持中,運用https加密,可以使劫持下降90%左右!
當然,除此之外,還可以檢查目標的HTTP響應頭是否設置好了X-Frame-Options字段確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持的攻擊。
deny:標示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許
sameorigin: 表示該頁面可以在相同域名頁面的 frame 中展示。
allow-from uri:表示該頁面可以在指定來源的 frame 中展示。
還可以檢查目標網站是否有javascript的Frame Busting機制。通常可以寫一段JavaScript代碼,以禁止iframe的嵌套。這種方法叫frame busting。如:
if ( top.location != location ) {
top.location = self.location;
}
但是frame busting也存在一些缺陷。由于它是用JavaScript寫的,控制能力并不是特別強,因此有許多方法可以繞過它。比如針對parent.location的frame busting,就可以采用嵌套多個iframe的方法繞過。此外,像HTML 5中iframe的sandbox屬性、IE中iframe的security屬性等,都可以限制iframe頁面中的JavaScript腳本執(zhí)行,從而可以使得frame busting失效。
客戶端過濾
對于網頁劫持,客戶端所能做的非常有限。現在iOS端一般使用WKWebView實現網頁的加載,目前的處理方式大概有兩種,一種是具體問題具體分析,一種是使用內容過濾規(guī)則。
對于第一種方案,如果網頁中被加入了廣告,首先分析當前展現的網頁源碼,找到問題所在,具體分析。一般就是做一些對應的JS處理。實現起來并不是很好。
對于第二種方案,iOS11后WKWebView增加了內容過濾規(guī)則。原理上就是提供一個 JSON 給 WebKit,這個 JSON 包括內容的觸發(fā)規(guī)則(trigger)和對應的處理方式(action),WebKit 會把攔截規(guī)則編譯成高效的二進制碼。
可使用的處理方式有,block:放棄加載資源,如果該資源已經緩存也忽略緩存;block-cookies:所有發(fā)送的請求的header中都會過濾掉cookie;css-display-none:隱藏使用 CSS selector 的頁面元素,同時還有關聯的selector;ignore-previous-rules:前面觸發(fā)的規(guī)則不執(zhí)行;make-https:把網頁里的 http 請求改為 https 請求。
可以通過配置規(guī)則攔截頁面里的資源請求、隱藏頁面里的指定元素、將http請求轉換成https等,實現以前的廣告過濾的功能。
因為這個功能是iOS11加入的,對于iOS11之前的設備可以參考adblock的實現。有機會了下次再聊。