java 中rmi 服务的搭建与测试,java rmi 其实是加载远程的序列化后的java对象到本地 进行执行,所以注意rmi的远程代码执行漏洞。

本文主要是介绍java 中rmi 服务的搭建与测试,java rmi 其实是加载远程的序列化后的java对象到本地 进行执行,所以注意rmi的远程代码执行漏洞。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经测试,在客户端调用服务端的方法时,也会会打印HelloServiceImpl中的 System.out.println的内容,所以可以证明会加载远程的HelloServiceImpl类在本地执行!!!

rmi 客户端与服务端之间 传输的是序列化后的类示例对象,然后在客户端在反序列化生成对象,并初始化调用构造方法。

ldap 协议也会造成本地执行远程class文件的问题,不通与rmi,ldap 会加载远程class类文件到本进行实例化构造方法!!!

ldap 是一个协议,与java无关,rmi是java定的一个协议。

代码:

package test.anquan.rmi.api;
/*** 服务接口类* @author **/
public interface HelloService {public String sayHello(String message) ;
}
package test.anquan.rmi.server.impl;import java.io.Serializable;
import java.rmi.Remote;import test.anquan.rmi.api.HelloService;public class HelloServiceImpl implements Remote ,HelloService,Serializable{/*** */private static final long serialVersionUID = 1L;public HelloServiceImpl() {super();}/* 实现本地接口中声明的'sayHello()'方法 */public String sayHello(String message) {System.out.println("我是服务端:收到客户端的请求参数" + message);return message;}
}
package test.anquan.rmi.server;
import java.rmi.*;
import java.rmi.registry.LocateRegistry;import test.anquan.rmi.server.impl.HelloServiceImpl;
/*** 参考:* https://www.cnblogs.com/handsomeye/p/6514026.html* https://www.cnblogs.com/beantestng/p/3767894.html* @author**/
public class RmiServer {public static void main(String[] args) {// 在服务器端设置安全机制         /*           if (System.getSecurityManager() == null) {               System.setSecurityManager(new RMISecurityManager());            }        */         try {System.out.println("开始 RMI Server ...");LocateRegistry.createRegistry(8888);/* 创建远程对象的实现实例 */HelloServiceImpl hImpl = new HelloServiceImpl();System.out.println("将实例注册到专有的URL ");Naming.rebind("rmi://localhost:8888/helloService",  hImpl);// 把远程对象注册到RMI注册服务器上,并命名为RHello// 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
//            Naming.bind("rmi://localhost:8888/RHello", rhello);// Naming.bind("//localhost:8888/RHello",rhello);System.out.println("等待RMI客户端调用...");Thread.sleep(10000000);System.out.println("结束");} catch (Exception e) {System.out.println("错误: " + e);}}
}
package test.anquan.rmi.client;
import java.rmi.*;
import java.util.Arrays;import test.anquan.rmi.api.HelloService;
public class RmiClient {public static void main(String[] args) {String host = "localhost:8888";if (args.length > 0)host = args[0];try {String names[]=Naming.list("rmi://" + host + "/helloService");System.out.println("我是客户端-》远程服务列表:"+Arrays.asList(names));//经测试,这里也会打印HelloServiceImpl中的 System.out.println的内容,所以可以证明会加载远程的HelloServiceImpl类在本地执行//那这样就会出现远程命令执行漏洞HelloService h = (HelloService) Naming.lookup("rmi://" + host + "/helloService");
//            System.out.println("实现“Hello”接口的远程对象: " + h);
//            System.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法");
//            System.out.println("欢迎,  " + h.sayHello("liuhuiyao"));System.out.println("我是客户端-》这是我调用远程服务的返回"+h.sayHello("张三"));} catch (Exception ex) {System.out.println("错误 " + ex);}}
}

运行RmiClient输出

运行RmiServer输出

经测试,在客户端调用服务端的方法时,也会会打印HelloServiceImpl中的 System.out.println的内容,所以可以证明会加载远程的HelloServiceImpl类在本地执行

总结:

java rmi 其实是加载远程的序列化后的java对象到本地 进行执行,所以注意rmi的远程代码执行漏洞。

参考: 

Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)

https://www.cnblogs.com/handsomeye/p/6514026.html 

https://www.cnblogs.com/beantestng/p/3767894.html

这篇关于java 中rmi 服务的搭建与测试,java rmi 其实是加载远程的序列化后的java对象到本地 进行执行,所以注意rmi的远程代码执行漏洞。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1140248

相关文章

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与