前言

SUSCTF 2022比赛后的WP中, 看到有师傅是直接利用题目后台提供的lib包中的jar文件对FastjsonGadget进行自动挖掘, 于是自己想尝试一下能不能实现一下挖掘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.jarjar包进行反编译操作, 接着利用unzip命令解压反编译后的jar包到之前创建好的项目文件夹内, 得到java源码文件.

scanner_dir && javafile_generate

这两个函数主要是对前面解压缩的项目目录进行遍历来获取java源码文件, 并返回java源码文件路径.

scanner_file

该函数主要是对java源码文件进行一个初步检测, 当文件中不存在InitialContext()相关内容时直接pass(目的是对JNDI注入相关利用进行挖掘, 因此当文件中并不存在JNDI注入中关键类InitialContext便不进行语法树判断). 使用javalang库解析源代码, 得到抽象语法树. 接着对类声明和方法声明进行遍历并在语法树上类层面的判断, 对于扫描出来的可能Gadget结果可以进行黑名单检测(实际使用时可以去掉黑名单检测这一操作, 项目中是对目前已知的黑名单类进行检测), 最后对符合条件的扫描结果进行打印并保存.

class_declaration_generate

由于FastjsoncheckAutoType方法在源码中对反序列化的类存在限制, 例如: 不能继承Classloader、不能实现 DataSourceRowSet接口以及必须有一个无参的构造函数等.

函数class_declaration_generate针对checkAutoType限制特性, 通过判断ClassDeclaration对象相应的属性是否满足条件来进行筛选. 首先对非类声明都不进行分析, 并判断是否继承自Classloader; 接着判断其是否是被禁用的DataSourceRowSet等接口; 最后判断是否存在无参的构造函数. 通过上述处理得到一个大致的类声明列表, 返回给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.

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖