• 本文作者: 漏洞应急响应中心
  • |
  • 2016年6月17日
  • |
  • 漏洞分析
  • |

apache struts2 最新s2-037漏洞分析

天融信阿尔法实验室  李喆  张萌 李明政

 

最近struts2又爆出了一个新的远程命令执行漏洞s2-037,CVE编号为CVE-2016-4438,天融信阿尔法实验室第一时间跟进了该漏洞,并搭建了相应环境对漏洞进行了复现和分析。

1 struts2 s2-037远程代码执行漏洞介绍

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

https://cwiki.apache.org/confluence/display/WW/Security+Bulletins

2 struts2 s2-037漏洞详情分析

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

首先看看033触发过程

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

这和032没区别

033问题出现在rest插件中RestActionMapper.java中

问题出在中

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

没有做过滤1

没有做过滤2

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

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

通杀所有rest插件

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

又调用了

同时看到这里没有判断

看到这里没有判断

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

同时也在这里

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

绕过测试结果如下2

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

Poc:

poc

目前官方已经在该页面给出了公告。

https://cwiki.apache.org/confluence/display/WW/S2-037

详细的公告

受影响的用户请尽快升级您的版本到2.3.29。

Written by 漏洞应急响应中心