前言
在SUSCTF 2022
比赛后的WP
中, 看到有师傅是直接利用题目后台提供的lib
包中的jar
文件对Fastjson
的Gadget
进行自动挖掘, 于是自己想尝试一下能不能实现一下挖掘JNDI
注入的Fastjson-Gadget
, 故有了这个简易的小工具, 相比于其他师傅写的可能做不到那么精确, 但基本能确定到一个较小的范围来进行人工检测.
项目地址
Fastjson-Gadgets-Automatic-Scanner
项目模块
项目定义的函数结构如下:
同时, 这里简单对项目中的主要函数谈谈实现的思路, 对于Fastjson
的反序列化漏洞分析可以看我之前写的Java安全学习—fastjson反序列化漏洞.
command && jar_process
这两个函数主要是利用需要检测的jar
包进行一个预处理的操作, 例如: 创建该jar
包的项目文件夹. 这里需要输入的参数operating_system
主要是考虑到在不同的操作系统上对输入文件路径的处理问题.
jar_decompile
该函数主要是对需要检测的jar
包进行一个反编译操作, 并生成相应的java
源码文件. 这里利用的是IntelliJ IDEA
插件中的java-decompiler.jar
对jar
包进行反编译操作, 接着利用unzip
命令解压反编译后的jar
包到之前创建好的项目文件夹内, 得到java
源码文件.
scanner_dir && javafile_generate
这两个函数主要是对前面解压缩的项目目录进行遍历来获取java
源码文件, 并返回java
源码文件路径.
scanner_file
该函数主要是对java
源码文件进行一个初步检测, 当文件中不存在InitialContext()
相关内容时直接pass
(目的是对JNDI
注入相关利用进行挖掘, 因此当文件中并不存在JNDI
注入中关键类InitialContext
便不进行语法树判断). 使用javalang
库解析源代码, 得到抽象语法树. 接着对类声明和方法声明进行遍历并在语法树上类层面的判断, 对于扫描出来的可能Gadget
结果可以进行黑名单检测(实际使用时可以去掉黑名单检测这一操作, 项目中是对目前已知的黑名单类进行检测), 最后对符合条件的扫描结果进行打印并保存.
class_declaration_generate
由于Fastjson
的checkAutoType
方法在源码中对反序列化的类存在限制, 例如: 不能继承Classloader
、不能实现 DataSource
和RowSet
接口以及必须有一个无参的构造函数等.
函数class_declaration_generate
针对checkAutoType
限制特性, 通过判断ClassDeclaration
对象相应的属性是否满足条件来进行筛选. 首先对非类声明都不进行分析, 并判断是否继承自Classloader
; 接着判断其是否是被禁用的DataSource
和RowSet
等接口; 最后判断是否存在无参的构造函数. 通过上述处理得到一个大致的类声明列表, 返回给scanner_file
进行进一步处理.
lookup_detect
函数class_declaration_generate
将得到的类声明列表返回给函数scanner_file
, 函数scanner_file
拿到类声明列表之后会遍历得到类声明, 然后再对这个类声明遍历方法声明, 对于每个方法声明, 再使用函数lookup_detect
进行最后确认. 这是因为得到类声明后, 还需要判断类方法中是否调用了lookup
方法, 并且需要lookup
方法的参数是变量.
对于是否调用lookup
方法的判断, 只需要深度优先遍历整个MethodDeclaration
对象的各个子节点, 判断节点的类型是不是MethodInvaction
以及被调用的函数名是不是lookup
即可. 而对于lookup
的变量是否可控可以简化为, 认为类的属性和方法的入参都是可控变量, 从而来避免对数据流进行分析.
项目使用
usage: python main.py [-h] jar operating_system
positional arguments:
jar Enter the jar to be scanned
operating_system Enter the operating system Windows or Linux or MacOS
optional arguments:
-h, --help show this help message and exit
可以看到SUSCTF
赛题利用的Gadget
在扫描的结果中, 初步成效达成.
总结
本项目还有很多不足的地方, 例如对于其它的jar
包的挖掘是否完全奏效等, 待进一步学习后希望能够对该项目有一个更好的改进. 也希望师傅们不吝赐教, 能够提供更好的思路和想法, 期待师傅们点一点Star
.