PKAV 发现 Struts2 最新远程命令执行漏洞(S2-037)
2016-06-23 18:19
791 查看
0x00 前言
刚过完儿童节回来发现struts2 出了S033,于是放下手中的棒棒糖赶紧分析一下。
0x01 S2-033 漏洞回顾
先来回顾一下S033根据官方描述
很明显有两个关键点:第一个是REST Plugin,另一个是Dynamic Method Invocation is enabled.(也就是开启动态方法执行),看到这里需要满足两个条件,感觉有点鸡肋啊……
直接下载回来源代码调试,载入官方的演示包struts2-rest-showcase.war,我们先随便访问一个连接
/struts2-rest-showcase/orders/1,很快定位到关键代码
Rest-plujin包里面的
org.apache.struts2.rest.RestActionMapper
首先要过第一关:dropExtension,这个方法会检查后缀名
其中extensions的值来自配置文件struts-plugin.xml,默认是:
因此要想通过检查我们需要构造一个.xhtml、.xml或者.json结尾的URL,或者没有后缀直接是xx/xx,这就不能使用”.”这显然是不行的。
继续往下调试:
就是说如果刚才的链接里面出现了!就进入下面的流程直接得到一个!后面的值,然后没有过滤直接放在了mapping里面
构造链接:
/struts2-rest-showcase281/orders/3/1!{xxx}
在加上前面有一个allowDynamicMethodCalls的判断,几乎可以肯定漏洞点就是在这儿,继续往下走,最终method会进入到,com.opensymphony.xwork2.DefaultActionInvocation类的invokeAction方法,如下图
我们看到methodName直接进入到了ognlUtil.getValue方法,对struts2历史漏洞有点熟悉的同学都知道,这个就是最终导致代码执行的地方。不多说,直接上POC:
0x02 绕过动态方法执行的限制
但是如果真的只是这样这个漏洞真的是比较鸡肋的,因为动态方法在这里默认是不开启的,那我们接着分析,有没有可能不用开动态方法都可以执行任意代码了,答案是肯定的。这个地方能不能代码执行主要是这个地方的限制其实只要我们继续往下走,会发现其他地方也会mapping.setMethod代码如下
其实无非就是:
难道官方是这样修复的,改了检查方法执行的方法checkEnableEvalExpression,这个方法是在request.xx(x)这种代码执行的方式后加入的判断,主要是为了杜绝参数名上面的代码执行,不过好在这个地方我们不需要这种方式执行代码。经过研究我还是通过三目运算符绕过了这个检测,POC:
6月3号的时候我给struts2官方提交了这个新的高危漏洞(CVE编号CVE-2016-4438),影响所有使用了REST插件的用户,无需要开启动态方法执行(不包括struts 2.5),此后的几天网上不断有关于s2-033的分析与绕过出来,但是他们大都错误的认为需要开启动态方法执行才能触发漏洞,其实并不需要。正如官方回复这个漏洞说的
去掉了with ! operator when Dynamic Method Invocation is enabled这句话,因此这个漏洞影响更为广泛。
0x03 修复建议
在上一个版本里面也是method出的问题,当时是加入了cleanupActionName方法进行过滤,如果这个地方要修复,也可以加入这个方法过滤一下即可。更新至官方struts 2.3.29在线检测:http://www.pkav.net/tool/struts2/index.php
参考:https://cwiki.apache.org/confluence/display/WW/S2-037
©乌云知识库版权所有 未经许可 禁止转载
收藏
分享
为您推荐了适合您的技术文章:
Joomla 对象注入漏洞分析报告安卓Bug 17356824 BroadcastAnywhere漏洞分析
CVE-2016-1779技术分析及其背后的故事
JBoss安全问题总结
渗透小兵 2016-06-17 14:34:28
分析的很有帮助,最近被struts2搞的不行,不知道怎么堵啊
回复
jamesj 2016-06-17 10:39:13
围观
回复
Budi 2016-06-17 08:59:53
后排围观
回复
zds 2016-06-16 22:36:30
@末影人 发乌云上署名就是wooyun了,就不是pkav了。
回复
香草 2016-06-16 21:19:50
@末影人 好有道理
回复
gainover 2016-06-16 20:08:04
赞~~,期待下一发
回复
rainiam 2016-06-16 19:59:12
恭喜pkav香草成为struts CVE背后的又一位男人
回复
末影人 2016-06-16 19:12:32
这个漏洞为什么不发到乌云上,会有通用奖励的啊。
回复
老曹哥哥 2016-06-16 16:35:44
前排
回复
cooFool 2016-06-16 15:09:35
这真是写的最有逻辑一篇分析,不像别的分析,乱扯一通一个易得就出来了,跟做数学似的,我怎么知道你怎么得出来的。
回复
娃哈哈 2016-06-16 14:58:28
@香草 兄弟,你这文章是当天发当天录用的么。还是隔了几天,我的发好几天了也没动态啊
回复
香草 2016-06-16 14:42:51
多谢指正,是2.5 ,手残打错字
回复
angelwhu 2016-06-16 14:31:14
不包括struts 2.25 应该是2.5
回复
Rainism 2016-06-16 14:30:55
犀利 洞中洞
回复
Mel0d6y 2016-06-16 14:11:07
犀利啊 洞中洞
回复
欧冠狂魔阿森纳 2016-06-16 13:56:46
2.3.28.1 也能被日?
回复
mickey 2016-06-16 13:53:23
牛逼~~
相关文章推荐
- 2016.6.23笔记(2)-本地配置
- spring定时任务.线程池,自定义多线程配置
- Java中的byte[]/char[]/int/String数据类型转换
- JAVA 数组的初始化
- Struts2跳转结果页时没有css样式或图片的问题
- Java synchronized的使用
- 触发Full GC执行的情况
- RxJava 学习笔记(二)
- Spring声明式事务管理与配置介绍
- java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 异常处理,及MySQL数据库编码设置
- 浅析Java中的final关键字
- java中将一个字符数组赋值给另一个,两者同时变化
- Spring MVC程序中怎么得到静态资源文件css,js,图片文件的路径问题
- JAVA实现DES加密实现详解
- javaweb中文件上传下载示例
- JS加密Java解密报rsa bad argument
- Spring MVC程序中得到静态资源文件css,js,图片
- java.io.File中的pathSeparator与separator的区别
- spring ioc 原理 spring aop原理
- java反射机制