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方法會判斷傳入的字符串是否包含${}
關鍵字。
通過replace()
最終調用到了org.apache.logging.log4j.core.lookup.StrSubstitutor#resolveVariable
觸發了整條鏈的關鍵方法lookup。
org.apache.logging.log4j.core.lookup.Interpolator#lookup
方法會截取傳入的字符來決定將要使用的lookup查詢方法,通過該方法體的處理,我們調到了JndiLookup類下的lookup方法。
通過JNDI#lookup
調到org.apache.logging.log4j.core.net.JndiManager#lookup
方法,通過JndiManager#lookup
調到InitalContext
類的lookup方法進行JNDI查詢。
然后一系列的處理大致做了對傳入的URl進行截取,截取到url中包含的class類名,然后通過loadClass()方法加載該類,最終執行我們遠程存放的類的代碼,創建一個文件。