基于QtWebKit的DOM XSS检测技术

安全
DOM-based XSS是一种基于文档对象模型(Document Object Model,DOM)的XSS漏洞。简单理解,DOM XSS就是出现在JavaScript代码中的漏洞。

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

责任编辑:蓝雨泪 来源: 博客
相关推荐

2013-12-02 13:55:23

任意跳转漏洞漏洞检测DOM跳转漏洞

2016-03-31 15:25:09

2014-04-15 17:03:00

2017-08-03 11:00:20

2013-01-09 14:17:59

2013-06-05 14:07:45

XssScanerxss

2023-10-10 19:00:57

云网关报文检测

2010-09-28 15:27:09

JavaScript

2024-03-14 14:16:13

2018-11-13 08:00:14

苏宁iOS开发

2020-12-08 06:19:33

爬虫Dom树组件

2013-07-27 20:04:38

2013-04-07 10:11:27

2016-09-29 14:03:06

2017-08-11 17:55:48

前端JavaScript模板引擎

2010-11-04 14:11:11

2012-03-14 11:38:16

ibmdw

2014-07-02 10:24:25

XSSXSS漏洞XSS检测

2013-05-22 18:06:41

2013-12-18 09:39:37

XSSWAF绕过
点赞
收藏

51CTO技术栈公众号