jndi注入

简介

jndi

  JNDI全称为Java命名和目录接口。我们可以理解为JNDI提供了两个服务,即命名服务和目录服务。

  JNDI(The java Naming and directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服务器的API,命令服务将名称和对象联系起来,使得我们可以使用名称访问对象。

这些命名/目录服务提供者:

  RMI(java远程方法调用)

  LDAP(轻量级目录访问协议)

  DNS(域名服务) (可以用于探测漏洞是否存在)

  CORBA(公共对象请求代理体系结构,在安全中目前没有发现利用方式)

lookup

  如果lookup参数可控的话,那么我们就可以传入恶意的url地址来控制受害者加载攻击者指定的恶意类。当我们指定一个恶意的url地址之后,受害者在获取完这个远程对象之后,开始调用恶意方法。但是在RMI中,调用远程方法,最终在服务端进行执行,只是把最终的结果以序列化的形式传递给客户端,也就是这里所说的受害者。当然,如果受害者内部存在漏洞组件存在反序列化漏洞的话,我们可以构造恶意的序列化对象,返回给客户端,当客户端在进行反序列化的时候,可以触发漏洞;如果目标组件不存在反序列化楼哦对那个,我们返回一个恶意对象,但是客户端本地没有这个class文件,当然也就不能成功获取到这个对象。

利用条件

  使用了lookup函数且lookup的参数可控

  利用相对应的版本

JDK6 JDK7 JDK8 JDK11
RMI可用 6u132以下 7u122以下 8u113以下
LDAP可用 6u211以下 7u201以下 8u191以下 11.0.1以下

  编译恶意类的时候注意和服务的JDK大版本的一致性

JNDI利用流程

jndi

RMI利用流程

RMI

  注:与LDAP不同的是RMI在接收到payload之后会优先在本地寻找对应的类,如果能够找到则会优先执行本地的类,否则加载远程类。


jndi注入
https://fliggyaa.github.io/2023/12/14/2023-12-14-jndi注入/
作者
fliggy
发布于
2023年12月14日
许可协议