模糊测试是一个很主要的流程,有助于创造影响当今繁芜运用程序的未知关键缺点,有时候乃至能暴露出一些让人“脑洞大开”或者“七窍生烟”的奇葩问题。
文件Fuzzers
模糊测试应该用于测试每个须要接管某种形式输入的接口,最少要测试每个从潜在恶意来源获取输入的接口。除了前面提到的通信协议,文件也同样可能存在安全风险,尤其是我们熟知的二进制文件。

对付程序来说,少数字节错位都有可能使得全体运用程序毁于一旦。这些使程序崩溃的畸形文件通过破坏程序的字节,而使其毁坏自己的栈、堆。在旧式、无内存的操作系统中,畸形文件常日能将全体打算机宕掉。此外,还有JS文件和HTML等Web干系的文件,这些文件都有可能引发安全问题。
文件类型模糊测试的常日做法是:先准备一份插入程序中的精确的文件,然后用随机数据更换该文件的某些部分,末了用程序打开经模糊后的文件,不雅观察程序是否涌现非常或涌现了什么非常。
下面将先容一款工具:Domato。
针对文件的开源的Fuzz工具——Domato
1、什么是Domato
Domato是由Ivan Fratric编写的DOM fuzzer,紧张用来测试浏览器DOM引擎。从技能上讲,Domato并不是一个真正的fuzzer,而是一个测试用例天生器,它的基本思路和正常的fuzzer类似,也是根据给定的语法构造和属性来天生样本,这些语法可能来自是从各个地方抓取的HTML/JS/PHP/CSS等样本中所包含的,也可以是自定义的。
2、Domato的安装
在虚拟机高下载安装Domato非常大略,你只须要从Github年夜将源码下载下来即可。把稳,Domato的主文件是用python写的,请确保在Python环境下运行。Domato源码链接:https://github.com/googleprojectzero/domato
在终端实行以下命令即可将Domato的源码克隆下来:
git clone git://github.com/googleprojectzero/domato.git
Domato的代码紧张功能是根据语法天生测试样本,其紧张代码文件是generator.py和grammar.py,其他的.txt文件是语法文件。
generator.py是主文件,它将grammar.py作为库,包含了一些用于赞助天生样本的函数,是根据输入的语法来天生样本的引擎。
grammar.py实现了一个通用的语法库,用于解析参数,然后调用引擎来天生样本。
.txt文件是语法文件,它包含了语法定义,在Domato中有三个紧张的语法文件,分别是html.txt、css.txt和js.txt,它们分别包含了HTML,CSS和JavaScript的语法。这些语法文件可能包括来自其他文件的内容。此外,在php文件夹里也给出了PHP的语法文件(php.txt)。
除了以上几个文件外,还有一个被命名为template的文件,这是示例样本,Domato天生的测试样本便是基于这个文件进行变异的。
3、Domato的利用
3.1利用办法
Domato的利用方法非常大略,由于其本身给出了一些示例文件,你可以直策应用这些示例文件来天生样本。比如:
(1)当你想天生单个测试样本时,运行:pythongenerator.py <output file>
例如:天生单个.php样本,进入到php文件夹下,运行以下命令(事先创建一个output文件夹来存放天生的样本):python generator.pyoutput/test1.php
这样,我们就成功天生了一个命名为test1.php的样本,并保存到了刚刚创建的output文件夹下。比拟根本样本文件template.php,我们创造Domato在该文件根本上进行了模糊处理。
(2)当你想通过单次调用天生多个测试样本时,运行:
python generator.py--output_dir <output directory> --no_of_files <number of outputfiles>
天生的样本将被放在指定的目录(<output directory>)下,并自动命名为fuzz-<number>.html,如fuzz-00001.html、fuzz-00002.html等。<number of outputfiles>指定你要天生的样本数。由于输入语法文件只须要加载和解析一次,以是你可以快速地天生多个样本。
例:天生10个.php样本。实行:python generator.py --output_dir output --no_of_files 10
可以看到,我们成功在output目录下天生了10个php测试样本,且按0到9编号。抽取两个样本进行比较,创造其从第171行开始模糊(变异)。
那么问题来了,我们天生的测试样本有什么用呢?前面说过,模糊测试是一个须要大量测试数据来进行测试的技能手段,如果利用人工布局,将耗费大量的人力物力。Domato在这里就充当了一个模糊测试样本天生器,它将与其他测试工具一起完成模糊测试。也便是说Domato卖力天生测试样本,然后由其他测试工具来利用这些样本进行后续的测试事情。
3.2文件简析
前面我们讲到Domato本身包含了许多示例文件,我们可以直策应用这些文件来天生测试样本。但是当这些示例文件无法知足我的测试需求时,我能不能自己编写脚本文件呢?答案是可以的。
要编写得当的示例文件,你首先要清楚文件的关键代码和语法构造。
前面也说过Domato中比较主要的文件有generator.py、grammar.py和.txt文件。个中grammar.py文件是通用的语法库,里面包含了不同类型的语法,我们可以直接引用它,以是在此不关注它的代码。
(1)generator.py
以Domato的php示例文件为例,你可以利用文本查看/php/generator.py文件。
首先要利用具有自定义语法的天生引擎,你可以利用以下python代码:
from grammar import Grammar#导入语法库
该文件紧张包含以下函数:main()主函数、get_option函数、generate_samples函数和generate_new_sample函数。它的事情流程大致是这样的:
在主函数中,先读取用户输入的命令,调用get_option函数来根据标志--output_dir和--no_of_files来识别、提取样本输出路径和天生样本数,为后续输出样本做准备。
接着调用generate_samples函数来天生一组示例并将其写入输出文件。在这部分,它先打开并读取示例样本(即template文件,也可以改本钱身的);然后调用Grammar语法库中定义的parse_from_file函数来打开语法文件(即.txt文件),对其进行解析并加载个中的语法规则;末了调用generate_new_sample函数来解析语法规则,并将其返回的包含样本数据的字符串写入天生的测试样本文件中。在该函数中,紧张关注以下两句代码:
my_grammar = Grammar()my_grammar.parse_from_file('input_file.txt')
generate_new_sample函数遍历template文件,找到文件中须要进行模糊的部分(如<phpfuzzer>),然后将其更换为根据语法文件进行变异后的内容。该函数紧张代码如下:
result_string = my_grammar.generate_code('symbol_name')
(2).txt文件
这是语法文件,这是Domato十分主要的部分。该工具的开拓者自定义了一种语法格式,其基本的语法如下:
<symbol> = a mix of constants and<other_symbol>s
每个语法规则都包含一个左侧和右侧由相等字符分开。左侧包含符号,而右侧是符号/常量及其组合(包含如何扩展该符号的详细信息)。在扩展符号时,右侧的所有符号都会递归扩展,而所有不是符号的符号都只是复制到输出中。请把稳,单个规则不能超过输入文件的多个行。
Domato的解释文件中给出了这样的例子:
这里可能天生的样本内容便是:a { width:100% }或b{ width:100% }。把稳,这里的<selector>可以定义一些附加属性,如利用“p”属性指定规则的概率:
这里表示字符a涌现的概率是0.9,字符b涌现的概率是0.1,也便是说字符a的输出概率会高于字符b。如果不特殊声明,则概率是差不多的。
用于天生代码的语法和普通的语法是差不多的,但是这里引入了一些规则。以便灵巧地天生样本。开拓者举了这样一个例子:
个中,!varformat语句用来定义利用的变量的格式,!lineguard语句用于定义每个行周围插入的其他代码,以便捕捉非常或实行其他任务,这两个语句都是可选的。!begin lines和!end lines用于定义只有在天生其他行时才会利用的代码行,这里利用了<new element>,表示天生了一个变量,一样平常将fuzz部分置于这两行之间。
调用上述脚本将天生一个5行的样本,可能得到类似下面的结果:
下面我们考试测验编写一个大略的语法文件。
首先要明确我们想输出的样本措辞是什么形式的。比如我们希望输出的样本中的内容是由以下形式的句子组成的:
然后我们给这些变量赋值,如:
这样我们就可以将其按Domato指定的语法格式编写出来,如下:
Domato将根据此语法文件天生符合措辞规则的随机组合,例如: