Apache Struts 2 中发现新的严重 RCE 漏洞CVE-2023-50164


2023 年 12 月 20 日,NIST 更新了 CVE,以反映struts-core中的新路径遍历漏洞。这就是CVE-2023-50164,也列在 Snyk漏洞数据库中,CVSS 严重程度为 9.8。如果您从事网络安全工作的时间足够长,您一定会记得2017 年的 Equifax 漏洞,该事件也是由于未修补的 Struts 漏洞而发生的。

让我们从补救建议开始。只需将您的 Struts 版本升级到 2.5.33 或 6.3.0.2(或更高版本),具体取决于您当前使用的基本版本。

Struts CVE-2023-50164 路径遍历漏洞有多严重?
这个新漏洞很严重 — 您应该确保更新您的 Struts 版本。不过,它的严重性不如 2017 年的漏洞,因为它需要不安全的代码和存在漏洞的 Struts 版本。

该漏洞允许在文件上传时进行路径遍历。也就是说,您可以上传文件并通过给出相对路径“突破”指定的上传文件夹。这可能会导致远程代码执行,因为相对路径可能位于应用程序所服务的文件夹内。

本帖中的所有代码都在 GitHub上。

这是一个使用 Maven 进行构建的 Java 项目。项目中有两个配置文件:一个叫 vuln(默认),另一个叫 no-vuln。如果你不熟悉 Maven 或 Maven 配置文件,不用担心!运行起来非常简单,易受攻击版本就是默认配置文件。唯一的要求是 Java 运行时,版本为 17 或更高。

运行:./mvnw clean jetty:run

您可以通过 http://localhost:9999/struts-vuln-poc 浏览服务器。在那里,你会看到一个非常简洁的上传文件界面。不过,我们不会把时间花在这里。为了满足本演示中 "袖手旁观 "的部分,请导航到 http://localhost:9999/struts-vuln-poc/rogue.jsp。你应该会看到这样一个 404 页面:

我们要利用这个漏洞,所以要打开一个终端窗口,导航到项目文件夹,然后准备使用你选择的 HTTP 客户端。在我的示例中,我使用的是 curl,但你也可以使用任何支持文件上传的 HTTP 客户端。执行以下命令

curl \
http://localhost:9999/struts-vuln-poc/upload.action \
-F
"Upload=@./payload/rogue.jsp" \
-F
"uploadFileName=../src/main/webapp/rogue.jsp"

现在,导航至 http://localhost:9999/struts-vuln-poc/rogue.jsp。您现在应该会看到以下信息你被 PWNED 了!。

现在,我们已经通过向应用程序提供的文件夹投放恶意文件利用了漏洞,让我们来看看我们是怎么做到的。

我在前面写到,要利用这个漏洞,需要同时使用有漏洞版本的 Struts 库和不安全代码。

不安全代码
让我们先看看不安全的代码部分。上传操作有三个属性:

private File upload;
private String uploadFileName;
private String uploadContentType;

根据 Struts 的工作原理,这些属性将由 HTTP 客户端(无论是浏览器还是命令行工具,如 curl)发出的请求填充。

属性设置完成后,执行方法将处理请求。

下面是执行方法的核心:

String uploadDirectory = System.getProperty("user.dir") + "/uploads/";
File destFile = new File(uploadDirectory, uploadFileName);
FileUtils.copyFile(upload, destFile);

这里有一个微妙之处值得一提。请注意,定义的 uploadDirectory 尾部有一个斜线 (/)。这一点非常重要,因为如果没有这一点,恶意用户仍有可能从 uploads 文件夹中越狱。这就是为什么更新到最新版本的 struts 如此重要:因为相对路径会被自动去掉,所以你不必依赖代码中的手动检查。