首页 > 其他分享 >S2-066漏洞分析与复现(CVE-2023-50164)

S2-066漏洞分析与复现(CVE-2023-50164)

时间:2024-03-20 10:03:09浏览次数:16  
标签:066 S2 漏洞 struts2 参数 小写 50164

Foreword

自struts2官方纰漏S2-066漏洞已经有一段时间,期间断断续续地写,直到最近才完成。羞愧地回顾一下官方通告:

image.png

2023.12.9发布,编号CVE-2023-50164,主要影响版本是 2.5.0-2.5.32 以及 6.0.0-6.3.0,描述中提到了文件上传漏洞和目录穿越漏洞。开始以为这是个组合漏洞,其实不是,这是一个漏洞,看了几篇大佬的文章,有的把它称为“文件上传目录穿越漏洞”,也有道理。

Prepare

准备工作就是搭建项目,用Tomcat跑,调试好断点,回顾下struts2的结构。篇幅有限,这里只贴一张struts2自身的配置文件:

image.png

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

cda10716c5804ad293daf6ae5c7ed9a.png

Dispatcher

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

image.png

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

image.png

走到这里Dispatcher只是简单处理一下请求然后交给Interceptor,无异常。

【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

FileUploadInterceptor

拦截器先是把request包装了一下,类型是MultiPartRequestWrapper。

image.png

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

image.png

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

image.png

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

image.png

此外,注意这里的279行:

// get the name of the file from the input tag
String[] fileName = multiWrapper.getFileNames(inputName);

使用的是MultiPartRequest接口的方法,而这个接口在S2-066中是由JakartaMultiPartRequest实现。使用下面这个poc进行目录穿越并断点检测一下:

image.png

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

image.png

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

image.png

HttpParameters

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

image.png

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

image.png

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

image.png

走到这里,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:

image.png

而setUploadFileName第一遍是z106.txt:

image.png

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

image-20240319143952102

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

image.png

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

image.png

POCs

参数不是filename结尾,失败:

5e69d76ba4a0c6e60e5fd410a53f9a1.png

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

674bb93cd91ae101fbb3cf77c13629c.png

大写覆盖小写失败:

ab7ee0ad28107ef1a8569beca2091a2.png

大写覆盖大写失败:

31b60ab46f1b93332c0cd5ecc3ce11f.png

小写覆盖小写失败:

9a5feb70097b8fd64c922676ab5cc17.png

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

61f40e5da8a7488a8156c1e8897df3f.png

验证:

8da6d33b7bf1dc08e644433d86e0dde.png

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

capture_20240114164504492.bmp

更多网安技能的在线实操练习,请点击这里>>

  

标签:066,S2,漏洞,struts2,参数,小写,50164
From: https://www.cnblogs.com/hetianlab/p/18084560

相关文章

  • Qt+vs2019+PCL1.12.1+VTK9.1环境搭建中的相关问题
    目录1.VS中双击Ui文件无法打开2.VTK9.0以后在QtDesigner中找不到QVTKWidget组件3.无法打开源文件"QVTKOpenGLNativeWidget.h"4.无法打开源文件"QOpenGLWidget"5.QWidget:MustconstructaQApplicationbeforeaQWidget6.无法打开源文件"QtWidgets/QApplicati......
  • 杭电OJ 2066 一个人的旅行
    一个人的旅行考查图论中的单源最短路径问题,首先图的存储方式,前面说过在实际程序中一般用邻接表,为每一个顶点都分配一个单链表(向量)。由于这里顶点的总个数并不确定,用visit数组在集合T中遍历寻找下一个用来松弛的顶点,这一方式不太合适,所以这里我用优先队列,每次弹出距离起始点距离......
  • s2fft库介绍:可微分和加速球谐变换
    一、说明        科学和工程的许多领域都会遇到在球体上定义的数据。对此类数据进行建模和分析通常需要傅里叶变换的球面对应物,即球面谐波变换。我们简要概述了球谐变换,并提出了一种新的可微分算法,该算法专为GPU上的加速而定制[1]。该算法在最近......
  • vs2022新建项目却显示0个项目
    最近重新安装了vs2022,新建一个web程序之后却显示 使用cmd输入命令dotnet--info结果显示 没有SDK 安装了.net6SDK之后,依然是这样,没办法,只能查询环境变量了找到高级环境变量的系统变量,找到path,正常的效果如下,ProgramFiles在上面 因为在这个文件夹下面才有sdk......
  • 【QT入门】VS2019+QT的开发环境配置
    声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!) 往期回顾:【QT入门】什么是qt,发展历史,特征,应用,QtCreator-CSDN博客【QT入门】Windows平台下QT的编译过程_qt编译windows应用-CSDN博客【QT入门】VS2019+QT的开发环境配置一、安装流程1......
  • 蓝桥杯单片机STC15F2K60S2第十三届省赛代码详细讲解(附完整代码)
     一、前言            在蓝桥杯单片机的比赛当中,很多传感器都是会经常使用到的,比如说DS18B20和DS1302等,都是会经常用到的,所以我们要把这些传感器都学会一下。在省十三的蓝桥杯单片机题目中,我自己也写了一下这个代码,可能有些地方会有点问题,但是大致的功能还是能......
  • ROS2 自学之接口
    一、什么是接口std_msgs/msg/Stringstd_msgs/msg/UInt32在学习话题的时候,我们就已经接触到了如上两个接口,这两个接口分别是对应了字符串类型和u_int32的接口,所谓接口就是ROS2中提前定义好的一种规范。类似于充电器接口,尽管不同厂家制造的充电器不同,但他们都统一执行一种规......
  • ros2学习之报错分析:
    CMakeGeneratestepfailed. Buildfilescannotberegeneratedcorrectly.gmake:***[Makefile:267:cmake_check_build_system]错误1---Failed  <<<village_wang[0.43s,exitedwithcode2]Summary:0packagesfinished[0.56s] 1packagefailed:v......
  • 在VS2022和VS2012共存的电脑上安装VS212扩展注意事项
    1、下载一个专用于VS2012的扩展文件,直接双击下载的扩展文件安装后,显示安装成功。但是你可能会发现在VS2022,VS2012中都找不到此扩展。这就要求必须用VS2022的命令将其卸载,然后再用VS2012进行安装。2、用VS2022的命令卸载打开VS2022开发工具先找出此扩展的vsixid:将原扩展文件......
  • ros2中Qos的C++配置方法
    1.dds_debug.hpp#ifndefDDS_DEBUG__DDS_DEBUG_HPP_#defineDDS_DEBUG__DDS_DEBUG_HPP_#include<rclcpp/rclcpp.hpp>#include<rclcpp/qos.hpp>#include<rmw/types.h>#include<sensor_msgs/msg/imu.hpp>constrmw_qos_profile_tmy_cus......