首先要了解 协议 。
协议被用在计算机内部、外部通信的各个方面。协议形成了数据传输和处理的基础结构。要进行模糊测试,首先要了解被测应用所使用的协议,从协议出发,找出最有可能引发异常的部分。
协议中的字段
设计协议时要考虑如何将协议中的数据划分为不同的字段。数据发送方和接收方都需要知道如何解释协议中的数据。协议的主要作用是,定义协议中各个部分数据如何被解释。
有三种设计协议的典型方法,定长字段、变长字段、分隔字段。
分隔字段:简单文本协议,以回车作为分隔符。客户端或服务端在接受简单文本协议数据包时,如果遇到一个回车,就意味着他知道上一个命令的结束。CSV文件,逗号分隔,XML使用多个字符进行对字段的分隔。
定长字段:将每个字段的长度设置为一个固定值。网络协议(eg,Ethernet、IP、TCP、UDP)在协议头中使用定长字段,其原因是、协议头需要高度结构化的数据。
在数据并非完全结构化的情况下、适合使用变长字段。eg、媒体文件、图形文件、视频文件
简单文本协议(Plain Text Protocols)
指协议中使用的用于通信的数据值都在可打印的范围内。通常效率较低。
二进制协议 有点不太理解,再多看看
文件格式 描述文件的数据结构,可以是开放的,也可以是专有的。
常用协议元素
1.名字-值对
通过对名字-值对中的“值”进行模糊测试发现潜在的安全漏洞。
2.块识别符
用来标识二进制数据块的数据类型,块标识符后通常跟边长或者定长的数据。
3.块大小
块通常由诸如名字-值对这样的数据、以及紧挨着数据的一个或多个字节组成。紧挨着数据前方的这些字节用于说明块中的数据类型、块的大小。。
缓冲区溢出和缓冲区下溢可以通过 修改数据包中表示块大小的值,使其比实际数据块的数据大小稍小或稍大一点,然后观察结果输出。(替换块中数据进行模糊测试时,一定要根据实际数据大小来调整块大小的值)
4.校验和
如果文件中包含校验和,对于读取此文件的应用进行模糊测试会受到影响,应用程序会在发现校验和不正确之后放弃对文件的处理。应该把校验和考虑在内,模糊测试器可以自行计算校验和并将其写入文件。
有效模糊测试的需求
1.可重现性与文档
应该能够重现单个测试或一组测试的测试结果。用文档对测试结果进行记录。
2.可重用性
3.过程状态和过程深度
过程状态:目标进程在任意地给定时刻所处的具体状态。
过程深度:当前状态相对于初始状态的距离。
eg,SSH服务器客户端处于初始状态,服务器端就处于认证状态,一旦服务器成功的认证,那么服务器就处于已认证状态
4.跟踪、代码覆盖和度量
代码覆盖指的是模糊测试器能够让被测应用达到和执行的过程状态的数量。
5.错误检测
产生和传输可能引发的异常数据是一部分,另一部分是精准的识别出一个已经出现的错误(目前的情况再看看论文)
之前的解决方案是在两次请求之间加入 ping (是某种类型的事务,被测应用应该接受在该事务并做出一个正确响应)或存活检查来检查被测应用是否仍正常工作。
6.资源约束