什么是JNDI
可以用一个字符串对应一个对象(内容相当于一个容器支持将Java对象保存进去)
JNDI包含在Java SE平台中。要使用JNDI,您必须拥有JNDI类和一个或多 个服务提供者。JDK 包括以下命名/目录服务的服务提供者:
轻量级目录访问协议(LDAP)
通用对象请求代理架构(CORBA)通用对象服务(COS)名称服务
●Java远程方法调用(RMI)注册表
●域名服务(DNS)
JNDI可引用对象和引用(当目录可存储对象时,需要满足其中
- Java 可序列化对象
可引用
对象和JNDI引用
- 具有属性的对象 (
DirContext
) - RMI(Java 远程方法调用)对象(包括使用 IIOP 的对象)
- CORBA 对象
)这五个。
而JNDI对象就是将其他对象转化为其中之一,将对象转化为引用对象
JNDI和RMI结合怎么使用的
在目标上发现允许你查询任意的路径可以查询我们的恶意服务
JNDI注入就是绑定引用对象
类加载逻辑与具体容器协议无关
原生的RMI JNDI引用的应用(允许远程类加载,类实例化)
本质就是类加载问题
利用过程
后来JNDI修复了两种还有一种ldap,只是漏网之鱼(81191之前)
高版本的绕过
找objectfactory类
依赖Tomcat进行绕过,不是通过类加载,反射调用elprocess表达式
获取Bean的所有get方法动态调用在Beanfactory类(有调用条件:只传一个)
CC利用链
反序列化:接受任意对象,执行(固定方法(readobject))—》执行任意方法——-》最后到达Runtime.getRuntime.exec()
方法:不同类的同名函数/任意方法调用(反射,动态加载字节码)
第一步:可序列化+重写readObject+接受任意对象为参数
第二步:可序列化+集合类型(集合可接受任意对象)
.java文件与.class不一样,.class就没有.java文件
Map.entry调用setvalue就可以执行任意代码—–》找readobject调用setvalue
Java文件类没写权限默认default类型只有内部类可以,要用反射—->calss.forName
什么是JNDI
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface)是一组在Java
应用中访问命名和目录服务的API
,或者说在应用中引用与程序无关的外部资源(可能是数据库资源,也可能是其他资源),降低了应用和其他应用程序组件之间的耦合,使应用更加易于配置、易于部署。
JNDI包含在Java SE平台中。要使用JNDI,必须拥有JNDI类和一个或多个服务提供者。JDK 包括以下命名与目录服务的服务提供者:
轻量级目录访问协议(LDAP)
通用对象请求代理架构(CORBA)通用对象服务(COS)名称服务
Java远程方法调用(RMI)注册表
域名服务(DNS)
JNDI有什么用
当没有JNDI时,
常见的攻击载荷
JDNI主要有几种攻击载荷:
- CORBA
- IOR
- JNDI Reference
- LDAP
- Remote Location
- Remote Object
- RMI
- Serialized Object