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