模糊测试原理 模糊测试是一种基于缺陷注入的自动化测试技术,没有具体的执行规则,旨在预测软件中可能存在的错误以及什么样的输入能够触发错误。其通过模糊器向目标应用发送大量的畸形数据并监视程序运行异常以发现软件故障,通过记录触发异常的输入数据来进一步定位异常位置。
与基于源代码的白盒测试相比,模糊测试的测试对象是二进制目标文件,因而具有更好的适用性:模糊测试是一种自动化的动态漏洞挖据技术,不存在误报,也不需要人工进行大量的逆向分析工作。
完整的模糊测试都要经历以下几个基本的阶段,如图7-42 所示。

(1)识别目标
在没有确定测试对象测试范围的情况下,无法对模糊测试工具或技术作出选择。通常我们需要考虑以下问题:被测目标类型,如被测目标是客户端程序还是服务端程序,是应用层协议还是网络崖协议;被测目标历史上是否出现过漏洞,漏洞原因在哪里等。
(2) 识别输入
几乎所有可被人利用的漏洞都是因为应用程序接受了用户的输入并且在处理输入数据时没有首先清除非法数据或执行确认例程。枚举输入向量对模糊测试的成功至关重要。未能定位可能的输入源或预期的输入值对模糊测试将产生严重的限制。任何从客户端发往目标应用程序的输入都应该被认为是输入向量。这些输入包括消息头、文件名、环境变量、注册键值等等。所有这些都应该被认为是输入向量,因此都应该是可能的模糊测试变量。
(3)生成模糊测试数据
一旦识别出输入向量,就可以生成模糊测试数据。可依据测试对象的特征,制定相应的模糊测试数据生成策略。例如可通过变异已有的数据动态生成数据。不管选择什么策略,生成模糊测试数据过程中都应该引入自动化。
(4) 执行模糊测试数据
执行过程可能包括发送数据包给目标应用程序、打开一个文件或发起一个目标进程。同样,这个过程中的自动化也是至关重要的。没有自动化,便无法执行真正的模糊测试。
(5) 监视异常
在模糊测试过程中,对故障或异常的监视过程有重要意义。例如,如果我们没有办法准确指出是哪一个数据包引起崩溃,那么向目标Web 服务器发送10000 个模糊测试数据包,最终导致服务器崩溃便失去意义。监视可以采用多种形式,同时不应该依赖目标应用程序和所选择的模糊测试类型。
(6) 确定可利用性
一旦确定被测目标存在故障,则需要确定所发现的Bug 是否可重现,重现故障最常用的手段就是重放检测,即调用数据包重放工具将转储的网络数据包进行重放。重现成功后,还需进一步判断该Bug 是否可被利用。这是一个典型的人工过程,需要具备安全领域的专业知识。