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. es6 个人笔记

           1.package.json==>npm init node_modules==>npm install webpack -D webpack.config.js==> ...

  2. 几图理解BeautifulSoup

  3. JS基础-该如何理解原型、原型链?

    JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...

  4. java IO流 之 FIle类基础

    package IO; import java.io.File;import java.io.IOException; public class FileIO { /** * 构建及获取文件名信息 * ...

  5. Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

    ### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...

  6. 初探Electron,从入门到实践

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.   在开始之前,我想您一定会有这样的困惑:标题里的Electron ...

  7. 利用canvas绘制带干扰线的验证码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性

    系列目录     [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...

  9. [python]变量和赋值

    1. python的变量名以字母开头,包含字母.数字.下划线. 2. python是动态类型语言,即不需要预先声明变量的类型.变量的类型和值在赋值的时候被初始化. 变量赋值通过等号来执行. 代码: c ...

  10. hdu 1007 Quoit Design(分治)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:给出n个点求最短的两点间距离除以2. 题解:简单的分治. 其实分治就和二分很像二分的写df ...