利用抽象语法树挖掘Fastjson可用的Gadget
字数 1498 2025-08-29 08:31:47

Fastjson Gadget自动挖掘工具使用指南

工具概述

这是一个用于自动挖掘Fastjson可利用Gadget的工具,特别关注JNDI注入相关的利用链。该工具通过分析jar包的抽象语法树(AST)来识别潜在的Gadget类。

工具原理

核心思路

  1. 预处理jar包并反编译
  2. 通过AST分析筛选符合Fastjson反序列化条件的类
  3. 检测包含JNDI注入关键方法(InitialContext.lookup())的类

Fastjson反序列化限制条件

  • 不能继承Classloader
  • 不能实现DataSourceRowSet接口
  • 必须有一个无参构造函数

工具模块详解

1. 预处理模块

command && jar_process函数

  • 功能:创建项目文件夹并预处理jar包
  • 参数:
    • operating_system:考虑不同操作系统文件路径处理差异
  • 操作:
    • 为待检测jar包创建项目文件夹

jar_decompile函数

  • 功能:反编译jar包生成Java源码
  • 实现:
    • 使用IntelliJ IDEA的java-decompiler.jar进行反编译
    • 使用unzip命令解压反编译结果到项目文件夹

2. 源码扫描模块

scanner_dir && javafile_generate函数

  • 功能:遍历项目目录获取Java源码文件路径

scanner_file函数

  • 功能:初步筛选包含JNDI注入关键字的文件
  • 筛选条件:
    • 文件必须包含InitialContext()相关内容
  • 处理流程:
    1. 使用javalang库解析源代码生成AST
    2. 遍历类声明和方法声明
    3. 进行类层面的条件判断
    4. 可选黑名单检测(默认包含已知黑名单类)
    5. 输出并保存符合条件的扫描结果

3. 类声明分析模块

class_declaration_generate函数

  • 功能:根据Fastjson限制条件筛选类声明
  • 筛选步骤:
    1. 排除非类声明
    2. 排除继承自Classloader的类
    3. 排除实现DataSourceRowSet接口的类
    4. 检查是否存在无参构造函数
  • 输出:符合条件的类声明列表

4. 方法调用检测模块

lookup_detect函数

  • 功能:检测类方法中是否包含可利用的lookup调用
  • 检测条件:
    1. 方法中调用了lookup方法
    2. 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类。

局限性

  1. 对其他jar包的挖掘效果有待验证
  2. 变量可控性判断采用简化方法,可能存在误报
  3. 仅针对JNDI注入类Gadget,不覆盖所有Fastjson利用链

改进方向

  1. 增加更精确的数据流分析
  2. 扩展支持其他类型的Gadget检测
  3. 优化AST遍历效率
  4. 增加更灵活的黑名单/白名单机制

总结

该工具通过AST分析实现了Fastjson Gadget的半自动化挖掘,特别针对JNDI注入场景。虽然存在一定局限性,但能有效缩小人工分析范围,提高漏洞挖掘效率。

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 命令解压反编译结果到项目文件夹 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 变量可控性简化判断: 类的属性和方法入参视为可控变量(避免复杂的数据流分析) 工具使用 安装依赖 使用方式 参数说明 位置参数: jar :要扫描的jar文件路径 operating_system :操作系统类型(Windows/Linux/MacOS) 可选参数: -h/--help :显示帮助信息 示例 验证效果 在SUSCTF 2022赛题环境中测试,工具成功识别出了比赛中使用的Gadget类。 局限性 对其他jar包的挖掘效果有待验证 变量可控性判断采用简化方法,可能存在误报 仅针对JNDI注入类Gadget,不覆盖所有Fastjson利用链 改进方向 增加更精确的数据流分析 扩展支持其他类型的Gadget检测 优化AST遍历效率 增加更灵活的黑名单/白名单机制 总结 该工具通过AST分析实现了Fastjson Gadget的半自动化挖掘,特别针对JNDI注入场景。虽然存在一定局限性,但能有效缩小人工分析范围,提高漏洞挖掘效率。