最近有小伙伴微信@我,提到Oracle官方在4月份补丁中发布了一个Weblogic http匿名RCE漏洞,编号CVE-2022-23305。在刷朋友圈时我也发现多篇漏洞预警文章中提到了这个漏洞,比如某公众号:
这引起了我的研究兴趣,查询资料后发现其实这是Apache Log4j v1.2.x的一个SQL注入漏洞,并不是Weblogic本身的漏洞。通报如下:
Weblogic引入Log4j依赖项后,很容易想到通过SQL注入在一定配置条件下,确实可以实现匿名RCE(比如配置后台数据库为H2 database,并且日志配置为数据库记录模式),但是这种场景非常少见。分析后发现漏洞非常简单,下面将简要概念分析分享给各位小伙伴。
从官网的描述来看,漏洞出在`JDBCAppender`。`JDBCAppender`提供了用于将日志事件发送到数据库表的机制。每个追加调用将添加到ArrayList缓冲区。当缓冲区已满时,每个日志事件都将放置在sql语句(可配置)中并执行。
参考官方说明文档,创建log配置文件`log4j.properties`:
在log4j中,`%m`表示代码中指定的日志消息字符串,`%p`输出优先级(`DEBUG`、`INFO`、`WARN`、`ERROR`、`FATAL`),`%c`输出所属的类目。在后台数据库中创建数据库表LOGS,用于存储日志信息:
CREATE TABLE LOGS
(
USER_ID VARCHAR(20) NOT NULL,
DATED DATETIME NOT NULL,
LOGGER VARCHAR(50) NOT NULL,
LEVEL VARCHAR(10) NOT NULL,
MESSAGE VARCHAR(1000) NOT NULL
);
启动调试,在写入日志过程中,首先会调用`JDBCAppender#setSql`函数来设置SQL语句:
进入`PatternLayout#format`函数:
循环通过`PatternConverter#format`完成占位符的替换:
由于对日志内容缺少检查,导致最终输入的字符串全部拼接进入SQL语句:
连接数据库并执行SQL指令,从而导致SQL注入漏洞。
由于Log4j v1.x系列已经停止更新了,所以无法直接进行升级修复,建议程序更新为Log4j v2.x系列。另外众多Java应用程序仍在使用Log4j v1.x,所以除了Oracle之外,诸如IBM、netapp等也发布了这个漏洞的修复通告:
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
原文始发于微信公众号(且听安全):CVE-2022-23305 Weblogic http RCE or Apache Log4j SQL Injection?