当前位置: 首页 > article >正文

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 应用的监控和日志记录,重点监测路径穿越和文件上传相关流量。


http://www.kler.cn/a/549888.html

相关文章:

  • 大数据预处理中的数据清洗策略
  • SpringBoot 的核心只有几张图
  • 区块链可投会议CCF B--ICNP 2025 截止5.16 附2023录用率
  • GO语言中的结构体struct
  • 核货宝外贸订货系统:批发贸易企业出海的强劲东风
  • 开源AI智能名片2+1链动模式S2B2C商城小程序在社交价值挖掘中的应用与策略研究
  • KT1025A蓝牙音频芯片FM收音机的AT指令串口部分举例说明
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】
  • 【云安全】云原生-K8S(三) 安装 Dashboard 面板
  • Endnote使用笔记——持续更新
  • 如何在 Docker 环境中将宿主机的文件复制到容器目录
  • (5/100)每日小游戏平台系列
  • Session的学习
  • 图像分割与 Watershed 算法:原理、Python 实现与.NET 实现
  • 关于go-context包
  • C#控制台大小Console.SetWindowSize函数失效解决
  • elementui: el-dialog的header设置样式不生效
  • 【C++】使用gdb在命令行下调试C++程序(二)
  • Matlab自学笔记四十七:如何把日期时间型数据作为横坐标进行绘图
  • 数据结构——顺序表与链表