笔记整理-信息系统开发基础-软件测试-模糊测试

模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。

在模糊测试中,用随机坏数据(也称做fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。模糊测试的技巧在于它是不符合逻辑的

自动模糊测试不去猜测哪个数据会导致破坏(就像人工测试员那样),而是将尽可能多的杂乱数据投入程序中。由这个测试验证过的失败模式通常对程序员来说是个彻底的震憾,因为任何按逻辑思考的人都不会想到这种失败。

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


以下内容转载自:https://blog.csdn.net/qq_41453285/article/details/102058343

一、模糊测试的概念

一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。

二、模糊测试各阶段

二、模糊测试各阶段

确定测试目标

  • 只有有了明确的测试目标后,我们才能决定使用的模糊测试工具或方法。如果要在安全审计中对一个完全由内部开发的应用进行模糊测试,测试目标的选择必须小心谨慎。但如果是要在第三方应用中找到安全漏洞,测试目标的选择就更加灵活。要决定第三方应用模糊测试的测试目标,首先需要参考该第三方应用的供应商历史上曾出现过的安全漏洞。在一些典型的安全漏洞聚合网站如 SecurityFocus 18 和 Secunia 19 上可以查找到主要软件供应商历史上曾出现过的安全漏洞。如果某个供应商的历史记录很差,很可能意味着这个供应商的代码实践 (code practice)能力很差,他们的产品有仍有很大可能存在未被发现的安全漏洞。除应用程序外,应用包含的特定文件或库也可以是测试目标。
  • 如果需要选择应用包含的特定文件或者库作为测试目标,你可以把注意力放在多个应用程序之间共享的那些二进制代码上。因为如果这些共享的二进制代码中存在安全漏洞,将会有非常多的用户受到影响,因而风险也更大。

确定输入向量

几乎所有可被利用的安全漏洞都是因为应用没有对用户的输入进行校验或是进行必要的非法输入处理。是否能找到所有的输入向量(input vector)是模糊测试能否成功的关键。如果不能准确地找到输入向量,或是不能找到预期的输入值,模糊测试的作用就会受到很大的局限。有些输入向量是显而易见的,有些则不然。寻找输入向量的原则是:从客户端向目标应用发送的任何东西,包括头(headers)、文件名(file name)、环境变量(environment variables),注册表键(registry keys),以及其他信息,都应该被看做是输入向量。所有这些输入向量都可能是潜在的模糊测试变量

生成模糊测试数据

一旦识别出输入向量,就可以依据输入向量产生模糊测试数据了。究竟是使用预先确定的值、使用基于存在的数据通过变异生成的值、还是使用动态生成的值依赖于被测应用及其使用的数据格式。但是,无论选择哪种方式,都应该使用自动化过程来生成数据。

执行模糊测试数据

该步骤紧接上一个步骤,正是在这个步骤,“模糊测试”变成了动词。在该步骤中,一般会向被测目标发送数据包、打开文件、或是执行被测应用。同上一个步骤一样,这个步骤必须是自动化的。否则,我们就不算是真正在开展模糊测试。

监视异常

一个重要但经常容易被忽略的步骤是对异常和错误进行监控。设想我们在进行一次模糊测试,在测试中,我们向被测的 Web 服务器发送了 10000 个数据包,最终导致了服务器崩溃。但服务器崩溃后,我们却怎么也找不到导致服务器崩溃的数据包了。如果这种事真的发生了,我们只能说这个测试毫无价值。模糊测试需要根据被测应用和所决定采用的模糊测试类型来设置各种形式的监视。

判定发现的漏洞是否可能被利用

如果在模糊测试中发现了一个错误,依据审计的目的,可能需要判定这个被发现的错误是否是一个可被利用的安全漏洞。这种判定过程是典型的手工过程,需要操作者具有特定的安全知识。这个步骤不一定要由模糊测试的执行者来进行,也可以交给其他人来进行。

三、模糊测试的使用流程

  • 从源码编译时进行插桩(插桩:类似于断点,但是在程序运行的时候不会断下来,而是记录下来)
  • 进行输入文件的选择,进行初始fuzzing
  • 选择策略和脚本,进行初始fuzzing数据的突变
  • 循环进行,并且记录触发了的crash或者时间、长度等

四、模糊测试的注意事项

  1. 如果某种框架存在或者爆出多次漏洞,那么程序仍有很大可能存在相关漏洞
  2. 在选择种子文件的时候,可以使用fuzzing框架自带的启发式算法自动确定文件格式结构
    2.1 确定有效的输入(能够控制的数据)
    2.2 尽量减小体积,建议每个字典单元都要小于1KB的大小

五、模糊测试器(fuzzer)

分类,、模糊测试工具按概念分为两类:

  • 基于变异(mutation-based):这一类测试器通过对已有的数据样本进行变异来创建测试用例
  • 基于生成(generation-based):该类测试器为被测系统使用的协议或是文件格式建模,基于模型生成输入并据此创建测试用例。这两种模糊测试器各有其优缺点

1.通用的开源框架
AFL、LibFuzzer、honggfuzz等(这些在GitHub或网上都可以找到)

2.不开源的
burpsuite等

演示案例:
RIPS代码审计工具,见文章:https://blog.csdn.net/qq_41453285/article/details/100802295
XssFuzzing代码审计工具,见文章:https://blog.csdn.net/qq_41453285/article/details/102055857
Seay代码审计工具,见文章:https://blog.csdn.net/qq_41453285/article/details/102057007

--------------本文结束 感谢您的阅读--------------