JNDI 注入的原理

JNDI 是 Java Naming and Directory Interface, Java 命名目录接口 的缩写,是 Java 提供的标准命名和目录服务接口,提供了统一的可以访问各种命名目录服务(如:LDAP、RMI 等)的方式。

JNDI 注入,就是利用应用程序中的 JNDI 服务,将恶意代码注入到应用程序中。

比如著名的 Log4J 漏洞,其根本原理就是 LDAP 服务中存储外部恶意资源,JNDI 去访问 LDAP 时被 LDAP 外部恶意代码注入

 

LDAP原理

目录服务是一个特殊的数据库,用来保存描述性的,基于属性的详细信息,支持过滤功能

LDAP(Linght Directory Access Dortocol)基于X.500标准的轻量化目录访问协议

目录是一个为查询,浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样,目录数据库和关系型数据库不同,它有优异的读功能,但写性能很差,并且没有事务处理,回滚等复杂的功能,不适于储存被频繁修改的数据,所以它天生就是被用来查询的,就像它的名字一样

LDAP目录服务是由目录数据库和一套协议组成的系统

注意looup这个方法,这个是请求ldap服务的入口。

请求ldap的参数可控意味着请求的ldap的服务器也可控,作为攻击者我们可以伪造一个ldap服务器。

这时是不是返回的内容也可控了,如果返回正常的字符串,log4j是不是就正常打印处理了。但如果我们返回的是一个恶意类的地址,作为发起请求的客户端收到这个地址会如何处理呢?也许就是触发了这个机制(开发人员没有想过这样的恶意类加载),客户端得到类的地址试图得到这个类(下载到本地)进行对象化。这样就必然会执行攻击者在类中提前设置的恶意代码。

Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件。这里是请求下载了恶意的.class文件

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...