2018-03-15 22:16:56 +07:00
|
|
|
|
# 5.1 模糊测试
|
|
|
|
|
|
2018-05-02 21:27:00 +07:00
|
|
|
|
- [基本原理](#基本原理)
|
|
|
|
|
- [方法实现](#方法实现)
|
|
|
|
|
- [实例分析](#实例分析)
|
2018-03-15 22:16:56 +07:00
|
|
|
|
- [参考资料](#参考资料)
|
|
|
|
|
|
|
|
|
|
|
2018-05-02 21:27:00 +07:00
|
|
|
|
## 基本原理
|
2018-03-15 22:16:56 +07:00
|
|
|
|
模糊测试(fuzzing)是一种通过向程序提供非预期的输入并监控输出中的异常来发现软件中的故障的方法。
|
|
|
|
|
|
|
|
|
|
用于模糊测试的模糊测试器(fuzzer)分为两类:
|
|
|
|
|
- 一类是基于变异的模糊测试器,它通过对已有的数据样本进行变异来创建测试用例
|
|
|
|
|
- 另一类是基于生成的模糊测试器,它为被测试系统使用的协议或文件格式建模,基于模型生成输入并据此创建测试用例。
|
|
|
|
|
|
2018-03-23 21:14:25 +07:00
|
|
|
|
#### 模糊测试流程
|
2018-03-15 22:16:56 +07:00
|
|
|
|
模糊测试通常包含下面几个基本阶段:
|
2018-03-23 21:14:25 +07:00
|
|
|
|
1. 确定测试目标:确定目标程序的性质、功能、运行条件和环境、编写程序的语言、软件过去所发现的漏洞信息以及与外部进行交互的接口等
|
|
|
|
|
2. 确定输入向量:例如文件数据、网络数据和环境变量等。
|
|
|
|
|
3. 生成模糊测试数据:在确定输入向量之后设计要模糊测试的方法和测试数据生成算法等
|
|
|
|
|
4. 执行模糊测试数据:自动完成向测试目标发送大量测试数据的过程,包括启动目标进程、发送测试数据和打开文件等
|
|
|
|
|
5. 监视异常:监视目标程序是否产生异常,记录使程序产生异常的测试数据和异常相关信息
|
|
|
|
|
6. 判定发现的漏洞是否可被利用:通过将产生异常的数据重新发送给目标程序,跟踪异常产生前后程序相关的处理流程,分析异常产生的原因,从而判断是否可利用
|
|
|
|
|
|
|
|
|
|
#### 基本要求
|
|
|
|
|
要实现高效的模糊测试,通常需要满足下面几个方面的要求:
|
|
|
|
|
1. 可重现性:测试者必须能够知道使目标程序状态变化所对应的测试数据是什么,如果不具备重现测试结果的能力,那么整个过程就失去了意义。实现可重现性的一个方法是在发送测试数据的同时记录下测试数据和目标程序的状态
|
|
|
|
|
2. 可重用性:进行模块化开发,这样就不需要为一个新的目标程序重新开发一个模糊测试器
|
|
|
|
|
3. 代码覆盖:指模糊测试器能够使目标程序达到或执行的所有代码及过程状态的数量
|
|
|
|
|
4. 异常监视:能够精确地判定目标程序是否发生异常非常的关键
|
|
|
|
|
|
|
|
|
|
#### 存在的问题
|
|
|
|
|
模糊测试中存在的问题:
|
|
|
|
|
1. 具有较强的盲目性:即使熟悉协议格式,依然没有解决测试用例路径重复的问题,导致效率较低
|
|
|
|
|
2. 测试用例冗余度大:由于很多测试用例通过随机策略产生,导致会产生重复或相似的测试用例
|
|
|
|
|
3. 对关联字段的针对性不强:大多数时候只是对多个元素进行数据的随机生成或变异,缺乏对协议关联字段的针对性
|
2018-03-15 22:16:56 +07:00
|
|
|
|
|
|
|
|
|
|
2018-05-02 21:27:00 +07:00
|
|
|
|
## 方法实现
|
|
|
|
|
|
|
|
|
|
## 实例分析
|
|
|
|
|
|
2018-03-15 22:16:56 +07:00
|
|
|
|
## 参考资料
|
|
|
|
|
- [Fuzzing](https://en.wikipedia.org/wiki/Fuzzing)
|
2018-05-02 21:27:00 +07:00
|
|
|
|
- [Awesome-Fuzzing](https://github.com/secfigo/Awesome-Fuzzing)
|