天融信阿尔法实验室 李喆 张萌 李明政
最近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没区别
033问题出现在rest插件中RestActionMapper.java中
在getMapping方法中,在处理动态代码执行过程中设置的属性没有做过滤
因为在uri中的!后面的属性加入到了mapping中,然后如果开启了动态代码执行,也就是allowDynamicMethodCalls开启,最后method会进入到com.opensymphony.xwork2.DefaultActionInvocation类的invokeAction方法,之后的就是跟032一样了,可以参考之前的我们分析struts2漏洞的文章。
接下来看看037怎么绕过开启动态方法,通杀所有rest插件的。
在调用完handleDynamicMethodInvocation(mapping, mapping.getName());后面又调用了
同时看到这里没有判断
所以这个地方不需要开启动态执行,同时也在这里给出了提示
这里加上了三目运算符才绕过测试结果如下:
可以看到成功执行了system命令。
Poc:
目前官方已经在该页面给出了公告。
https://cwiki.apache.org/confluence/display/WW/S2-037
受影响的用户请尽快升级您的版本到2.3.29。