java安全初探-rmi篇

deadf1sh-cat      2022-05-08     773

关键词:

Java RMI初识

Java RMI 定义

Java RMI(Java Remote Method Invocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 Java RMI 使用 JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现,使得客户端运行的程序可以调用远程服务器上的对象。是实现RPC的一种方式。

JRMP:Java Remote Message Protocol ,Java 远程消息交换协议。这是运行在Java RMI之下、TCP/IP之上的线路层协议。

注:Java RMI默认使用JRMP协议,而Weblogic RMI使用的是T3协议,此处应进行区分

RMI的交互

此处引用文章JAVA RMI 原理和使用浅析的一张图演示RMI的交互过程

技术图片

对于RMI流程的解释,网上有很多不错的回答,此处不过多阐述。通俗来讲,便是RMI Registry作为client和server的中间人,假设服务端是商品仓库,客户端是购买者,则RMI Registry就是中介,只负责告诉客户可以售卖的商品相关信息。仓库在中介处登记可售商品,客户从中介处查看可购买的商品。客户从中介处获得商品的相关信息,然后交给跑腿(存根stub)去跟仓库人员(骨架skeleton)取货,双方商品信息确认一致,进行交易,客户获得商品。(可能比喻有点不恰当,别揍我qwq...

RMI 尝试

此处为了更能体会rmi原理,不把server和client放在同一个机器,而是将服务器放在虚拟机中,测试环境均为1.8u211

  1. 编写远程服务接口,该接口必须继承 java.rmi.Remote 接口,方法必须抛出java.rmi.RemoteException 异常;

  2. 编写远程接口实现类,该实现类必须继承 java.rmi.server.UnicastRemoteObject 类;

  3. 运行 RMI 编译器(rmic),创建客户端 stub 类和服务端 skeleton 类;

  4. 启动一个 RMI 注册表,以便驻留这些服务;

  5. 在 RMI 注册表中注册服务;

  6. 客户端查找远程对象,并调用远程方法;

注意:这里踩了个小坑,RMI 抛出异常 no security manager: RMI class loader disabled,新手容易遇到这个问题。这是因为在编译class文件的时候,这个class文件内部已经包含了package test.org;这样的内容,如果在部署的时候,不严格按照这个目录部署的话,服务器就会找不到。所以服务器和客户端在路径上要保持一致。

Server测试例

org
└─test
├─RMI
│ RMIServer.java

└─Server
Hello.java

//RMIServer.java
package org.test.RMI;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

import org.test.Server.Hello;

public class RMIServer {
    public class RemoteHelloWorld extends UnicastRemoteObject implements Hello {
        protected RemoteHelloWorld() throws RemoteException {
            super();
        }
        public String hello() throws RemoteException {
            System.out.println("call from");
            return "Hello DEADF1SH_CAT~";
        }
    }

    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 RMIServer().start();
    }
}
//Hello.java
package org.test.Server;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    public String hello() throws RemoteException;
}

Client测试例

org
└─test
├─client
│ TrainMain.java

└─Server
Hello.java

//TrainMain.java
package org.test.client;

import java.rmi.Naming;

import org.test.Server.Hello;

public class TrainMain {
    public static void main(String[] args) throws Exception {
        Hello hello = (Hello) Naming.lookup("rmi://192.168.247.128:1099/Hello");
        String ret = hello.hello();
        System.out.println(ret);
    }
}
//Hello.java
package org.test.Server;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    public String hello() throws RemoteException;
}

服务器输出

技术图片

客户端输出

技术图片

可以看出客户端成功调用了服务器的RemoteHelloWorld对象的hello方法

RMI数据包分析

对上述调用过程进行抓包分析

技术图片

  • 1-5为tcp三次握手和网关转发报文
  • 6-12为RMI通信数据(其中TCP报文为确认报文)

来看看9号RMI Call报文(远程对象请求)

技术图片

SerializationDumper这个工具对Java序列化数据进行分析

F:Java>java -jar SerializationDumper.jar aced00057722000000000000000000000000000000000000000000000000000244154dc9d4e63bdf74000548656c6c6f

STREAM_MAGIC - 0xac ed
STREAM_VERSION - 0x00 05
Contents
  TC_BLOCKDATA - 0x77
    Length - 34 - 0x22
    Contents - 0x000000000000000000000000000000000000000000000000000244154dc9d4e63bdf
  TC_STRING - 0x74
    newHandle 0x00 7e 00 00
    Length - 5 - 0x00 05
    Value - Hello - 0x48656c6c6f

相关链接

4-java安全基础——rmi远程调用(代码片段)

1.RMI远程调用javaRMI(JavaRemoteMethodInvocation)即远程方法调用,是分布式编程中的一种编程思想,javajdk1.2就开始支持RMI,通过RMI可以实现一个虚拟机中的对象调用另一个虚拟机上中的对象的方法,并且这两个虚拟机可... 查看详情

4-java安全基础——rmi远程调用(代码片段)

1.RMI远程调用javaRMI(JavaRemoteMethodInvocation)即远程方法调用,是分布式编程中的一种编程思想,javajdk1.2就开始支持RMI,通过RMI可以实现一个虚拟机中的对象调用另一个虚拟机上中的对象的方法,并且这两个虚拟机可... 查看详情

zeppelin0.6.2之shiroi安全配置初探

...的notebook,这种情况下,如果是多个人在使用的很方便和安全。  这篇就是对zeppelin的一些安全配置做一些初探,主要是shiro.ini这个文件。1.改变安全模式:改变如下:(1)con 查看详情

java初探之秒杀的安全

在秒杀的场景中还存在着很多的安全问题暴露秒杀地址秒杀请求可以很频繁接口流量大,恶意刷接口 隐藏秒杀接口为什么需要隐藏,事实上,页面上的所有东西都能被客户端拿到,包括js代码,因此,分析商品详情页面就可... 查看详情

初探ndk的世界(代码片段)

...文,请看音视频系统学习的浪漫马车之总目录上一篇初探ndk的世界(一)主要介绍了ndk的背景和java和C++如何交互,如果还没看过上一篇,那最好先看一下,因为这一篇将继续上一篇没有讲完的ndk话题... 查看详情

5-java安全基础——jndi和rmi实现漏洞利用(代码片段)

JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的接口,jndi可以实现给当前服务器的所有资源定义一个唯一的访问标识(例如数据库,网页,文件,连接... 查看详情

5-java安全基础——jndi和rmi实现漏洞利用(代码片段)

JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的接口,jndi可以实现给当前服务器的所有资源定义一个唯一的访问标识(例如数据库,网页,文件,连接... 查看详情

iabtis初探

...SQL入参及结果集的映射关系。简单易学、容易上手;但是安全性较差,对于金融等对安全要求较高的系统来说,不推荐使用。2、代码  首先看一下简单应用  project的结构    ibatis.xml记录了JDBC连接数据库所需的信息<?... 查看详情

初探无线安全审计设备wifipineapplenano系列之pineap

前言:  之前曾经介绍过国外无线安全审计设备TheWiFiPineappleNano的SSLsplit模块和ettercap模块及实验。在玩WiFiPineappleNano设备的过程中,鉴于个人手头只有几块网卡,测试下来发现Nano能够支持的网卡芯片有:RTL8187L、RT3070、AR92... 查看详情

初探12306售票算法-java代码实践

周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述)1.订票工具类 1.1初始化一列车厢的票据信息/** *生成Ticket信息 * *@paramtrain *@return */ publicstaticLis... 查看详情

初探ndk的世界(代码片段)

...文,请看音视频系统学习的浪漫马车之总目录上一篇初探ndk的世界(一)主要介绍了ndk的背景和java和C++如何交互,如果还没看过上一篇,那最好先看一下,因为这一篇将继续上一篇没有讲完的ndk话题... 查看详情

memoryleak检测神器--leakcanary初探

??在之前的文章Android内存泄露的几种情形中提到过在开发中常见的内存泄露问题,但是过于草率。由于刚开年,工作还没正式展开,就看了一下Github开源大户Square的LeakCanary,并用公司项目的测试环境来练手,试图找出项目中存在... 查看详情

如何将安全策略文件添加到 rmi 应用程序的 gradle 构建?

】如何将安全策略文件添加到rmi应用程序的gradle构建?【英文标题】:HowcanIaddasecuritypolicyfiletoagradlebuildforanrmiapplication?【发布时间】:2018-08-2323:41:09【问题描述】:谁能告诉我如何将java命令"-Djava.security.policy=mysecurity.policy&quo... 查看详情

python爬微信公众号前10篇历史文章-lxml&xpath初探

理解lxml以及xpath什么是lxml?python中用来处理XML和HTML的library。与其他相比,它能提供很好的性能,并且它支持XPath。具体可以查看官方文档->http://lxml.de/index.html结构化数据:XML,JSON非结构化数据:HTML文本是最常见的数据格式,... 查看详情

是时候掌握springmvc源码了-初探篇(代码片段)

初探SpringMVC源码  上篇文章我们通过手写分析了SpringMVC中的Controller的两种实现方式。接下来我们来看看在SpringMVC中具体是如何使用的。一.基于Controller接口1.案例代码引入相关的依赖<!--https://mvnrepository.com/artifact/org.springframew... 查看详情

是时候掌握springmvc源码了-初探篇(代码片段)

初探SpringMVC源码  上篇文章我们通过手写分析了SpringMVC中的Controller的两种实现方式。接下来我们来看看在SpringMVC中具体是如何使用的。一.基于Controller接口1.案例代码引入相关的依赖<!--https://mvnrepository.com/artifact/org.springframew... 查看详情

14-java安全——fastjson1.2.24反序列化jdbcrowsetimpl利用链分析(代码片段)

...种是JNDI和LDAP利用方式,关于JNDI的相关概念之前在java安全基础中已经介绍过了,而且底层原理已经分析过了,大家可自行参考以下文章。4-java安全基础——RMI远程调用5-java安全基础——RMI和JNDI实现漏洞利用6-java安全... 查看详情

什么是允许 RMI 和 JPA/Hibernate 同时工作的正确安全策略值设置

】什么是允许RMI和JPA/Hibernate同时工作的正确安全策略值设置【英文标题】:WhatarethecorrectsecuritypolicyvaluesettingstoallowbothRMIandJPA/Hibernatetoworkatthesametime【发布时间】:2011-05-2706:41:39【问题描述】:我正在开发一个需要同时使用JPA/Hibe... 查看详情