S2-066分析与复现
Foreword
自struts2官方纰漏S2-066漏洞已经有一段时间,期间断断续续地写,直到最近才完成,o(╥﹏╥)o。羞愧地回顾一下官方通告:

2023.12.9发布,编号CVE-2023-50164,主要影响版本是 2.5.0-2.5.32 以及 6.0.0-6.3.0,描述中提到了文件上传漏洞和目录穿越漏洞。开始以为这是个组合漏洞,其实不是,这是一个漏洞,看了几篇大佬的文章,有的把它称为“文件上传目录穿越漏洞”,也有道理。
Prepare
准备工作就是搭建项目,用Tomcat跑,调试好断点,回顾下struts2的结构。篇幅有限,这里只贴一张struts2自身的配置文件:

struts2有众多的Filter和Intercepter,它的配置逻辑是,除文件中定义的class、package以外,其余全部拦截。对于S2-066,处理一个请求要经过的几个关键类包括Dispatcher、Interceptor、HttpParameters以及UploadAction。使用下面的poc:

Dispatcher
请求首先会进入著名的Dispatcher。multi参数对应的就是body数据,包含upload、fileName、contentType三个变量,无误:

request中还有一个参数,uploadFileName=../../z127.txt,这个是污染参数,文件上传的目的地,也是利用这个漏洞的目标。

走到这里Dispatcher只是简单处理一下请求然后交给Interceptor,无异常。
FileUploadInterceptor
拦截器先是把request包装了一下,类型是MultiPartRequestWrapper。

这里与Dispatcher一样,请求参数还是multi和request两部分,也无异常。

并且遍历只有一次 ,因为真正的body只有一个,就是那个multi。

在遍历过程中struts2还出现了硬编码现象,要求文件名参数必须以FileName结尾,且拼接完成的文件名前缀就是body中的{upload}名称,这就给exp带来了一定限制:

此外,注意这里的279行:
// get the name of the file from the input tag
String[] fileName = multiWrapper.getFileNames(inputName);
使用的是MultiPartRequest接口的方法,而这个接口在S2-066中是由JakartaMultiPartRequest实现。使用下面这个poc进行目录穿越并断点检测一下:

发现目录穿越失败,文件没有放在指定目录下。分析源码:

参数覆盖原本想用../../z126.txt,方法的输入参数确实也是这样接收的,但在这个方法中struts2会对文件名进行截断,最终输出的文件名会变为 z126.txt,文件也就不会出现目录穿越的现象。因此目录穿越不是发生在这里,让struts2自己背这个锅多少有点冤。body中的数据组装完毕是下面这样,size等于3,依旧无误:

HttpParameters
来到HttpParameters查看接收的参数,还是upload、contentType、fileName三个:

但是参数接收完后就不正常了,除了原本的UploadFileName(注意首字母是大写),还多了一个uploadFileName(注意首字母是小写),size也变成了4。这就是Struts2官方所解释的大小写敏感,即对大写的Upload和小写的upload分别做处理。从这里开始,S2-066才露出真正面目:

HttpParameters实现了Map接口,所以本质上它还是一个map,这也是组装参数最常用的方式。但不管是HashMap还是TreeMap,自己不会出现覆盖的问题。用一个小实验证明:

走到这里,HttpParameters对参数的处理开始出现异常,但依然没有发生覆盖。
UploadAction
终于到Action了。引用一段struts2官方的描述:
An attacker can manipulate file upload params to enable paths traversal and under some circumstances this can lead to uploading a malicious file which can be used to perform Remote Code Execution.
通过操控上传参数,黑客能够出发目录穿越漏洞,这样一来,在某些情况下可以上传恶意文件,从而进行RCE。换种说法,S2-066是框架自身、软件工程师、Java反射机制共同作用的结果。走到这里,为了简化代码,UploadAction即是Action又是Entity。而在Entity的实例化过程中,必然是通过setXX属性来赋值。所以就有了setUploadFileName(注意首字母大写)和setuploadFileName(注意首字母小写)的需求 。而在Entity的setter与getter中,这两种需求都会被当做一种,即setUploadFileName,因此覆盖也就发生了。正常情况下实例化方法只走一遍,如contentType:

而setUploadFileName第一遍是z106.txt:

第二遍是../../z127.txt:

实例化完成后,uploadFileName属性已被覆盖:

查看物理路径,上传成功:

POCs
参数不是filename结尾,失败:

参数不符合FileName大小写要求,失败:

大写覆盖小写失败:

大写覆盖大写失败:

小写覆盖小写失败:

小写覆盖大写成功,文章开头所用。另外覆盖也可以放在body中:

验证:

利用条件多少有点苛刻,但杀伤力不输struts2过去那一堆,CVSS3.0评分9.8,CRITICAL。

参考:https://github.com/jakabakos/CVE-2023-50164-Apache-Struts-RCE
相关文章:
S2-066分析与复现
Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间,期间断断续续地写,直到最近才完成,o(╥﹏╥)o。羞愧地回顾一下官方通告: 2023.12.9发布,编号CVE-2023-50164,主要影响版本是 2.5.0-2.5.32 以及 6.0.…...
让天下没有难学的大模型!我整理一份大模型技术知识图谱!
最近陆续有一些同学反馈,感觉大模型知识点太多了,找不到头绪。 今天我整理一份大模型技术以及应用的知识图谱,让大家轻松学习大模型,喜欢点赞、收藏、关注。 另外,技术交流可以文末加入我们。 大模型的预训练技术 …...
大屏动效合集更更更之实现百分比环形
实现效果 参考链接: https://pslkzs.com/demo/pie/demo1.php 写在最后🍒 源码,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云...
基于springboot的反诈宣传平台
技术:springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理,可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加ÿ…...
面试算法-82-不同路径
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? …...
阿里云ECS经济型e实例,2核2G配置、3M固定带宽和40G ESSD Entry系统盘
阿里云服务器99元一年配置为云服务器ECS经济型e实例,2核2G配置、3M固定带宽和40G ESSD Entry系统盘,新用户和老用户均可买,续费不涨价依旧是99元一年,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云99元服务器性能测评ÿ…...
Java基础知识总结(13)
数据结构 链表 优点:随机增删元素效率高(因为增删元素不涉及到大量元素的位移) 缺点:查询效率较低,每一次查找某个元素的时候都需要从头结点开始往下遍历 LinkedList集合 /* 链表的优点: 由于链表的元…...
杰发科技AC7801——Keil编译的Hex大小如何计算
编译结果是Keil里面前三个数据的总和: 即CodeRoDataRWData的总和。 通过ATCLinkTool工具查看内存,发现最后一个字节正好是5328 注意读内存数据时候需要强转成32位,加1000的 增加1024的地址只需要加256即可...
opengl 学习(六)-----坐标系统与摄像机
坐标系统与摄像机 分类引言坐标系统摄像机教程在CMake中使用全局定义预编译宏,来控制是否开启错误检查补充 分类 opengl c 引言 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说ÿ…...
分库分表场景下多维查询解决方案(用户+商户)
在采用分库分表设计时,通过一个PartitionKey根据散列策略将数据分散到不同的库表中,从而有效降低海量数据下C端访问数据库的压力。这种方式可以缓解单一数据库的压力,提升了吞吐量,但同时也带来了新的问题。对于B端商户而言&#…...
vue学习日记14:工程化开发脚手架Vue CLI
一、概念 二、安装 1.全局安装&查看版本 注意启动cmd输入命令 要以管理员运行哦 安装了一次就行以后不用再创建了 yarn global addvue/cli vue --version 显示了版本号即可 2.创建项目架子 创建项目的路径在哪 项目就在哪 项目名字不能用中文 vue create project-n…...
java Flink(四十三)Flink Interval Join源码解析以及简单实例
背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink(三十六)Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联,…...
JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录
项目场景: 需求:我在做网络接口链接,使用的unity自带的 UnityWebRequest ,数据传输使用的json,json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为:…...
面试算法-69-三角形最小路径和
题目 给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那…...
流畅的 Python 第二版(GPT 重译)(九)
第四部分:控制流 第十七章:迭代器、生成器和经典协程 当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表…...
单片机学到什么程度才可以去工作?
单片机学到什么程度才可以去工作? 如果没有名校或学位的加持,你还得再努力一把,才能从激烈的竞争中胜出。以下这些技能可以给你加分,你看情况学,不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…...
内网穿透方案
内网穿透 有几种流行的内网穿透软件可供选择,它们都能帮助你在内网环境中建立与外部网络的连接。以下是其中一些常用的内网穿透软件: Ngrok:Ngrok 是一个简单易用的内网穿透工具,可以快速创建安全的公共 URL,让你可以…...
WordPress菜单函数wp_nav_menu各参数
wordpress主题制作时,常常会在不同的位置调用不同的菜单,使用下面的这个代码,再加上CSS给菜单做新的样式,可满足wordpress模板制作时对菜单调用的所有需求。 wp_nav_menu( array( theme_location > ,//导航别名 menu > , /…...
类于对象(上)--- 类的定义、访问限定符、计算类和对象的大小、this指针
在本篇中将会介绍一个很重要和很基础的Cpp知识——类和对象。对于类和对象的篇目将会有三篇,本篇是基础篇,将会介绍类的定义、类的访问限定符符和封装、计算类和对象的大小、以及类的 this 指针。目录如下: 目录 1. 关于类 1.1 类的定义 2 类…...
提升交付效率:Booking.com 金融技术团队的成功实践
Booking.com 金融技术业务部门的团队对其平台的后端和前端实施了一系列改进措施,并通过 DORA 指标将交付性能提高了一倍。此外,还使用了微前端 (MFE) 模式,将单体 FE 应用程序分解为多个可单独部署的分解应用程序。 2022 年年中,B…...
如何用10分钟语音打造专业AI变声器:RVC语音转换终极指南
如何用10分钟语音打造专业AI变声器:RVC语音转换终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…...
Magma智能运维:基于Prometheus的监控告警优化
Magma智能运维:基于Prometheus的监控告警优化 1. 监控系统面临的挑战 现代分布式系统的监控一直是个头疼的问题。随着微服务架构的普及,服务数量呈指数级增长,传统的监控方式已经力不从心。运维团队经常面临这样的困境:明明设置…...
2026年公考备战:呼和浩特这3家培训机构凭何领跑行业口碑榜?
呼和浩特这3家培训机构凭何领跑行业口碑榜?随着2026年公考备战季悄然拉开序幕,呼和浩特众多备考生的目光再次聚焦于如何选择一家靠谱的培训机构。近期,一份基于学员真实反馈、上岸数据及行业教研深度的本土公考机构口碑榜引发关注。榜单显示&…...
PyCharm专业开发:调试与集成千问3.5-9B模型调用代码
PyCharm专业开发:调试与集成千问3.5-9B模型调用代码 1. 前言:为什么选择PyCharm进行AI模型开发 PyCharm作为Python开发者最喜爱的IDE之一,在AI模型开发领域有着独特的优势。特别是当我们需要集成像千问3.5-9B这样的大语言模型时,…...
UML vs ADL:架构设计工具选型指南(含AADL在嵌入式系统的特殊优势)
UML vs ADL:架构设计工具选型指南(含AADL在嵌入式系统的特殊优势) 在软件架构设计领域,选择合适的描述工具往往决定了设计效率与系统质量。当团队面临UML与ADL的选型时,决策者需要超越工具本身的语法差异,从…...
三层三列立体停车库的PLC实战开发手记
基于PLC的升降横移立体停车库的设计,设计一个基于西门子S7-200 PLC控制核心的,三层三列,九个车位的立体停车控制系统。 目录\\t3 1 绪 论\\t4 2 设计要求\\t5 3 硬件设计\\t8 3.1 PLC型号的选择和确定\\t8 3.2 主电路设计\\t8 3.3 控制电路…...
为什么87%的AI项目卡在MVP之后?:2026技术雷达图暴露5个被低估的工程化盲区
第一章:AI原生软件研发技术雷达图2026版全景概览 2026奇点智能技术大会(https://ml-summit.org) 2026版AI原生软件研发技术雷达图由ML Summit联合CNCF AI Working Group、IEEE Software AI Engineering Task Force共同发布,覆盖7大核心维度、42项关键技…...
R语言临床数据挖掘的7个致命陷阱:92%的医学研究者在第3步就失败了?
第一章:临床数据挖掘的医学伦理与R语言合规性基础临床数据挖掘在推动精准医疗与公共卫生决策中具有不可替代的价值,但其前提是严格遵循医学伦理原则与数据治理规范。世界医学会《赫尔辛基宣言》与我国《涉及人的生物医学研究伦理审查办法》均强调&#x…...
解锁Presto/Trino高级查询:从集合运算到多维分析与窗口函数实战
1. 从零掌握Presto/Trino集合运算 第一次接触Presto/Trino的集合运算时,我完全被UNION、INTERSECT、EXCEPT这些操作符搞晕了。直到在电商用户行为分析项目中踩过几次坑后,才发现它们其实是处理数据集的瑞士军刀。想象你手上有两份销售数据:线…...
EoH Platform:嵌入式多协议物联网边缘中间件
1. EoH Platform 概述:面向工业物联网的多协议嵌入式中间件平台 EoH Platform(Edge of Hub Platform)并非传统意义上的单功能驱动库或轻量级协议栈,而是一个专为资源受限嵌入式设备设计的 可裁剪、可扩展、协议无关的物联网边缘中…...
