本发明涉及计算机网络,特别是一种fastjson反序列化漏洞调用链挖掘方法及系统。
背景技术:
1、fastjson是一款由阿里巴巴开发的高性能的java json解析库,可用于将java对象转换为其json表示形式,被企业广泛地应用在java开发中。但是fastjson也存在着一些安全风险,其中最常见的是反序列化漏洞。fastjson反序列化漏洞是指攻击者通过构造恶意的json数据,在fastjson解析时,触发了反序列化漏洞,从而导致攻击者可以执行任意的命令或代码。
2、目前,已经有一些针对fastjson反序列漏洞的挖掘工具。这些工具通常会根据fastjson的语法规则和解析过程,构造不同的数据输入,并观察程序行为,从而判断程序是否存在漏洞;有的甚至直接根据fastjson的版本来判断是否存在漏洞。
3、但是,现有的挖掘方法还存在一些缺陷。首先,由于fastjson的语法和解析方式非常复杂,因此需要构造各种不同的数据输入,才能够全面地检查程序的安全性,需要大量的计算资源和时间,而且也不一定能够覆盖所有可能的漏洞。其次,由于fastjson的版本更新比较快,攻击者的攻击方式也在不断地变化。因此,现有的自动化挖掘方法很难及时跟进漏洞的变化,从而难以保障系统的安全性。
4、即,现有技术存在挖掘效率与准确性较低的问题。
技术实现思路
1、本发明的主要目的在于提供了一种fastjson反序列化漏洞调用链挖掘方法、装置、设备及存储介质,旨在解决现有的fastjson反序列化漏洞调用链挖掘方法挖掘效率与准确性较低的技术问题。
2、为实现上述目的,本发明提供了一种fastjson反序列化漏洞调用链挖掘方法,其包括以下步骤:s1、配置项目代码仓库的webhook,当项目代码仓库发生更新时,自动将更新的项目信息推送至指定的webhook url,项目信息至少包括项目代码的url地址;s2、当接收到更新的项目信息后识别项目代码的url地址,通过项目代码仓库的接口或者克隆的方式将项目的java源代码进行存储;s3、将java源代码解析为抽象语法树,再将抽象语法树转换为python字典树;s4、遍历python字典树,检测java源代码中是否引用或使用fastjson库,并且存在fastjson漏洞版本,若是,则执行步骤s5;
3、s5、遍历python字典树,检测json字符串是否存在解析漏洞,若是,则执行步骤s6;s6、遍历java源代码,检测是否存在将json字符串反序列化成对象并对该对象进行操作的情况,并验证是否存在注入漏洞,若是,则执行步骤s7;s7、判断是否存在fastjson反序列化漏洞,若是,则遍历调用函数查找调用链,并输出存在fastjson反序列化漏洞的调用链结果。
4、可选的,步骤s1中项目的详细信息还包括项目的id和项目的名称。
5、可选的,步骤s3中将java源代码解析为抽象语法树,具体包括以下步骤:对java源代码进行语法分析,将java源代码分解成一系列的令牌;再次进行语法分析,将一系列的令牌组合成一个抽象语法树。
6、可选的,步骤s3中将抽象语法树转换为python字典树,具体包括以下步骤:获取抽象语法树的ast节点并作为参数,判断ast节点的类型;若ast节点为一个javalang.ast.node类型的对象,则创建一个空字典,并遍历该ast节点的所有属性,将属性名作为该字典的键,将属性值通过递归调用后的返回值作为字典的值,最终返回该字典;若ast节点为一个列表类型的对象,则创建一个空列表,并遍历该列表中的每个元素,将每个元素通过递归调用后的返回值添加至该列表中,最终返回该列表;若ast节点为其他类型,则直接返回该节点。
7、可选的,步骤s4具体包括以下步骤:s40、遍历python字典树中的所有import语句,查找是否有以“com.alibaba.fastjson”开头的import语句,若是,则将其标记为true;s41、遍历python字典树中的所有类和方法,查找是否有使用fastjson库的代码,具体为遍历每个方法的语句列表,查找是否有任何语句中包含“com.alibaba.fastjson”字符串,若是,则将其标记为true;s42、对“com.alibaba.fastjson”引入的版本进行判断,若版本小于1.2.80,则将其标记为true,判断结果为java源代码中引用或使用fastjson库,并且存在fastjson漏洞版本,并执行步骤s5。
8、可选的,步骤s5具体包括以下步骤:s50、遍历python字典树,并检测是否有一条语句包含字符串“json.parse”,若是,则从中提取出json字符串;s51、检测json字符串是否存在解析漏洞,具体为检测json字符串是否以双引号开头或结尾,若是,则json字符串不存在解析漏洞,若否,则json字符串存在解析漏洞,执行步骤s6。
9、可选的,步骤s6具体包括以下步骤:s60、遍历java源代码中的所有类型声明,并检测它们的字段中是否存在以“private”关键字开头的字段;若是,则将该字段的名称添加至列表中;s61、遍历所有的json字符串,检测其中是否包含在列表中的任何一个类名中;若是,则说明该json字符串可能存在反序列化注入漏洞,则执行步骤s7。
10、可选的,步骤s7具体包括以下步骤:s70、将python字典树作为参数,遍历java源代码中的所有调用函数,判断是否为fastjson的json解析调用;若是,则递归遍历该解析调用内部的代码,并执行步骤s71;s71、检测是否还存在fastjson的json解析调用,若是,则返回步骤s70,直至检测到一个不存在fastjson远程代码执行漏洞的函数或位置后,输出存在fastjson反序列化漏洞的调用链结果;输出存在fastjson反序列化漏洞的调用链结果具体为:将存在fastjson反序列化漏洞的调用链结果、项目代码的url地址保存至数据库中,再通过python flask接口开发框架从数据库获取项目的地址和存在fastjson反序列化漏洞的调用链进行返回。
11、可选的,调用链路通过一个调用链路列表来维护,递归遍历时,将调用链路列表传递给下一个层级,直到遍历结束;每次遍历结束时,显示调用链路列表。
12、与所述fastjson反序列化漏洞调用链挖掘方法相对应的,本发明提供一种fastjson反序列化漏洞调用链挖掘系统,其包括:项目代码拉取模块,用于配置代码仓库的webhook,当项目代码仓库发生更新时,自动将更新的项目信息推送至指定的webhook url,项目信息至少包括项目代码的url地址;以及用于当接收到更新的项目信息后识别项目代码的url地址,通过项目代码仓库的接口或者克隆的方式将项目的java源代码进行存储;项目代码解析模块,用于将java源代码解析为抽象语法树,再将抽象语法树转换为python字典树;fastjson反序列化漏洞调用链遍历模块,用于遍历python字典树,检测java源代码中是否引用或使用fastjson库,并且存在fastjson漏洞版本;遍历python字典树,检测json字符串是否存在解析漏洞;遍历java源代码,检测java源代码中是否存在将json字符串反序列化成对象并对该对象进行操作的情况,并验证是否存在注入漏洞;以及判断是否存在fastjson反序列化漏洞,若是,则遍历调用函数查找调用链;结果输出模块,用于输出存在fastjson反序列化漏洞的调用链结果。
13、本发明的有益效果是:
14、(1)与现有技术相比,本发明实现了fastjson反序列化漏洞调用链自动化挖掘,大大减轻人工挖掘的负担,提高了挖掘效率和准确性;通过检测是否存在fastjson漏洞版本、检测json字符串是否存在解析漏洞、检测是否存在将json字符串反序列化成对象并对该对象进行操作的情况,并验证是否存在注入漏洞相结合,再判断是否存在fastjson反序列化漏洞,能够全面识别到所有的调用链和攻击路径,避免由于存在多个调用链导致的攻击事件;通过综合三个检测结果,判断是否存在fastjson反序列化漏洞,能够准确地挖掘存在fastjson远程代码执行漏洞的链路和入口,能够帮助企业全面修复漏洞;
15、(2)与现有技术相比,本发明通过将java源代码解析成抽象语法树(ast),便于对代码进行分析和处理,有利于提高自动化挖掘效率;
16、(3)与现有技术相比,本发明通过将抽象语法树转化为python字典树,便于处理和展示ast中的节点信息;使用python字典树,可以通过键值对的方式快速查找ast中的某个节点信息,并且支持遍历、查找、修改等操作,方便进行二次开发和扩展;此外,python字典树还支持一些序列化、文件读写、网络传输等功能,方便将ast转化为json、xml等其他数据格式;
17、(4)与现有技术相比,本发明递归遍历时,每次遍历结束时显示调用链路列表,以便于继续遍历其它函数调用,提高挖掘效率。