本申请属于web测试领域,具体涉及一种基于程序状态反馈和控制流图的web模糊测试方法。
背景技术:
1、现有的web模糊测试方法忽略了多维输入字段的复杂关系。web请求数据包包含了多个输入字段,且输入字段之间相互关联。多个输入字段可能相互作用共同作用在一条测试路径上,这种情况在web应用上很常见。而这是导致web模糊测试生成测试样例效率较低且模糊测试路径覆盖率不高的关键原因。现有的web模糊测试技术并未考虑这一点,只是随机挑选一个字段进行变异。当出现多个字段控制同一路径时,仅变异一个字段并不能产生新路径,根据传统模糊测试的判定原则,该测试用例将会被废弃,这导致了传统的web模糊测试不能快速有效的完成测试。拟采用基于控制流图和程序状态反馈的结构感知策略。
技术实现思路
1、基于上述问题,本申请根据控制流图确定未被测试的控制流,进而找到影响控制流的关键控制节点。再根据程序状态反馈思想,定位测试用例与控制节点之间的依赖关系。通过不断变异测试用例中具有依赖关系的字段,来达到提高变异覆盖率的目的。其技术方案为:
2、一种基于程序状态反馈和控制流图的web模糊测试方法,包括以下步骤:
3、s0. 选取初始测试用例加入种子池;
4、s1.根据抽象语法树将所有控制流不发生改变的程序视为一个基本块,即基本块为控制流图;
5、s2.对所有的基本块进行插桩;
6、s3.从种子池种选取字段输入种子运行程序,一方面更新控制流图,生成新的控制流图,通过输入字段与种子运行程序的控制映射关系找到影响控制流图的关键节点;另一方面在运行种子运行程序时识别多维输入字段和控制节点的反馈映射关系,并进行标记;
7、根据输入字段与控制指令之间的反馈映射关系,反向定位到影响该控制指令的输入字段,确定待变异的输入字段的位置;
8、s4.对待变异的输入字段进行确定性逐字节变异,将测试到新的控制节点的输入字段放到种子池中进行下一轮变异;
9、s5.将突变生成的测试用例放到目标程序中进行执行,如果所执行的程序更新了覆盖率则将其保留并加入到种子池中,重复步骤s3-s5。
10、优选的,步骤s2中,对所有的基本块进行插桩:
11、s21.将目标代码解析为抽象语法树:
12、将顺序执行的代码作为一个基本块,从根结点开始对抽象语法树进行深度优先遍历,同时对每个基本块的目标位置:函数入口、函数出口、循环起始或结束点、条件分支进行对应的插桩操作,每个基本块的目标位置即是插桩点位置;
13、s22.根据插装点的位置,生成额外的代码或指令,用于记录数据、跟踪执行路径;
14、s23.将生成的插装代码插入到基本块的目标位置。
15、优选的,步骤s3中,
16、s31.根据抽象语法树ast生成控制流图cfg,将ast的结构转化为cfg的图结构;
17、s32.遍历ast的每个节点,对于每个节点,确定它的类型以及节点的子节点;对于ast中的每个节点,根据节点的类型和子节点,确定其对应的基本块;
18、s33.为每个基本块创建一个节点,这些节点对应于控制流图中的节点,根据ast中节点的控制流关系,创建从源节点到目标节点的边;
19、s34.对于ast中的循环结构,将循环结构转化为基本块,并为其创建一个独立的节点;如果存在多个节点只被一个节点引用,那么可以将这些节点合并为一个新的节点;
20、s35.最终确定入口节点和出口节点,从而形成完整的控制流图。
21、优选的,步骤s3中,控制映射关系是通过翻转每位输入字段并在每个输入字段上放置标签的方式来识别输入字段和控制指令之间的映射关系,并定位到原程序中未被测试的控制指令;通过控制映射关系来分配标记,收集控制指令信息。
22、优选的,步骤s4中,输入字段进行突变操作,将执行突变操作后生产的测试用例输入给程序进行测试,若测试到新的控制节点,则将该测试用例放到种子池中进行下一轮变异;否则,将视为本次变异无效,抛弃该此时用例。
23、优选的,步骤s4中,变异形式包括字节翻转、字节替换、随机数插入和字典变异;其中
24、字节翻转:通过随机选择数据中的一个或多个字节,并将其位置进行翻转,从0变为1或从1变为0,以生成新的测试用例;
25、字节替换:将选取的字节替换为其他随机选择的字节,以生成新的测试用例;
26、随机数插入:在输入数据中插入随机选择的字节;
27、字典变异:根据语料库中的语料对输入数据进行替换、重复、插入操作。
28、与现有技术相比,本申请有益效果如下:
29、针对web请求中多维字段共同影响一条路径从而增加了种子的变异难度的,降低了有效种子的生成率的问题。本文提出了基于控制流图和程序状态反馈的结构感知策略,根据控制流图确定未被测试的控制流,进而找到影响控制流的关键控制节点。再根据i2s(input-to-state)思想,定位测试用例与控制节点之间的依赖关系。通过不断变异测试用例中具有依赖关系的字段,提高了web模糊测试的覆盖率以及变异效率。
1.一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,包括以下步骤:
2.根据权利要求1所述的一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,步骤s2中,对所有的基本块进行插桩:
3.根据权利要求1所述的一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,步骤s3中,
4.根据权利要求1所述的一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,步骤s3中,控制映射关系是通过翻转每位输入字段并在每个输入字段上放置标签的方式来识别输入字段和控制指令之间的映射关系,并定位到原程序中未被测试的控制指令;通过控制映射关系来分配标记,收集控制指令信息。
5. 根据权利要求1所述的一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,步骤s4中,输入字段进行突变操作,将执行突变操作后生产的测试用例输入给程序进行测试,若测试到新的控制节点,则将该测试用例放到种子池中进行下一轮变异;否则,将视为本次变异无效,抛弃该此时用例。
6.根据权利要求1所述的一种基于程序状态反馈和控制流图的web模糊测试方法,其特征在于,步骤s4中,变异形式包括字节翻转、字节替换、随机数插入和字典变异;其中