Log4j 远程代码执行


Log4j rce 复现

log4j远程代码执行分析

由于log4j提供了对JNDI表达式的解析功能,从Log.error()中传入的poc会被log4j触发并执行。

log4j 执行过程

org.apache.logging.log4j.core.layout.PatternLayout.PatternSerializer#toSerializable(org.apache.logging.log4j.core.LogEvent, java.lang.StringBuilder)方法循环调用

for(int i = 0; i < len; ++i) {
                this.formatters[i].format(event, buffer);
            }

关键触发点org.apache.logging.log4j.core.pattern.PatternFormatter#format方法,format方法中又会对org.apache.logging.log4j.core.pattern.MessagePatternConverter#format方法进行调用。Message类format方法会判断传入的字符串是否包含${}关键字。

image-20211213010307166

通过replace()最终调用到了org.apache.logging.log4j.core.lookup.StrSubstitutor#resolveVariable触发了整条链的关键方法lookup。

org.apache.logging.log4j.core.lookup.Interpolator#lookup方法会截取传入的字符来决定将要使用的lookup查询方法,通过该方法体的处理,我们调到了JndiLookup类下的lookup方法。

image-20211213015802038

通过JNDI#lookup调到org.apache.logging.log4j.core.net.JndiManager#lookup方法,通过JndiManager#lookup调到InitalContext类的lookup方法进行JNDI查询。

image-20211213023749770

然后一系列的处理大致做了对传入的URl进行截取,截取到url中包含的class类名,然后通过loadClass()方法加载该类,最终执行我们远程存放的类的代码,创建一个文件。

image-20211213024900217


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM