基于QtWebKit的DOM跳轉漏洞檢測技術
1、前言
1.1 任意跳轉漏洞及其危害
任意跳轉漏洞主要是指負責轉向的程序沒有驗證目標網站合法性,直接根據傳入的URL跳轉,其危害主要是能被壞人用來釣魚。

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

圖3.1 應用層監聽hookCgi信號

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

圖3.3 Dom跳轉漏洞源碼示例

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

圖3.5 經過兩次跳轉才最終跳到釣魚網站

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

圖3.7 普通跳轉漏洞源碼示例

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