利用抽象语法树挖掘Fastjson可用的Gadget
字数 1498 2025-08-29 08:31:47
Fastjson Gadget自动挖掘工具使用指南
工具概述
这是一个用于自动挖掘Fastjson可利用Gadget的工具,特别关注JNDI注入相关的利用链。该工具通过分析jar包的抽象语法树(AST)来识别潜在的Gadget类。
工具原理
核心思路
- 预处理jar包并反编译
- 通过AST分析筛选符合Fastjson反序列化条件的类
- 检测包含JNDI注入关键方法(
InitialContext.lookup())的类
Fastjson反序列化限制条件
- 不能继承
Classloader - 不能实现
DataSource和RowSet接口 - 必须有一个无参构造函数
工具模块详解
1. 预处理模块
command && jar_process函数
- 功能:创建项目文件夹并预处理jar包
- 参数:
operating_system:考虑不同操作系统文件路径处理差异
- 操作:
- 为待检测jar包创建项目文件夹
jar_decompile函数
- 功能:反编译jar包生成Java源码
- 实现:
- 使用IntelliJ IDEA的
java-decompiler.jar进行反编译 - 使用
unzip命令解压反编译结果到项目文件夹
- 使用IntelliJ IDEA的
2. 源码扫描模块
scanner_dir && javafile_generate函数
- 功能:遍历项目目录获取Java源码文件路径
scanner_file函数
- 功能:初步筛选包含JNDI注入关键字的文件
- 筛选条件:
- 文件必须包含
InitialContext()相关内容
- 文件必须包含
- 处理流程:
- 使用
javalang库解析源代码生成AST - 遍历类声明和方法声明
- 进行类层面的条件判断
- 可选黑名单检测(默认包含已知黑名单类)
- 输出并保存符合条件的扫描结果
- 使用
3. 类声明分析模块
class_declaration_generate函数
- 功能:根据Fastjson限制条件筛选类声明
- 筛选步骤:
- 排除非类声明
- 排除继承自
Classloader的类 - 排除实现
DataSource和RowSet接口的类 - 检查是否存在无参构造函数
- 输出:符合条件的类声明列表
4. 方法调用检测模块
lookup_detect函数
- 功能:检测类方法中是否包含可利用的
lookup调用 - 检测条件:
- 方法中调用了
lookup方法 lookup方法的参数是变量
- 方法中调用了
- 实现方式:
- 深度优先遍历
MethodDeclaration的子节点 - 检查节点类型是否为
MethodInvocation - 检查被调用方法名是否为
lookup
- 深度优先遍历
- 变量可控性简化判断:
- 类的属性和方法入参视为可控变量(避免复杂的数据流分析)
工具使用
安装依赖
pip install javalang
使用方式
python main.py [ -h ] jar operating_system
参数说明
- 位置参数:
jar:要扫描的jar文件路径operating_system:操作系统类型(Windows/Linux/MacOS)
- 可选参数:
-h/--help:显示帮助信息
示例
python main.py target.jar Linux
验证效果
在SUSCTF 2022赛题环境中测试,工具成功识别出了比赛中使用的Gadget类。
局限性
- 对其他jar包的挖掘效果有待验证
- 变量可控性判断采用简化方法,可能存在误报
- 仅针对JNDI注入类Gadget,不覆盖所有Fastjson利用链
改进方向
- 增加更精确的数据流分析
- 扩展支持其他类型的Gadget检测
- 优化AST遍历效率
- 增加更灵活的黑名单/白名单机制
总结
该工具通过AST分析实现了Fastjson Gadget的半自动化挖掘,特别针对JNDI注入场景。虽然存在一定局限性,但能有效缩小人工分析范围,提高漏洞挖掘效率。