Skip to content

Latest commit

 

History

History
185 lines (122 loc) · 25.5 KB

对一个基于模糊测试的XSS漏洞检测系统的研究.md

File metadata and controls

185 lines (122 loc) · 25.5 KB

对一个基于模糊测试的XSS漏洞检测系统的研究

1. XSS漏洞原理、利用方式和危害的分析与研究

攻击者利用web应用程序没有将用户的输入进行有效验证和过滤,就将其插入到响应中这一漏洞,将恶意脚本代码注入到生成的网页中。正常用户访问该网站时,认为此页面时可以信赖的,嵌入其中的脚本会在web浏览器下载该页面的时解释执行。攻击者由此获得了敏感页面内容、会话cookie、其他对象变量的访问权限。由于服务器管理员只能获得很少的攻击信息,漏洞的修补时间常常低于其他类型的漏洞,导致此类攻击具有极强的隐蔽性。

在web浏览器中的JavaScript脚本语言极大的提高了web应用的功能和易用性。在客户端的JavaScript有各种安全性限制,其中最重要一条是同源策略。简单来说,该策略保证了一个脚本只能读取和包含这一脚本的文档来源相同的窗口和文档的属性。同源策略可以有效防止恶意脚本窃取私有信息,但是由于策略相关的是脚本所嵌入的文档的来源,对脚本本身对来源并无限制,就导致了跨站脚本攻击得以实现。比如一个来自M的脚本嵌入到一个N的web页面中,则此脚本可以完整的访问包含它的N的文档内容。但是如果脚本打开另一个窗口并载入一个来自M的文档,同源策略就会阻止脚本访问该文档。由于对脚本本身对来源没有限制性,从而使得跨站脚本攻击得以实现并用于攻击。

XSS攻击的危害包括:

1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

3、盗窃企业重要的具有商业价值的资料

4、非法转账

5、强制发送电子邮件

6、网站挂马

7、控制受害者机器向其它网站发起攻击

根据攻击方式和存在周期的不同,可以将XSS漏洞分为反射型XSS,存储型XSS和基于文档对象型XSS三种不同的类型。其中反射型XSS漏洞是最常见的XSS漏洞,针对此类漏洞的攻击数量也是最多的。具体的攻击方式可以分为以下五个步骤:

  • 恶意攻击者通过邮件等方式将附加了恶意脚本的网址链接发送给用户。
  • 用户访问发来的链接,将嵌入的脚本当做数据提交,进入网站。
  • 网站对提交数据进行处理,将处理结果嵌入到反馈页面中。用户下载该页面后潜在链接中的脚本被用户的浏览器执行。
  • 恶意脚本在用户浏览器中执行后,获取了用户在网站的所有操作:例如用户cookie和session信息,都被脚本收集到,在用户不知情的情况下发送给攻击者。
  • 攻击者利用得到的信息伪装成该用户,进入相应的网站进行非法活动。

攻击者如果可以让用户执行他们提供的脚本,就可以从用户在浏览的域中获取到用户的个人信息,可以完全修改用户看到的页面、跟踪用户在浏览器中的每一个动作,甚至利用用户浏览器的缺陷完全控制用户的机器。

2. 常见的漏洞挖掘技术

  • 手工测试
  • 补丁比对
    • 定义:一种通过对比补丁之间的差异来挖掘漏洞的技术。
    • 优点:发现速度快
    • 缺点:已知漏洞
    • 常见工具:PatchDiff2、bindiff
  • 程序分析
    • 静态
      • 定义:是指在不运行计算机程序的条件下,通过词法分析、语法分析、语义分析、控制流分析、污点分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性等指标的一种代码分析技术。
      • 优点:覆盖率100%,自动化程度高
      • 缺点:漏报和误报(RICE,程序分析问题不可判定)
    • 动态
      • 定义:在运行计算机程序的条件下,验 证代码是否满足规范性、安全性等指标的一种代码分析技术。一般通过插桩技术分析程序的异常行为。
      • 插桩技术是指在保证被测程序逻辑完整性的基础上在程序的关键位置插入一些“桩”,即加入一些测试代码,然后执行插桩后的程序,通过“桩”的执行获取程序的控制流和数据流信息,进而分析程序的异常行为。
      • 优点:自动化程度高、覆盖率较高
      • 缺点:漏报和误报(RICE,程序分析问题不可判定)
      • 工具:Android:Xposed
  • 二进制审核
    • 定义:源代码不可得,通过逆向获取二进制代码,在二进制代码层次上进行安全评估
    • 优点:缺点: 同静态审核
    • 逆向导致信息丢失,理解困难,甚至引入逻辑错误。
    • 二进制及编辑工具:IDA Pro、Ollydbg、UltraEdit、Hex Workshop以及WinHex
  • 模糊测试
    • 定义:通过向被测目标输入大量的畸形数据并监测其异常来发现漏洞
    • 关键:测试用例构造,自动化。
    • 优点:无须源码、误报低、自动化程度高
    • 缺点:覆盖率低
    • 工具:Peach、Sulley、Autodafe、SPIKE等

由于XSS攻击的普遍性和广泛性,针对它的主要研究方向有XSS漏洞挖掘和攻击防范两个方面。前者应用在服务器端,主要目的是在攻击手段发生之前发现潜在的漏洞,并及时修补。后者主要应用在客户端,主要思路是在攻击正在进行时发现并阻止攻击行为。但是由于漏洞挖掘方面,代码分析技术需要代码开源,挖掘能力不足,同时也具有较大的虚警率和漏警率。攻击防范方面,各种发现和阻止攻击手段的方法都仅仅针对某一种类型的XSS攻击起作用,且对客户端用户有较高的要求。二者都有其缺陷,由此引入模糊测试技术来解决XSS漏洞检测问题。

Fuzzing技术不需要测试目标的开源性,且功能强大,具有易于自动化等特点,成为了越来越流行的漏洞挖掘技术。

3. 模糊检测技术及现有的用于Web检测的Fuzzing软件介绍

在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。模糊测试的技巧在于,它是不符合逻辑的:自动模糊测试不去猜测哪个数据会导致破坏(就像人工测试员那样),而是将尽可能多的杂乱数据投入程序中。由这个测试验证过的失败模式通常对程序员来说是个彻底的震撼,因为任何按逻辑思考的人都不会想到这种失败。

模糊测试是一项简单的技术,但它却能揭示出程序中的重要 bug。它能够验证出现实世界中的错误模式并在您的软件发货前对潜在的应当被堵塞的攻击渠道进行提示。

模糊测试能够说明 bug 在程序中的出现。并不证明不存在这样的 bug。而且,通过模糊测试会极大地提高您对应用程序的健壮性及抵御意外输入的安全性的自信心。如果您用 24 小时对程序进行模糊测试而其依然无事,那么随后同种类型的攻击就不大可能再危及到它。(并不是不可能,提醒您,只是可能性很小。)如果模糊测试揭示出程序中的 bug,就应该进行修正,而不是当 bug 随机出现时再对付它们。模糊测试通过明智地使用校验和、XML、垃圾收集和/或基于语法的文件格式,更有效地从根本上加固了文件格式。

模糊测试是一项用于验证程序中真实错误的重要工具,也是所有意识到安全性问题且着力于程序健壮性的程序员们的工具箱中所必备的工具。

分析通信协议很难,而且自己准备数据成本太高,那么我们就可以用模糊测试的方式,让机器生成测试数据,病发送给服务器,最后测试人员再对测试结果进行分析。

模糊测试充分利用了机器的能力:随机生成和发送数据;同时,也尝试将安全专家在安全性方面的经验引入进来。从执行过程来说,模糊测试的执行过程非常简单:

  1. 测试工具通过随机或是半随机的方式生成大量数据;
  2. 测试工具将生成的数据发送给被测试的系统(输入);
  3. 测试工具检测被测系统的状态(如是否能够响应,响应是否正确等);
  4. 根据被测系统的状态判断是否存在潜在的安全漏洞。

在本系统可以化为以下模块:

  • 识别输入:枚举所有的程序信息输入源、找出其中最有可能触发系统漏洞的部分。

  • 构造测试数据:根据目标应用程序及其使用的数据格式,采用预定义或变异现合法数据等方式生成测试数据。为了保证整个测试流程等自动化,测试样本的构造需要自动化完成。

  • 执行测试数据:将生成的测试样本数据发送给目标程序。

  • 捕获程序异常:需要对目标程序进行实时监控,并能够在捕获到程序异常时定位到引起异常的测试数据样本,保存当前测试数据样本以便重现程序异常。

根据模糊测试中测试样本的构造方式,可以将测试方法分为两大类:基于衍生的Fuzzing和基于生成的Fuzzing。前者根据现有的数据进行衍生变异创造畸形的测试数据,后者通过对目标协议或文件格式进行学习和建模,完全从头创建测试数据。 如果细化,模糊测试可以使用如下的五种测试数据生成方式,分别是预生成测试数据、随机方法、人工生成测试数据、自动化衍生数据、自动化协议生成数据。

根据测试的目标程序的不同,可以把测试器分为两大类——本地模糊测试器和远程模拟测试器。前者主要针对的目标程序为当前机器中所运行的程序,主要输入源为命令行、环境变量和文件等。后者是以侦听一个网络接口等软件为目标进行检测。攻击者可以利用漏洞提升在服务器上的权限,从而远程执行恶意代码或获取限制数据。远程模糊测试器主要包括网络协议模糊器和web应用模糊器。在网络协议模糊测试中,网络协议有简单协议和复杂协议之分,简单协议只有简单的认证或者根本就没有认证,常常是基于ASCII码的可打印文本,简单协议也往往没有长度和验证码等信息。一个简单的例子就是FTP协议,在该协议中,所有的通信内容是以普通的ASCII码文本的形式传输的。就认证而言,只需要简单的文本形式的用户名和密码认证。复杂协议通信中往往由二进制码组成,认证方式复杂,包括加密和解密。

在web应用方面,模糊测试主要寻找SQL注入、XSS等漏洞。这些模糊器使用HTTP进行通信并通过捕获网络反馈来分析安全漏洞的。proxy是一个基于浏览器代理的web模糊器,webfuzz是一个图形化web应用模糊器。其中后者可以应用于XSS的漏洞检测,但是其测试数据的构造和程序异常捕获都需要人工处理。由于程序中有大量的人工交汇,这样的工作方式极大的降低了测试器的效率和自动化程度。

4. 分析一个基于客户端的XSS漏洞检测系统

市场上现有的XSS漏洞检测系统具有需要将源代码公开,检测准确度不高,对未知漏洞检测能力不强等缺陷,创新性的将Fuzzing技术应用到XSS漏洞挖掘中有很高的现实意义。该技术具有实施方便,没有源码的优点。

主要思路是将网站服务器作为Fuzzing检测的目标,不断向web服务器发送测试数据,并捕获服务器异常情况进行判断,最终实现挖掘服务器潜在XSS漏洞的功能。该系统主要由网络爬虫、测试数据生成器、异常捕获器和浏览器等模块组成。网络爬虫负责对一个网站或某一类型网址进行遍历,并找出其中的交互式页面。测试数据生成器负责产生测试数据,并作为交互页面的提交内容进行提交。浏览器负责找到交互页面中能够进行模糊测试的表单项,并将生成的测试数据作为表单项内容提交服务器网站。最后,异常捕获器负责对服务器端端反馈信息进行检测,当发现有匹配情况时则判定攻击成功,从而挖掘出网站潜在的漏洞。

整个系统的工作流程如下:

  • 步骤一:使用网络爬虫遍历某个网站,将搜索到的所有交互式页面存入待检测页面列表中。
  • 步骤二:从带检测列表中获取一个页面信息,浏览器从中找到可以进行模糊测试的表单项。如待检测列表为空则转到步骤六。
  • 步骤三:测试数据生成器根据待检测页面信息产生测试数据。
  • 步骤四:浏览器使用步骤三生成的测试数据作为表单项内容向服务器提交。
  • 步骤五:异常捕获器分析服务器的反馈信息:如攻击成功则保存当前检测页面信息和使用的测试数据,转到步骤二;如攻击成功则转到步骤三。
  • 步骤六:在待检测列表中为空或者程序超时的情况下,程序结束。

分析如上步骤,使用Fuzzing技术挖掘网站中的XSS漏洞,实施方便、无源码限制、功能模块化且易于扩展。

4.1 网络爬虫的设计思路

网络爬虫模块的主要功能是对指定的网站或一系列网址进行遍历。本系统中的网络爬虫的主要目的是要在遍历到的网站链接中找出交互式页面并将网页地址保存下来用于后续检测。对于有向图来说,可以采用深度优先和广度优先两种方式进行遍历。考虑到程序的并发性,以及便于保存中间状态,本文采用广度优先的方式来对网站进行遍历。

在网络爬虫模块中,遍历引擎从URL Hash表中获取未访问的URL地址,通过与服务器的交互,获得对应网页的内容,并将其内容交给解析引擎。解析引擎获得网页内容后,通过分析HTML文档中的结构,从中提取出网页链接并将其存入URL Hash表中,而同时并对网页链接进行分析,如果发现其中有表单post等交互式信息时,将此URL地址存入交互式URL列表中。URL Hash表以URL地址为健值,保存所有遍历到所有已访问和未访问的URL地址。在时间超时或者遍历玩整个网站的条件下,结束整个模块的运行,并将获得的待检测的URL地址保存子啊交互式URL列表中,作为整个模块的输出以便于下一步检测。

URL Hash表在整个网络爬虫模块中有重要的作用,其中保存了所有的URL列表信息。

  • URL属性:其中包含所有需要遍历及已经遍历的URL地址。
  • URLid属性:根据加入Hash表的顺序,记录当前记录的序号。
  • TimeofURLHit属性:记录当前URL被遍历到的次数。
  • Crawler属性:记录当前URL网站是否已经访问。如果没有被访问到此属性值为0,被访问后属性值为1。
  • URL Hash表主要有以下的设计接口,可以达到初始化列表,从Hash表中获得一个未访问的URL地址,将此URL加入到Hash表中,保存URL Hash,以便下次可以从此次中断处获取所有URL信息,减少重复访问的次数。

4.1.1 遍历引擎的实现

所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。当然遍历的概念也适合于多元素集合的情况,如数组。

使用InitQueue函数,将网站的首页的URL加入到Hash队列中。继续调用G额头URL函数,判断返回值是否为空;并调用判断超时函数。如果返回值为真,则退出;为假,则获取得到的URL值,用得到的URL值对服务器发出请求,并获取页面信息。将反馈的页面信息提交给解析引擎,继续调用GetURL函数。

4.1.2 解析引擎的实现

解析引擎负责对反馈的HTML页面解析,在其中提取出所需要的URL链接。在对常见的标签进行分析时,由于结构简单,通过简单的正则表达式操作则能提取其中的链接,链接信息就存在标签SRC属性中。对复杂标签的提取,例如表单标签,提取步骤比较复杂。首先对表单内容进行匹配,之后获取表单中的URL值,分析表单中各项属性数据(如input,selec等数据项,并提取其name,type,value等各个属性的具体值),最后将获取的数据对应组合,形成最终的交互式链接。

在解析引擎中,通过以上的方式获取反馈页面中的链接和表单信息,并将所有的数据存入URL Hash表中,以便后续的遍历以及安全性检测。

4.2 测试数据生成器的设计和实现

在模糊测试中,在整个过程中,反复生成各种数据样本并监视目标软件异常为模糊测试的主要工作流程。本文的检测系统主要挖掘潜在XSS漏洞,各种不同类型的脚本代码为我们需要生成的测试数据。生成测试数据的方式有预生成和自动协议生成两种方式。

4.3 异常捕获器的设计与实现

相对于文件模糊测试等类型的测试器,XSS模糊测试器在异常捕获方面有一定便利,仅仅需要对Web服务器的反馈内容进行分析,并检测XSS攻击是否成功。在系统中采用两种方法来检测XSS攻击是否成功,分别是HTML解析和API挂接。

采用HTML解析的方式对反馈页面进行检测,判断注入的核心脚本代码能否执行。首先需要将辅助标记加到需要检测的攻击向量中,然后借助辅助标记的匹配,从而找到攻击向量在反馈中的位置和内容,最后通过攻击向量在网页中的上下文关系,判断攻击是否成功。

但是由于JavaScript脚本调用的多样性,使用HTML解析来检测会有较大的遗漏。同时每个不同的攻击向量都要设计辅助标记加入方式,以及对应的提取和判断正则表达式。HTML的解析方式也有所不足。如果所有的测试数据都使用了alert函数,可以使用API HOOK的方式来检测浏览器的行为,准确判断注入代码是否可以运行。

5. 模糊测试技术发展方向

渗透测试是一种有效的测试方法,但由于它对执行者的能力要求太高,因此很难被大规模应用。站在测试的角度,我们是否能够用自动化测试这个强有力的武器帮助降低安全性测试的门槛呢?一个容易想到的“录制/回放”方法是:将渗透测试的执行者们的操作录制下来,形成脚本,期望这些脚本可以在不加修改或是稍加修改时应用在对其他应用的安全性测试中。但由于渗透测试的过程并不具有可重复的特点(测试执行主要依赖执行者的经验,类似调试),这种想法在真实的安全性测试环境下完全不可行。完全自动化的工具通常只能发现那些可被用标准化方式发现的特定安全漏洞(如简单的SQL注入漏洞)。

模糊测试是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。它充分利用了机器的能力:随机生成和发送数据;同时,也尝试将安全专家在安全性方面的经验引入进来。

简单的说,模糊测试尝试降低安全性测试的门槛,通过半随机方式的数据发送来找出被测系统的漏洞。显然,测试这对被测应用越了解,模糊测试的生成就能越准确。但与渗透测试或是代码审查相比,模糊测试显然更加易于进行。而且,通过自动化工具,模糊测试可以把安全方面的经验积累到工具中,为组织持续的安全性测试提供帮助。

模糊测试技术经过近20余年的发展,已逐步成为一种流行的被广泛应用的漏洞挖掘技术。但是,模糊测试技术仍然存在许多的局限性。例如,通过模糊测试技术挖掘出的漏洞大多仍是传统的溢出类错误,对于后门、鉴权绕过等逻辑上的错误依然无能为力。同时,模糊测试技术也不能准确的发现多条件触发的漏洞。 更重要的是, 模糊测试技术不能保证畸形输入数据能够覆盖到所有的分支代码, 这就使得即使通过模糊测试检验的软件仍可能存在不被发现的漏洞。如何克服缺陷、提高漏洞挖掘的效率是模糊测试技术未来的研究热点。模糊测试技术未来的研究热点可能包括以下几个方面:

  • 提高测试用例的通过率 以网络协议的模糊测试为例,即使我们通过模糊测试技术生成了大量的畸形测试数据,但这些测试数据中的绝大部分会被网络协议的校验机制所拒绝,这样的测试效率是极低的。 所以我们并不能用大量的纯随机数据来测试网络协议,而是应该构建出通过率更高的测试用例, 例如, 可以将模糊测试配置成使用已知有效数据、故意错误数据和随机数据的组合,这样既可以提高测试用例的通过率也不会使测试用例过多的受测试人员的主观影响。 再如,也可以在随机测试数据后面增添校验位, 或者在了解待测网络协议的数据包格式后构造出符合规定的测试用例,这些方法可能大幅度提高测试用例的通过率。
  • 协议格式自动化分析 对文件、协议格式的深刻理解可以帮助测试人员构建出通过率很高的测试用例,但这繁琐复杂的测前准备工作也给测试工具开发人员带来很大的负担, 可以设想,即使针对一个简单的非公开协议也需要花费编程人员大量的时间研究目标协议的工作规范, 更何况,待测试的网络协议规范很可能是未经公开的。 这就指明了模糊测试技术未来的另一个发展方向, 即实现文件、协议格式的自动化分析。
  • 引进并行和分布式技术 模糊测试技术最大的一个特点是可以生成数量巨大的测试用例, 从而使对软件进行全方位测试成为可能。 但巨大的测试用例数量也带来了执行效率低的缺点。 因此, 引进并行和分布式技术, 有效的减少测试时间。 这或许会为未来构造出更大量的测试用例提供良好基础。
  • 基于知识库构造测试用例 如何提高测试数据的针对性也是模糊测试技术未来发展必须解决的一个问题可以通过为模糊测试工具连接一个数据库提高测试用例的针对性。假设这个数据库中存储着大量已知的攻击模式,在构造测试用例时,通过从该数据库调用能引起已知攻击的测试数据并在后面加上随机数据的方法来构造针对性强的测试用例。 也可以在该数据库中存储一些有用的资源,例如一些常见系统、数据库和Web 应用的用户名和密码字典, 常用的脚本后门程序,服务器响应信息等,这些资源能有助于测试人员构造出能顺利通过系统检测的测试数据包, 也方便测试人员研究和发现应用程序的安全漏洞。
  • 提高代码覆盖率 在构造测试用例过程中无法估算代码覆盖率是模糊测试技术的重大缺陷之一。代码覆盖率是软件测试中的一种度量, 描述程式中源代码被测试的比例和程度。 代码覆盖率常常被拿来作为衡量测试用例好坏的指标, 所以提高代码覆盖率是提高模糊测试效率的一种有效方式。 同时, 如果在构建测试用例时不知道这些测试用例的代码覆盖率, 则很难判断测试的完成情况, 更不清楚是否发现了软件中的所有漏洞。可以通过引入遗传算法达到提高代码覆盖率的目的,也可以在模糊测试工具中集成代码覆盖率计算工具,实现实时监测当前代码覆盖率的功能。
  • 更多平台的支持 目前, 几乎所有的模糊测试工具都只能运行在桌面操作系统上, 而对于支持智能手机等嵌入式操作系统的模糊测试工具还需要进一步的研究。另外,大多的模糊测试工具还不具有跨平台的能力,大多只能测试单一操作系统的软件漏洞。因此,研究具有跨平台,支持多种软硬件平台的模糊测试工具非常有价值。
  • 模糊测试的智能化 不能发现鉴权绕过和后门等逻辑上的错误一直是模糊测试技术无法规避的一个重大缺点。可以研究在生成测试用例的过程中引入知识或一些人工智能算法,使得模糊测试工具具有学习的能力,从而在一定程度上具备发现逻辑漏洞的能力。模糊测试技术的另一个缺点是不能对漏洞进行准确定位,即通过模糊测试技术只能判断出待测软件中存在何种漏洞并不能准确的定位到程序源代码中是哪一行引发了这个漏洞,可以研究通过结合动态二进制插装或提高监视器的监测精度来克服这个问题。
  • 此外, 目前市场上的大多数模糊测试工具都需要借助其他工具来进行监控或测试评估,所以研究功能更为完善的测试工具也是模糊测试领域的一个重要方向。 这类测试工具应能自动完成文件或协议格式的解析并生成大量符合要求的测试用例,对用例执行情况进行实时监控, 方便地获取用例执行信息,并能在发现漏洞时进行故障定位,完成测试结果的输出。同时还要有高效的算法来协调各个功能模块的执行,提升工具的运行效率。

简单的说,模糊测试尝试降低安全性测试的门槛,通过半随机方式的数据发送来找出被测系统的漏洞。显然,测试这对被测应用越了解,模糊测试的生成就能越准确。但与渗透测试或是代码审查相比,模糊测试显然更加易于进行。而且,通过自动化工具,模糊测试可以把安全方面的经验积累到工具中,为组织持续的安全性测试提供帮助。