使用Spring Boot创建容易受到Log4Shell漏洞攻击的环境

为了练习,我会尝试搭建一个容易受到Log4Shell攻击的环境。
在使用Log4j2版本2.14.0的情况下,我很容易就搭建了一个脆弱的环境。如果不立即更新版本,会存在安全风险!

Spring官方网站对于脆弱性的解释

主题

将公式的“Getting Started Guides”中的“Building a RESTful Web Service”作为基础。

image.png
    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脚本。

log4j-tester.trendmicro.com_(iPad) (1).png

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

log4j-tester.trendmicro.com_(iPad).png

使用Log4J2的2.14.0版本发现存在漏洞。
将pom.xml中的版本升级到2.15.0并重新运行,将不再检测到漏洞。

好可怕啊!我们马上升级版本吧。

bannerAds