漏洞复现-Apache Struts2 文件上传漏洞(CVE-2023-50164)

1.漏洞描述

Apache Struts2 是一个开源的 Java Web 应用程序开发框架,旨在帮助开发人员构建灵活、可维护和可扩展的企业级Web应用程序。

由于文件上传逻辑存在缺陷,攻击者可以操纵文件上传参数来实现路径穿越,在某些情况下,通过上传的恶意文件可实现远程代码执行。

2.影响版本

  • 2.5.0 <= Apache Struts <= 2.5.32
  • 6.0.0 <= Apache Struts <= 6.3.0 

3.影响范围

4.漏洞分析

我们先看补丁
Makes HttpParameters case-insensitive · apache/struts@162e29f · GitHub

发现对HttpParameters进行了修改,对参数大小写进行了控制,强制将参数都转换成了小写,漏洞和大小写参数有关

在appendAll方法中添加了remove函数,get方法中添加了小写转换:

S2-066 - Apache Struts 2 Wiki - Apache Software Foundation

描述,该漏洞在文件上传的时候允许攻击者控制参数,进行目录穿越让文件落地到任何位置:

上面描述可知此漏洞为路径穿越,而我们知道Struts2本身是有一系列默认拦截器,这部分配置在struts-default.xml中,其中就包含了一个与文件上传相关的拦截器org.apache.struts2.interceptor.FileUploadInterceptor

发现获取文件名是通过multiWrapper.getFileNames来的。

最终是通过getCanonicalName做了过滤的。

那既然已经做了过滤,一眼看去也没啥问题怎么还会有目录遍历呢,继续往下看。

返回FileUploadInterceptor继续跟踪,首先获取inputName,将获取到的inputName添
加FileName字符串,然后封装成了newParams集合,最后追加给了ActionContext的parameters中。

然后这里我们全局搜索追一下,在FileUploadInterceptor之前是哪里操作了
ActionContext.parameters。

看看调用栈

发送请求

在ServiceAction下断点,这边可以看到,extraContext的parameters中首先获取到了非上传所需参数uthor与test,结合FileUploadInterceptor最后应该是五个参数了。

观察调用栈发现执行FileUploadInterceptor之后还会调用ParametersInterceptor,可以想到xwork参数绑定,那猜测应该是可以通过参数绑定的形式修改HttpParameters里的属性了。

在ParametersInterceptor的doIntercept打个断点,到这边可以看到这边确实是五个了。

然后进入setParameters可以看到调用newStack.setParameter,这个方法会调用相应的 setter方法。

那是不是可以通过参数绑定直接覆盖

进入ServiceAction可以看到获取出了MyFaceFileName=../test1.jpg。

随后进入到FileUploadInterceptor,由于key相同,MyFaceFileName的值是被覆盖为了111.jpg。

补丁修复的HttpParameters大小写敏感问题,如果此时通过参数绑定传递MyFaceFileName,在上传表单名中传递myFace(inputName+FileName),此时HttpParameters里面是myFaceFileName与MyFaceFileName,这个时候key不一样,可以同时存在于HttpParameters的。

构造如下请求包:

最后获取到了111.jpg而不是../test1.jpg。

原因是由于acceptableParameters是TreeMap,顺序问题大写是在前面的,我们要想覆盖,参数绑定应该传入小写myFaceFileName,表单filename位置传大写。

构造如下数据包:

POST /upload.action?myFaceFileName=../test1.jpg HTTP/1.1Host:Content-Length: 2969Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1g8QtTsJ6IIKRZooUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36Accept: 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.7Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close------WebKitFormBoundary1g8QtTsJ6IIKRZooContent-Disposition: form-data; name="author"------WebKitFormBoundary1g8QtTsJ6IIKRZooContent-Disposition: form-data; name="MyFace"; filename="111.jpg"Content-Type: image/jpeg1111111111111111111111------WebKitFormBoundary1g8QtTsJ6IIKRZoo--

成功穿越到别的目录。

5.修复建议

目前官方已发布新版本修复了此漏洞,请受影响的用户尽快更新进行防护,下载链接:

https://struts.apache.org/download.cgi#struts-ga

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

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

相关文章

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…

ISP代理与双ISP代理的区别

在网络营销、数据采集及隐私保护等领域&#xff0c;代理服务器扮演着至关重要的角色。而在代理服务器的选择中&#xff0c;ISP代理与双ISP代理是两种常见的选择。本文将对这两种代理服务进行详细分析&#xff0c;探讨它们之间的区别以及各自的优势和适用场景。 一、ISP代理概述…

代码规范 —— QMQ 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、代码规范 【1】消费者必须以Consumer结尾&#xff0c;生产者必须以Producer结尾。 【2】选择合适的消费模式&#xff1a;根据业务判断消费模式是集群模式还是广播模式&#xff0c;具体为&#xff1a;MessageConsumerProvider.addListene…

Win系统下使用Docker安装RabbitMQ及延迟插件

Win系统下使用Docker安装RabbitMQ及延迟插件 docker 安装 rabbitmq docker pull rabbitmq:3.12.0-management运行 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 访问 访问 http://localhost:15672/&#xff0c;…

Docker如何删除没有名字或标签的镜像

如下图,这些没有名字和标签的镜像如何删除呢?下面提供删除方法。 1、找出所有没有名字的镜像 docker images -f "dangling=true"2、删除所有没有名字的镜像 当然,你也可以通过镜像的ID去删除它。 docker rmi -f $(docker images -f "dangli

在远程服务器上创建git仓库并ssh连接到github进行管理

1.生成SSH 公钥&#xff0c;keygen放在.ssh中 2.添加公钥到github 3.确保 SSH 密钥被加载到 SSH 代理中 使用 ssh-add 命令将密钥添加到 SSH 代理中&#xff1a; eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa 检查 SSH 代理中是否列出了密钥&#xff1a; ssh-ad…

MySQL运维-分库分表

介绍 问题分析 拆分策略 垂直拆分 水平拆分 实现技术 Mycat概述 介绍 概念介绍 Mycat配置 schema.xml schema标签 schema标签&#xff08;table&#xff09; datanode标签 datahost标签 rule.xml sever.xml system标签 user标签 Mycat分片 分片规则-范围 分片规则-取模 分…

LVS多模式集群攻略!

目录 NAT模式下的lvs集群准备工作具体步骤客户机lvs服务器1服务器2 测试 DR模式下的lvs集群具体流程客户机&#xff1a;路由器LVS服务器1服务器2测试 防火墙标签解决轮询问题LVS持久链接解决方案 NAT模式下的lvs集群 lvs-nat概念&#xff1a;修改请求报文的目标IP,多目标IP的D…

关于RCE

什么是RCE&#xff1f; RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。也就是远程命令执行。命令执行是在目标服务器上任意执行系统命令。它属于高危漏洞之一&#xff0c;也属于代码执行的范畴。命令执行漏洞与…

红外遥控与NEC协议详解

文章目录 红外遥控的基本原理发射装置红外接收器 NEC协议的基础知识编码格式什么是“连发码”&#xff1f;NEC协议中的连发码连发码的工作原理 红外遥控的基本原理 红外遥控器通过发射红外光来传输信息&#xff0c;这种光线在肉眼不可见&#xff0c;但可以被接收设备上的红外接…

Linux 下的进程状态

文章目录 一、运行状态运行队列运行状态和运行队列 二、睡眠状态S状态D状态D状态产生的原因 三、暂停状态T状态t 状态 四、僵尸状态为什么有僵尸状态孤儿进程 一、运行状态 R状态&#xff1a;进程已经准备好随时被调度了。 运行队列 每个 CPU 都会维护一个自己的运行队列&am…

【鸿蒙开发基础学习】组件导航 (Navigation)

组件导航 (Navigation) Navigation 是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation 组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0c;多端部署场景。通过组件级路由能力…

[CSCCTF 2019 Qual]FlaskLight (jinja2模版注入)

两种方法&#xff1a; 1.工具法 进来看见flask到处飘&#xff0c;估计就是ssti ctrlU打开发现两行注释提示GET方式传递参数search 这种有参数的我先直接丢fengjing扫了一下&#xff0c;结果还真搞出来&#xff0c;这工具还是挺牛的&#xff0c;就是没参数的时候搞不了 fengj…

牛客周赛 Round 55 解题报告 | 珂学家

前言 题解 补题这场比赛&#xff0c;好像还是难。 A. 小红的字符串 签到题 枚举最终的字符&#xff0c;求最小的修改 这个方法更有通用性 s input()from math import inf import stringans inf for c in string.ascii_letters:ans min(ans, sum([1 for z in s if z ! c…

【Datawhale X 魔搭 】AI夏令营第四期大模型方向,Task1:智能编程助手(持续更新)

在一个数据驱动的世界里&#xff0c;人工智能的未来应由每一个愿意学习和探索的人共同塑造和掌握。希望这里是你实现AI梦想的起点。 大模型小白入门&#xff1a;https://linklearner.com/activity/14/11/25 大模型开发工程师能力测试&#xff1a;https://linklearner.com/activ…

【前端可视化】 大屏可视化项目二 scale适配方案 g6流程图 更复杂的图表

项目介绍 第二个大屏可视化&#xff0c;整个项目利用scale进行按比例适配。 图表更加复杂&#xff0c;涉及到图表的叠加&#xff0c;mark&#xff0c;地图&#xff0c;g6流程图的能等 始终保持比例适配(本项目方案),始终满屏适配(项目一). echarts绘制较为复杂图表&#xff0…

mysql导入jdbc

每次创建项目都要导入jar包 版本对应 mysql是5xxjdbc也用5xx 下载jdbc.jar包 maven仓库搜索mysql&#xff1a;maven官网 导入jar包 创建lib目录&#xff0c;复制jar包&#xff0c;粘贴到lib当中 导入成功

Android Basis - 密钥和ID认证

书读百遍其义自现&#xff0c;知识点多复习&#xff0c;看到的越多&#xff0c;理解的也越是深刻。也许此时我看到的点是点&#xff0c;十天半个月之后回头看时可能就是新的点或者线了&#xff0c;写博客也是&#xff0c;越写越深刻。 遇到KeyAttestation在gms中的错误 在cts…

Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权

身份验证 身份认证是大多数应用程序的重要组成部分&#xff0c;有很多不同的方法和策略来处理身份认证。 当前比较流程的是JWT 认证&#xff0c;也叫令牌认证&#xff0c;今天我们探讨一下在 Nest.js 中如何实现。 认证流程 客户端将首先使用用户名和密码进行身份认证认证成…

Sql与Rce注入相关漏洞复现

目录 sqli-labs注入第38&#xff0c;48关 第38关&#xff08;单引号闭合&#xff09; ​编辑 第48关 (GET请求-基于错误-盲注-数字型-order by 排序 ​编辑 贷齐乐系统多处Sql注入漏洞 环境搭建 将贷齐乐源码放入phpstudy中的www目录下 在phpstudy上创建网站&#xff1…