fastjson 1.22-1.24 漏洞复现与分析

本文详细分析了Fastjson 1.22-1.24版本的漏洞,包括RMI、JRMP、JNDI的概念和相关示例代码,重点探讨了反序列化过程中的风险点,如Json.parse系列函数的行为,以及JdbcRowsetlmpl和Templateslmpl漏洞的触发条件和复现步骤。通过对漏洞的深入分析,揭示了利用链的工作原理,强调了解决这些问题的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fastjson 1.22-1.24 漏洞复现与分析

前言

QAQ,感觉自己啥也不会,要好好努力学习了。但是由于本人遗忘度很大,因此要记下来学习QAQ。

概念

RMI(Remote Method Invocation)

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

乱七八糟的一大串,简单来说,RMI就是一个只java远程调用方法的行为。

JRMP(Java Remote Method Protocol)

Java远程方法协议(英语:Java Remote Method Protocol,JRMP)是特定于Java技术的、用于查找和引用远程对象的协议。这是运行在Java远程方法调用(RMI)之下、TCP/IP之上的线路层协议(英语:Wire protocol)。

JNDI(Java Naming and Directory Interface)

Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI),是Java的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

就是一个接口,可以通过lookup方法访问其所绑定的对象。

示例代码
程序A

继承Remote的HelloService接口:

public interface HelloService extends Remote {
	String sayHello() throws RemoteException;
}

HelloService的实现

public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
	public HelloServiceImpl() throws RemoteException {
	}

	@Override
	public String sayHello() throws RemoteException {
    	System.out.println("hello!");
    	return "hello!";
	}
}

RMI服务端

public class RMIServer {
	public static void main(String[] args) {
    	try {
        	Registry registry = LocateRegistry.createRegistry(1099);
        	registry.bind("hello", new HelloServiceImpl());
    	} catch (RemoteException e) {
        	e.printStackTrace();
    	} catch (AlreadyBoundException e) {
        	e.printStackTrace();
    	}
	}
}
程序B
public class RMIClient {
	public static void main(String[] args) {
    	try {
        	HelloService helloService = (HelloService)LocateRegistry.getRegistry("127.0.0.1", 1099).lookup("hello");
        System.out.println(helloService.sayHello());
    	} catch (RemoteException e) {
        	e.printStackTrace();
    	} catch (NotBoundException e) {
     	   e.printStackTrace();
    	}
  }
}

先执行程序A再执行程序B就会打印hello。


程序A启动了一个RMI的注册中心,并把HelloServiceImpl暴露在注册中心中。程序B启动之后通过命名寻找方法,最后通过JRMP协议发起RMI请求,程序A输出hello后将信息序列化发送给程序B,最后程序B反序列化输出。

反序列化

反序列化有三个函数:

parse (String text) 
parseObject(String text)
parseObject(String text, Class clazz)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.util.Properties;

public class fastjsonTest {
   
   
    public String t1;
    private int t2;
    private Boolean t3;
    private Properties t4;
    private Properties t5;

    public String getT1() {
   
   
        System.out.println("getT1()");
        return t1;
    }

    public void setT1(String t1) {
   
   
        this.t1 = t1;
        System.out.println("setT1()");
    }

    public int getT2() {
   
   
        System.out.println("getT2");
        return t2;
    }

    public void setT2(int t2) {
   
   
        System.out.println("setT2");
        this.t2 = t2;
    }

    public Boolean getT3() {
   
   
        System.out.println("getT3");
        return t3;
    }


    public Properties getT4() {
   
   
        System.out.println("getT4");
        return t4;
    }



    public Properties getT5() {
   
   
        System.out.println("getT5");
        return t5;
    }

    public void setT5(Properties t5) {
   
   
        System.out.println("setT5");
        this.t5 = t5;
    
根据提供的引用内容,fastjson反序列化漏洞是一种安全漏洞,攻击者可以利用该漏洞在目标系统上执行恶意代码。下面是fastjson反序列化漏洞复现过程[^1][^2]: 1. 判断是否使用Fastjson以及Fastjson版本:首先需要确定目标系统是否使用了Fastjson,并且确定Fastjson的版本号。可以通过查看项目的依赖文件或者代码中的导入语句来确定。 2. 漏洞复现:根据Fastjson的版本号选择相应的漏洞复现方法。 - Fastjson<1.2.24远程代码执行(CNVD-2017-02833):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中插入恶意的Java代码,并通过反序列化操作执行该代码。 - Fastjson<=1.2.47远程代码执行漏洞(CNVD-2019-22238):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中使用特殊的反射调用方式来执行恶意代码。 3. 防范措施:为了防止fastjson反序列化漏洞的利用,可以采取以下措施: - 及时升级Fastjson版本:Fastjson团队会及时修复漏洞并发布新版本,及时升级到最新版本可以避免被已知漏洞攻击。 - 输入验证和过滤:在接收用户输入并进行反序列化操作之前,对输入进行严格的验证和过滤,确保输入的数据符合预期的格式和内容。 - 使用安全的JSON库:考虑使用其他安全性更高的JSON库,如Jackson或Gson,来替代Fastjson
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值