基于QtWebKit的DOM XSS檢測技術
1、前言
什么是DOM XSS
DOM-based XSS是一種基于文檔對象模型(Document Object Model,DOM)的XSS漏洞。簡單理解,DOM XSS就是出現在JavaScript代碼中的漏洞。與普通XSS不同的是,DOM XSS是在瀏覽器的解析中改變頁面DOM樹,且惡意代碼并不在返回頁面源碼中回顯,這使我們無法通過特征匹配來檢測DOM XSS,給自動化漏洞檢測帶來了挑戰。本文將介紹一種基于QtWebKit的DOM XSS檢測系統以及本系統目前取得的效果和一些不足之處。
2、QtWebKit
2.1 什么是QtWebKit
首先了解下WebKit,WebKit是一個開源的瀏覽器引擎,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎分別來自于 KDE 的KHTML 和 KJS,擁有源碼結構清晰、渲染速度快等特點。蘋果的Safari及Google的Chrome都是基于Webkit引擎開發的瀏覽器。
QtWebkit是將Webkit移植到QT的一個開源項目,具有移植性強,全面支持HTML、CSS、JS,支持HTML5,支持Flash等各種擴展插件,封裝較好及簡單易用等特點。Qt內核為我們提供了Networking、GUI等核心功能模塊,Qt API使我們可以很方便的在QT中開發應用層程序,模擬JS執行及與DOM樹交互的過程。簡單來說,使用QtWebKit可以很方便的開發出一款個性化定制的瀏覽器。
如圖,左邊是WebKit引擎,右邊是基于WebKit的各種應用或封裝。
2.2 QtWebKit的編譯與運行
QtWebKit可以很好的支持跨平臺應用。首先我們需要安裝QT環境,筆者采用的版本是qt-everywhere-opensource-src-4.8.2,安裝QT環境依賴于很多基礎庫,需要耐心的依次安裝,網上有很多參考文檔,這里不再贅述,安裝成功后則可以運行qmake –h查看使用幫助。
接下來我們需要編譯安裝WebKit引擎,筆者采用的版本是WebKit-r90370。筆者在編譯時遇到不少變量未聲明,未定義的引用等編譯錯誤,不過只要有源碼,什么都不怕,耐心查看源碼后均已解決。當你看到下圖時,恭喜你,整個QtWebKit環境已經編譯成功了。
編譯成功后我們就可以嘗試調用QtWebKit的API編寫應用程序了,要想基于QtWebKit開發個帶GUI界面的應用程序(比如一款簡單的瀏覽器)并不難,這里筆者主要想探討下如何使我們的應用程序在后臺無界面運行。由于QT自帶的GUI界面既影響系統運行速度,又對我們的檢測功能毫無意義,所以必須考慮剝離。筆者采用的方法是從源碼出發,屏蔽相關的GUI調用,然后重新編譯引擎,目前我們的引擎已能較穩定的后臺無界面運行了。
3、基于QtWebKit的DOM XSS檢測系統
3.1 檢測原理
有了QtWebKit的JS引擎及DOM樹交互遍歷API,檢測DOM XSS實際已變得非常簡單。我們可以嘗試在CGI中插入標簽或屬性,看看他會不會被QtWebKit解析出來,如果可以則認為有漏洞。
來看個簡單的例子,如下圖,domxss_img.html存在DOM XSS漏洞,我們嘗試在domtest.html中插入惡意標簽<wlk>,如果系統成功解析出WLK標簽,則說明檢測到DOM XSS漏洞,<wlk>alert(888)</wlk>是我們的一個測試用例。除了插入標簽,對于img,iframe等特殊標簽,我們也可嘗試插入屬性。
這里只是舉了一個最簡單的DOM XSS例子,實際上有些DOM XSS需要一些JS點擊動作才能觸發,對此我們可以遍歷執行所有的點擊動作再交互遍歷DOM節點,部分代碼如下圖所示。有些DOM XSS需要在特定的if邏輯里才能觸發,我們可以Hook QtWebKit的JS引擎,遍歷所有JS路徑。
3.2 系統效果
本系統自2012年11月中旬上線以來,掃描騰訊所有域名,上百萬個URL。共有效發現數千個URL存在DOM XSS漏洞。以下是系統發現的漏洞工單趨勢圖(一個工單可能包含若干個URL)
3.3 不足之處
目前我們的系統還存在一些漏掃及漏報,漏報主要是QtWebKit自身的編碼問題導致,比如少部分TSRC上報的DOM XSS漏洞,僅在IE下能觸發,在Chrome下無法觸發(Chrome也是使用WebKit引擎),系統暫時無法檢測出來。
另一個問題是SuperHei大牛在TSRC上報的Eval等可執行函數過濾不嚴導致的XSS,筆者簡單模擬了這種漏洞觸發場景,如下圖,這種并非通過插入新標簽或屬性來觸發漏洞,系統暫時未能有效發現。
由于QtWebKit是開源的,以上兩個問題均可排期解決。特別說明下,Eval的問題可以通過Hook JS的特定函數來解決。
4、總結
實際上,我們可以基于QtWebKit做很多其他事情,比如開發爬取Web2.0鏈接的爬蟲,DOM JUMP檢測,任意JS文件引入檢測,后續將對這些系統另文介紹。
DOM XSS的檢測方法還有很多,比如白盒代碼審計、瀏覽器插件檢測等,筆者這里只是對一個看起來快速有效的方案的嘗試,歡迎大家多多批評指正。
最后感謝黑哥、牧馬人等業界安全大牛在TSRC上反饋的漏洞,每一個漏洞都鞭策著騰訊安全漏洞檢測團隊不斷前進,不斷改進我們的漏洞檢測系統。