0x01.java RMI

RMI(Remote Method Invocation)是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。
RMI依赖的通信协议为JRMP(Java Remote Message Protocol ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。
这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。在RMI中对象是通过序列化方式进行编码传输的。

如上图所示,在JVM之间通信时,客户端要调用远程服务器上的对象时,并不是直接将远程对象拷贝到本地,而是通过传递一个stub。

其中stub就包含了远程服务器的地址和端口等信息,可以看作是远程对象的引用,客户端可以通过调用stub中的方法来对远程对象进行使用,也就是上图所说的逻辑上的调用,而非直接调用,即真实的数据是从客户端到服务端远程对象的stub(存根)到服务器的skeleton(骨架)之间的socket通信。

实际上client并不知道远程服务器的通信地址和端口,但是服务器对象存根(stub)中有这些信息,那么客户端只要拿到stub,通过调用stub上的方法,然后stub再连接到远程服务器的具体端口,服务器执行client所请求的具体方法,再讲运行结果返回给stub,stub再将结果返回给client,此时client表面上看起来即为在本地执行了远程服务器上指定对象的方法,而这个执行过程对client实际上是透明的。

至于如何获取stub,常见方法为通过RMI注册表(RMIRegistry)来解决这个问题,RMIRegistry也为远程对象,此时监听在1099端口,注册远程对象需要RMI URL 和一个远程对象的引用(实际上就是一个路由对应着一个远程服务器上类的实例化对象)。而此时客户端首先可以通过RMI注册表查询到远程对象的名称,先获取stub,然后来调用该stub来调用远程对象所属类中的方法。

比如如下例子:

远程服务端:

IHello rhello = new HelloImpl();
LocateRegistry.createRegistry(1099);
Naming.bind("rmi://0.0.0.0:1099/hello", rhello);

此时远程服务端RMI注册表监听1099端口,并设置RMI URL和对应该URL的类对象

客户端:

Registry registry = LocateRegistry.getRegistry("远程服务器地址",1099);
IHello rhello = (IHello) registry.lookup("hello");
rhello.sayHello("test");

此时客户端访问远程服务器RMI注册表,得到该RMI注册表的对象,此时再访问其中URL中的hello,即可以获得服务器端绑定到hello的类的对象,此时就可以进行调用sayHello方法,其中方法是在服务端执行的,服务端执行结束将返回结果返回给客户端,即在整个流程客户端也就完成了对远程服务器上的对象的使用。

动态加载类:

这点根据我的理解应该是服务端可以将不同的url与类写到RMI注册表中,当客户端的jvm想要调用某个类时,可以根据服务端传递过来的url去远程下载类对应的class文件到本地来进行调用。

2.JNDI注入

jndi介绍:

第一部分已经说过我们可以通过url和对象写到rmi注册表中,此时客户端可以通过url来对远程对象进行加载,而jndi为java服务和目录接口,JNDI提供统一的客户端API,通过不同的访问提供者接口,JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互,所以我们可以通过jdni来访问远程的url来获取我们需要的服务,那么如果服务端将对象注册到RMI注册表中,我们即可以通过jndi来对此对象进行访问。每一个对象都有键值对,与名字和对象进行绑定,可以通过名字来对对象进行访问,对象可能存储在rmi、ldap中。

java可以将对象存储在naming或者directory服务下,提供了naming reference功能,其中对象绑定到reference上,存储在naming或者directory服务下,(rmi,ldap等)。在使用reference的时候,将对象绑定到构造方法中,从而在被调用的时候触发。

举个JNDI

JNDI注入与反序列化学习总结的更多相关文章

  1. Java反序列化中jndi注入的高版本jdk绕过

    群里大佬们打哈哈的内容,菜鸡拿出来整理学习一下,炒点冷饭. 主要包含以下三个部分: jndi注入原理 jndi注入与反序列化 jndi注入与jdk版本 jndi注入原理: JNDI(Java Name ...

  2. weblogic-CVE-2020-2551-IIOP反序列化学习记录

    CORBA: 具体的对CORBA的介绍安全客这篇文章https://www.anquanke.com/post/id/199227说的很详细,但是完全记住是不可能的,我觉得读完它要弄清以下几个点: 1 ...

  3. Java安全之JNDI注入

    Java安全之JNDI注入 文章首发:Java安全之JNDI注入 0x00 前言 续上篇文内容,接着来学习JNDI注入相关知识.JNDI注入是Fastjson反序列化漏洞中的攻击手法之一. 0x01 ...

  4. Weblogic漏洞分析之JNDI注入-CVE-2020-14645

    Weblogic漏洞分析之JNDI注入-CVE-2020-14645 Oracle七月发布的安全更新中,包含了一个Weblogic的反序列化RCE漏洞,编号CVE-2020-14645,CVS评分9. ...

  5. 浅析JNDI注入Bypass

    之前在Veracode的这篇博客中https://www.veracode.com/blog/research/exploiting-jndi-injections-java看到对于JDK 1.8.0 ...

  6. PHP序列化与反序列化学习

    序列化与反序列化学习 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. <?php class UserInfo { public $name = &q ...

  7. JNDI注入基础

    JNDI注入基础 一.简介 JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务 ...

  8. Java之JNDI注入

    Java之JNDI注入 About JNDI 0x01 简介 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JND ...

  9. shellcode 注入执行技术学习

    shellcode 注入执行技术学习 注入执行方式 CreateThread CreateRemoteThread QueueUserAPC CreateThread是一种用于执行Shellcode的 ...

随机推荐

  1. 开发人员需要掌握的日常Linux命令集

    本文整理了开发人员日常用到的linux相关命令,供参考. 文件相关 cd # 进入某个目录,不接参数进入当前用户目录(等同于cd ~)如/home/devuser,可接绝对路径或相对路径(../..表 ...

  2. ionic 技术要点

    1.当遇到数据模型改变了,但是页面渲染的数据却没有改变的时候,尝试执行 $scope.$apply(): 2.时间的定义及监听: 定义事件 showNewMsg并从scope往下广播: $scope. ...

  3. Android进阶之路(1)-详解MVC

    最近因为换工作的原因没有写博客,现在慢慢稳定了,我准备写一些关于Android 进阶的文章,也是为了督促自己学习,大家一起进步! 今天详细的分析一下Android APP架构之一:MVC ### MV ...

  4. (一)spring aop的两种配置方式。

    sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...

  5. Codeforces 1058 D. Vasya and Triangle 分解因子

    传送门:http://codeforces.com/contest/1058/problem/D 题意: 在一个n*m的格点中,问能否找到三个点,使得这三个点围成的三角形面积是矩形的1/k. 思路: ...

  6. Codeforces 734D. Anton and Chess(模拟)

    Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...

  7. codeforces 284 C. Cows and Sequence(线段树)

    题目链接:http://codeforces.com/contest/284/problem/C 题意:就是给出3个操作 1)是将前i 个数加x 2)在数组最后添加一个数x 3)删除数组最后的那个数 ...

  8. CF990C Bracket Sequences Concatenation Problem 思维 第五道 括号经典处理题目

     Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 meg ...

  9. 【Swagger】可能是目前最好的 Spring Boot 集成 swagger 的方案

    [Swagger]可能是目前最好的Spring Boot集成 swagger 的方案 ![](https://img2018.cnblogs.com/blog/746311/201909/746311 ...

  10. Error executing DDL via JDBC Statement 导致原因之一:列名使用了sql关键字

    WARN: GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statem ...