Java代码审计基础(一)


什么是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引用的应用(允许远程类加载,类实例化)

本质就是类加载问题

利用过程

img

后来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

文章作者: 小小星仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小星仔 !
评论
  目录