3.5. GramFuzz Fuzzing¶
该方法[1-7]的改进点主要有两个。一个在于不直接生成种子,而是从网上获取已经有的HTML文档,并对其进行分析后获得一个比较庞大的语法库,然后使用语法库获得种子。变换方法则更基于语法规则进行变化,而不是随机生成一些值。
尝试把其主要流程写成了如下的伪代码:
3.5.1. 主流程伪代码¶
webFiles = Crawler.getHTMLfromInternet()
trainSets = new TrainSets(webFiles)
initCases = new InitialCases(webFiles, Pocs)
grammarLibrary = {JsLib, HTMLLib, CSSLib} = new GrammarLibrary(trainSets)
grammarNode = new GrammarNode(grammarLibrary)
testCases = new Testcases(grammarNode, mutatePattern(initCases))
3.5.2. Extract the Grammar Node¶
currentNode = rootNode
grammarNodeDB = []
def searchLeafNode(n):
tmp = new Node()
tmp.code = n.code
tmp.type = n.type
grammarNodeDB.push(tmp)
def searchChildNode(n):
searchLeafNode(n)
tmp = n.nextLeafNode()
while tmp is not None:
searchLeafNode(tmp)
tmp = n.nextLeafNode()
def main(rootNode):
searchChildNode(rootNode)
该文章的主要优点在于测试者不需要对DOM树,CSS,或者Js语法有了解,只要使用代码库就可以了。另外,从真实HTML文件中的代码会对接口有更高的覆盖率,而且生成测试样例使用了语法树的方法,给测试例子触发漏洞以更多的可能性。