Struts2 系列漏洞 - S2-001

一、前言

Struts2 是较早出现实现 MVC 思想的 java 框架。struts2 在 jsp 文件中使用 ognl 表达式来取出值栈中的数据。 struts 标签与 ognl 表达式的关系类似于 jstl 标签与 el 表达式的关系。[故在 jsp 文件中需引入 struts 标签库]

# 二、概述

S2-001 漏洞由于在其解析 jsp 文件的标签数据时,官方举例是 form 标签的 textfield 数据中,在验证表单出错时,页面再次回到验证出错页面,这时如果开启了 altSyntax (默认开启)且为字符串类型时, struts2 会对标签中的数据在值栈中自栈顶向栈底找与表单 name 名同名的属性值进行 ognl 表达式解析并显示。故在表单中输入形如 %{…} (代码逻辑中根据此形式截取字符串来获取表达式)将会对其中的表达式进行解析。

官方链接: https://cwiki.apache.org/confluence/display/WW/S2-001

影响版本: WebWork 2.1 (with altSyntax enabled), WebWork 2.2.0 - WebWork 2.2.5, Struts 2.0.0 - Struts 2.0.8

image.png

默认开启 altSyntax

# 三、复现

环境:apache-tomcat-9.0.37 、 jdk1.8.0_261 、 struts 2.0.1

坑点:

  • ○ 进行表单验证时 500 报错: java.lang.NoClassDefFoundError: org/apache/struts2/spi/RequestContext ,加入 struts2-api 的 jar 包即可解决。
  • ○ 找不到 struts-default.xml ,在 Project Structure 的 Facet 中 File Set 编辑并引进来。

1、首先创建一个 struts2 的项目 … (其实网上有,就不贴图了)

2、结构如下图,在 WEB-INF 下创建 lib ,将六个 jar 包复制过来,并将其 Add as Library ,在 Project Structure 的 Artifacts 将其 put into output root 即可。 

image.png

3、在 index.jsp 中添加一个 struts 的 form 标签。 

image.png

4、修改 struts.xml 文件。如下图,验证出错重新回到 index.jsp ,成功则进入 welcome.jsp 

image.png

5、LoginAction.java :默认会执行 execute 方法,有 username 、 password 两个属性(和 jsp 文件中表单的 name 保持一致)同时配置其各自的 set 、get 方法( struts 都是通过反射去获得或设置属性值) 

image.png

6、welcome.jsp 

image.png

7、运行 

image.png

 

image.png

# 四、分析

首先在进入到 LoginAction 之前,会由 FilterDispatcher 创建一个 ActionProxy 根据 struts.xml 中的配置找到处理该请求的 Action ,接着默认会执行 18 个拦截器,在拦截器中初始化值栈,将 Action 相应参数值压入栈。进入 Action 后根据逻辑返回对应视图。

这里在表单验证出错后返回 index.jsp 页面,而此时的 username 、 password 已压入栈中,在将其取出时若开启了 altSyntax 则进行递归解析。

在解析的过程中,会调用 ComponentTagSupport 的 doStartTag 及 doEndTag 方法对标签内容进行解析,在解析到表单中 name 为 username 的数据时,首先获取到 username 在值栈中的值。 

image.png

返回给 com.opensymphony.xwork2.util.TextParseUtil#translateVariables 中的 o ,而此时的 o 将再次作为表达式传入 translateVariables 方法中进行解析(他的循环条件为 true )。 

image.png

再次进入 findValue 方法,进行解析 

image.png

最终在 ognl.Ognl#getValue 中得到结果值。 

image.png

image.png

# 五、修复

官方建议:升级到 Struts 2.0.9 / XWork 2.0.4

关键代码:设置最大循环解析次数为 1 次,通过最开始的 %{…} 找到表单的属性值后,不再往下循环解析。不再往下循环解析是通过 pos 变量来控制下次从哪个索引开始检索表达式,当前属性值已经解析一次,pos 值则设置为当前属性值的长度,故解析了一次的表达式不再解析第二次。 

image.png

image.png

# 疑问???

• 除了 form 标签可以解析 ognl 表达式之外,其他标签是不是也可以解析 ognl 表达式。在业务功能上体现的话就是可由用户输入,且将其用户输入再次呈现的地方。

• 为什么漏洞修复不能直接在 拦截器 的步骤中将用户输入的 形如 %{} 的表达式直接剔除

  • ○ 这里直接转发到 index.jsp 页面不由 struts2 接收请求,故不能在拦截器层面将其拦截。

  • ○ 提出这个问题是因为觉得这种修复应该在没进入正式业务前做,比如这里的拦截器层面。但是后来细想还是有很多不妥。上面回答的点也有些不妥,因为最开始进入到 LoginAction 是可以进行拦截的。而后面对 index.jsp 中的标签进行解析时出现问题。ojz

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arduino ESP8266模块TFT液晶屏

ESP8266模块 模块实物图: 模块引脚定义: 工作模式选择: FlashBoot启动模式: GPIO15接GND UART固件下载模式: GPIO15接GND, GPIO0接GND 调试串口: URXD/UTXD 可用来下载固件和调试信息输出 模块使能&…

安装源码moveit遇到的问题

文章目录 问题1、 在操作 rosdep update 时报超时错误问题2、E: 仓库 “http://mirrors.ustc.edu.cn/ros/ubuntu focal Release” 没有 Release 文件问题3、卸载ompl问题4、安装moveit 问题1、 在操作 rosdep update 时报超时错误 出现 访问 https://raw.githubusercontent.com…

【官方文档解读】torch.jit.script 的使用,并附上官方文档中的示例代码

由 OpenMMLab 的部署教程 所述,对于模型中存在有控制条件的(如 if,for 等),需要用 torch.jit.script 而非采样默认的 torch.jit.trace 方法。本文则详细介绍了下官方文档中对 torch.jit.script 的解释和示例代码。 to…

SemiDrive X9H 平台 QT 静态编译

一、 前言 芯驰 X9H 芯片,搭载多个操作系统协同运行,系统实现了仪表、空调、中控、副驾多媒体的四屏驱动控制,在人车智能交互上可以通过显示屏、屏幕触摸控制、语音控制、物理按键控制、车身协议的完美融合,使汽车更智能。让车主…

“论软件系统建模方法”必过范文,突击2024软考高项论文

论文部分 摘要 2023年03月,我参与了某艺术品公司线上拍卖管理平台的研发。该项目的目标是建立一个互联网在线拍卖平台,用户可以通过手机或PC浏览器进入拍卖平台,对喜欢的拍品进行参拍出价。平台提供了在线支付、在线出价、保证金管理、拍品…

通信技术信号源硬件实验

定义 1.RZ码(归零码) RZ编码也成为归零码,归零码的特性就是在一个周期内,用二进制传输数据位,在数据位脉冲结束后,需要维持一段时间的低电平。 2.NRZ码(不归零编码) NRZ编码也成为…

AVL树的介绍与实现

前言 我们上一期介绍了二叉搜索树并做了实现,本期我们来继续学习另一个更优的树即AVL树! 本期内容介绍 什么是AVL树? AVL树的实现 AVL树的性能分析 在正式的介绍AVL树之前,我们先来回忆一下二叉搜索树的特点:左子树的…

nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)

文章目录 写在前面nnUNet是什么?一、配置虚拟环境二、安装nnUNet框架1.安装nnUNet这一步我遇到的两个问题: 2.安装隐藏层hiddenlayer(可选) 三、数据集准备nnUNet对于你要训练的数据是有严格要求的,这第一点就体现在我…

pushowl | 运用分销裂变模式实现业绩快速增长

一、公司简介 PushOwl公司是一家专注于为电子商务商店提供在线营销工具的印度初创企业。以下是对PushOwl公司的详细介绍: 基本信息: 所属公司:Creatorbox Softwares Private Limited 成立日期:2018年 所属地:印度 …

103.网络游戏逆向分析与漏洞攻防-ui界面的设计-加速功能的开关设计

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

RDMA (1)

RDMA是什么 Remote Direct Memory Access(RDMA)是用来给有高速需求的应用释放网络消耗的。 RDMA在网络的两个应用之间进行低延迟,高吞吐的内存对内存的直接数据通信。 InfiniBand需要部署独立的协议。 RoCE(RDMA over Converged Ethernet),也是由InfiniBand Trade Associat…

【吊打面试官系列】Java高并发篇 - Java 线程数过多会造成什么异常?

大家好,我是锋哥。今天分享关于 【Java 线程数过多会造成什么异常?】面试题,希望对大家有帮助; Java 线程数过多会造成什么异常? 1、线程的生命周期开销非常高 1000道 互联网大厂Java工程师 精选面试题-Java资源分享…

postman教程-12-保存请求至Collections

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了Postman管理环境的方法,本小节我们讲解一下Postman保存请求至Collections集合的方法。 1、创建Collection 在保存Request请求之前,先创建一个Collection(集合)&#…

【网络编程开发】1.网络结构 2.IP地址与端口号 3.字节序

网络编程开发 两台计算机要互相传送文件需解决很多问题: 必须有一条传送数据的通路。发起方必须激活通路。要告诉网络如何识别接收方。发起方要清楚对方是否已开机,且与网络连接正常。发起方要清楚对方是否准备好接收和存储文件。若文件格式不兼容&…

藏品名称:龙凤呈祥摆件

藏品名称:龙凤呈祥摆件 规格:重约 14.3Kg 藏品类别:杂项 此器身布满繁缠纹饰。器表为一轮红日出于东方,照耀辽阔江海。红日旁边有两点黄金凸显其尊贵。一神龙首尾相接有祥云伴随,大山脚下栖息着一只凤凰与神龙遥相呼应。龙身和龙尾交接处有花和花蕊,花开富贵象征着吉祥。整个…

Esxi的安装问题处理: Failed to verify signatures of the following vib(s)

前言 在安装esxi的时候报错 如下图: 自己在安装过程中遇到点问题 Failed to verify signatures of the following vib(s) 一番查找,只要在bios里面关闭 Security boot 就可以解决 Prepping an ESXi 6.7 host for Secure Boot – Mike Foley

9.抽象类和接口

抽象类 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 比如: 我…

Linux网络-自定义协议、序列化和反序列化、网络计算服务器的实现和Windows端客户端

文章目录 前言一、自定义协议传结构体对象 序列化和反序列化什么是序列化?反序列化 二、计算器服务端(线程池版本)1.main.cc2.Socket.hpp3.protocol.hpp4.Calculator.hpp5.serverCal.hpp6.threadPool.hpp7.Task.hpp8. log.hpp 客户端Windows客…

PS插件一键轻松搞定电商产品摄影图!

在电商行业中,一张高质量的产品摄影图往往能够吸引更多潜在消费者的目光,从而增加产品的销量。然而,对于许多电商卖家和摄影师来说,后期处理产品图片却是一个既耗时又费力的工作。 最近我发现一款PS插件可以一键生成电商产品摄影…

品牌舆情监测系统是什么?怎么监测?

品牌形象与口碑对于企业的重要性不言而喻,品牌舆情监测系统应运而生,成为企业守护品牌声誉的利器。品牌舆情监测系统是什么?怎么选择合适的舆情监测系统?接下来伯乐网络传媒就给大家分享一下。 一、品牌舆情监测系统的应用价值 1…