RMIserver端和Registry端源码分析

本文深入探讨Java RMI(Remote Method Invocation),解析Server端UnicastRemoteObject和Registry端createRegistry的源码,揭示RMI反序列化攻击的原理。通过源码分析,展示了RMI在创建远程对象、动态代理及Registry管理等方面的关键步骤。同时,文章提到了非Object参数的RMI攻击策略,以及学习网络安全的全面路径和资源。
摘要由CSDN通过智能技术生成

想学JDNI,那想必一定躲不过RMI。

RMI简述

RMI可以远程调用JVM对象并获取结果。所以需要一个server和一个client进行通信。

Server端会创建一个远程对象用于client端远程访问。

下面改造一张来自W3Cschool的图:

1670590949_639331e5071ab35b5dc6d.png!small?1670590949697

只需要知道:Client端使用stub来请求远程方法,而Server端用Skeleton来接收stub,然后将返回值传输给Client。

  • RMI server的构造需要:

    1. 一个远程接口rmidemo,rmidemo需要继承java.rmi.Remote接口,其中的方法还需要有serializable接口

           public interface rmidemo extends Remote {  
      

      private static final long serialVersionUID = 6490921832856589236L;
      public String hello() throws RemoteException{}
      }

serialVersionUID是为了防止在序列化时导致版本冲突,所以序列化后UID不同会报异常

1670590960_639331f0b0788c8779041.png!small?1670590961141

2. 能被远程访问的类RmiObject(需要继承UnicastRemoteObject类),类必须实现rmidemo接口。

    public class RmiObject extends UnicastRemoteObject implements rmidemo {  
protected RmiObject() throws RemoteException {}  
public String hello() throws RemoteException{}  
}

3. 注册远程对象(RMIRegistry):



public class server {  
public static void main(String[] args) throws RemoteException {  
rmidemo hello = new RmiObjct();//创建远程对象  
Registry registry = LocateRegistry.createRegistry(1099);//创建注册表  
registry.rebind("hello",hello);//将远程对象注册到注册表里面,并且设置值为hello  
}  
}
  • RMI Client。LocateRegistry.getRegistry进行连接,用到lookup()搜索对应方法,然后调用需要的远程方法:

    public class clientdemo {  
    

    public static void main(String[] args) throws RemoteException, NotBoundException {
    Registry registry = LocateRegistry.getRegistry(“localhost”, 1099);//获取远程主机对象
    // 利用注册表的代理去查询远程注册表中名为hello的对象
    rmidemo hello = (rmidemo) registry.lookup(“hello”);
    // 调用远程方法
    System.out.println(hello.hello());
    }
    }

以上过程也可以用素十八大佬的一图概括:

1670590972_639331fca9ae900ac7ac7.png!small?1670590973376

RMI反序列化攻击

以CC1链利用AnnotationInvocationHandler进行攻击为例:

CC1的POC为:

package org.vulhub.Ser;  
import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.functors.ConstantTransformer;  
import o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值