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上反馈的漏洞,每一个漏洞都鞭策着腾讯安全漏洞检测团队不断前进,不断改进我们的漏洞检测系统。