基于QtWebKit的DOM跳轉(zhuǎn)漏洞檢測技術(shù)
1、前言
1.1 任意跳轉(zhuǎn)漏洞及其危害
任意跳轉(zhuǎn)漏洞主要是指負(fù)責(zé)轉(zhuǎn)向的程序沒有驗證目標(biāo)網(wǎng)站合法性,直接根據(jù)傳入的URL跳轉(zhuǎn),其危害主要是能被壞人用來釣魚。

圖1 最近TSRC上報的釣魚示例
1.2 跳轉(zhuǎn)漏洞的檢測難點
普通的跳轉(zhuǎn)漏洞沒有太大檢測難點,可以直接通過HTTP返回頁面源碼的特征匹配來發(fā)現(xiàn),本文想重點探討下如何自動檢測DOM跳轉(zhuǎn)漏洞以及多次跳轉(zhuǎn)才能跳到釣魚網(wǎng)站的漏洞。
2、QtWebKit
關(guān)于qtwebkit的原理及其編譯運行已在之前的tsrc博客做了較詳細說明,這里不再贅述,具體參見http://security.tencent.com/index.php/blog/msg/12。
3、基于QtWebKit的DOM跳轉(zhuǎn)漏洞檢測系統(tǒng)
3.1 檢測原理
Hook Webkit的所有Http請求,判斷目標(biāo)網(wǎng)站的url是否出現(xiàn)在最終的Http請求中,如果出現(xiàn)則說明存在任意跳轉(zhuǎn)漏洞。理論上,所有普通瀏覽器能跳轉(zhuǎn)的漏洞,Webkit內(nèi)核都能自動跳轉(zhuǎn),因而本方法能檢測所有跳轉(zhuǎn)漏洞且不會有誤報。
3.2 如何hook Http請求
Webkit內(nèi)部的信號機制可以幫助我們完美的hook所有Http請求,關(guān)于信號機制的原理Webkit開源社區(qū)已有比較專業(yè)詳細的介紹,這里不再贅述。本方法中通過在http發(fā)包請求類里自定義并發(fā)射信號hookCgi,在應(yīng)用層監(jiān)聽hookCgi信號,從而實現(xiàn)在應(yīng)用層旁路監(jiān)聽到Webkit所有的Http請求,同時完全不影響Webkit正常的請求邏輯。
如圖3.1,3.2,應(yīng)用層監(jiān)聽hookCgi信號,當(dāng)webkit內(nèi)核觸發(fā)http請求時,發(fā)送hookCgi信號,從而觸發(fā)自定義的GetHookCgi槽函數(shù),如果槽函數(shù)中發(fā)現(xiàn)了目標(biāo)釣魚站點的Http請求,則發(fā)現(xiàn)任意跳轉(zhuǎn)漏洞。

圖3.1 應(yīng)用層監(jiān)聽hookCgi信號

圖3.2 hookCgi信號對應(yīng)的槽函數(shù)
3.3 檢測Demo示例
圖3.3和圖3.4示例了Dom跳轉(zhuǎn)漏洞源碼及其檢測。與普通跳轉(zhuǎn)漏洞不同的是,Dom跳轉(zhuǎn)漏洞的檢測難點是在返回頁面源碼中找不到目標(biāo)URL的特征,本方法基于跳轉(zhuǎn)行為而不基于特征匹配,因而不會有誤報且發(fā)現(xiàn)能力極強。

圖3.3 Dom跳轉(zhuǎn)漏洞源碼示例

圖3.4 Dom跳轉(zhuǎn)漏洞檢測
如圖1所示是近期TSRC上報的一個實際DOM跳轉(zhuǎn)漏洞,該漏洞要經(jīng)過兩次跳轉(zhuǎn)才能最終跳轉(zhuǎn)到目標(biāo)網(wǎng)站,如圖3.5是該漏洞的抓包示例。如圖3.6所示,我們也可以檢測此類多次跳轉(zhuǎn)的漏洞場景。事實上,不管經(jīng)過幾次跳轉(zhuǎn),只要能跳到釣魚網(wǎng)站,我們都能發(fā)現(xiàn)。

圖3.5 經(jīng)過兩次跳轉(zhuǎn)才最終跳到釣魚網(wǎng)站

圖3.6 多次跳轉(zhuǎn)漏洞的檢測
補充說明下,對于非Dom的普通跳轉(zhuǎn),本方法亦能有效發(fā)現(xiàn),如圖3.7和圖3.8所示。

圖3.7 普通跳轉(zhuǎn)漏洞源碼示例

圖3.8 普通跳轉(zhuǎn)漏洞檢測
4、總結(jié)
實際上,我們可以基于QtWebKit做很多其他事情,比如開發(fā)爬取Web2.0鏈接的爬蟲,后續(xù)將對這些系統(tǒng)另文介紹。
跳轉(zhuǎn)的檢測方法還有很多,筆者這里只是拋磚引玉,歡迎大家多多批評指正,有任何問題歡迎隨時交流。