ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java代码学习(九) ——RMI

2022-01-17 19:34:00  阅读:288  来源: 互联网

标签:RMI java 代码 hello Registry rmi public


RMI简介

Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。

 

 

 

Rmi的调用

服务端

import java.rmi.Naming;

import java.rmi.Remote;

import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;

import java.rmi.server.UnicastRemoteObject;

 

public class RmiRegistry {

    public interface IRemoteHello extends Remote{

        public String hello() throws RemoteException;

    }

    public class RemoteHelloWorld extends UnicastRemoteObject implements

            IRemoteHello {

        protected RemoteHelloWorld() throws RemoteException {

            super();

        }

        public String hello() throws RemoteException {

            System.out.println("call from");

            return "Hello world";

        }

    }

    private void start() throws Exception {

        RemoteHelloWorld h = new RemoteHelloWorld();

        LocateRegistry.createRegistry(1099);

        Naming.rebind("rmi://127.0.0.1:1099/Hello", h);

    }

 

    public static void main(String[] args) throws Exception{

        new RmiRegistry().start();

    }

}

客户端

import java.rmi.Naming;

 

public class TrainMain {

    public static void main(String[] args) throws Exception {

        RmiRegistry.IRemoteHello hello = (RmiRegistry.IRemoteHello)

                Naming.lookup("rmi://127.0.0.1:1099/Hello");

        String ret = hello.hello();

        System.out.println( ret);

    }

}

  

成功从服务端取回hello world。

整个实现流程如下,客户端连接Registry,并在其中寻找Name是Hello的对象,这个对应数据 流中的Call消息;然后Registry返回⼀个序列化的数据,这个就是找到的Name=Hello的对象,这个对应 数据流中的ReturnData消息;客户端反序列化该对象,发现该对象是⼀个远程对象,地址在10.91.214.135:7532 ,于是再与这个地址建⽴TCP连接;在这个新的连接中,才执⾏真正远程⽅法调⽤,也就是 hello() 。

 

RMI的参与者

RMI Registry

RMI Server

RMI Client

攻击RMI Registry

RMI Registry是一个远程对象管理的地方,可以理解为一个远程对象的“后台”。我们可以尝试直

接访问“后台”功能。

注:远程访问RMI Registry时,只能通过list和lookup方法访问。rebind、bind、unbind方法只有来源地址是localhost时才能调用

只要目标服务器上存在一些危险方法,我们通过RMI就可以对其进行调用。

RMI动态类加载

当本地CLASSPATH中无法找到相应的类时,会在指定的codebase里加载class。codebase可以在系统属性java.rmi.server.codebase设置其URL。如果codebase的URL可控,那么我们就可以载入任意的class或jar文件。

RMI利用codebase执行任意代码

需要满足条件:

1.安装并配置了SecurityManager

2.Java版本低于7u21、6u45,或者设置了 java.rmi.server.useCodebaseOnly=false

注:在 java.rmi.server.useCodebaseOnly 配置为 true 的情况下,Java虚拟机将只信任预先配置好的

codebase ,不再支持从RMI请求中获取。

 




链接:https://www.jianshu.com/p/de85fad05dcb

https://www.anquanke.com/post/id/199481

 

标签:RMI,java,代码,hello,Registry,rmi,public
来源: https://www.cnblogs.com/coldd/p/15814953.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有