使用Spring Boot创建容易受到Log4Shell漏洞攻击的环境
为了练习,我会尝试搭建一个容易受到Log4Shell攻击的环境。
在使用Log4j2版本2.14.0的情况下,我很容易就搭建了一个脆弱的环境。如果不立即更新版本,会存在安全风险!
Spring官方网站对于脆弱性的解释
主题
将公式的“Getting Started Guides”中的“Building a RESTful Web Service”作为基础。

- GitHubからソースコードの取得
以下是您要求的中文释义:
https://github.com/spring-guides/gs-rest-service/archive/main.zip
包含有已完成的源代码的 complete 文件夹。
│ build.gradle
│ gradlew
│ gradlew.bat
│ manifest.yml
│ mvnw
│ mvnw.cmd
│ pom.xml
│ settings.gradle
│
├─.mvn
│ └─wrapper
│ maven-wrapper.jar
│ maven-wrapper.properties
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ └─java
│ └─com
│ └─example
│ └─restservice
│ Greeting.java
│ GreetingController.java
│ RestServiceApplication.java
│
└─test
└─java
└─com
└─example
└─restservice
GreetingControllerTests.java
请使用Log4J2来修正日志输出。
将代码更改为使用Log4j2,版本为2.14.0,该版本存在漏洞。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>rest-service-complete</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest-service-complete</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
+ <log4j2.version>2.14.0</log4j2.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
将HTTP请求的HTTP头部记录在日志中并进行修改
package com.example.restservice;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+ import java.util.Map;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ import org.springframework.web.bind.annotation.RequestHeader;
@RestController
public class GreetingController {
+ static protected Logger logger = LoggerFactory.getLogger(GreetingController.class);
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
- public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
+ public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name,
+ @RequestHeader Map<String, String> headers) {
+
+ headers.forEach((key, value) -> {
+ logger.info(String.format("Header '%s' = %s", key, value));
+ });
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
这简直太脆弱了。
开始运行。
./mvnw spring-boot:run
确定
我发现趋势科技公司准备了一个检测网站,我打算使用它来进行确认。
你可以通过网站直接发送请求进行检查,就像这样。
因为这次是在本地主机上启动,所以我们会生成并运行右侧的cURL脚本。

结果会以这种方式显示出来。

使用Log4J2的2.14.0版本发现存在漏洞。
将pom.xml中的版本升级到2.15.0并重新运行,将不再检测到漏洞。
好可怕啊!我们马上升级版本吧。