前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Struts2 s2-032远程代码执行分析

Struts2 s2-032远程代码执行分析

作者头像
FB客服
发布2018-02-08 10:20:27
5370
发布2018-02-08 10:20:27
举报
文章被收录于专栏:FreeBufFreeBuf

1. 介绍

Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与 ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

4月15号安恒安全研究院在Struts 2上发现了一个严重的远程代码执行漏洞(CVE-2016-3081)

2. 漏洞分析

前提:开启动态方法调用。

代码语言:javascript
复制
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

假如动态方法调用已经开启,然后我们要调用对应的login方法的话 我们可以通过http://localhost:8080/struts241/index!login.action来执行动态的方法调用。这种动态方法调用的时候method中的特殊字符都会被替换成空,但是可以通过http://localhost:8080/struts241/index.action?method:login来绕过无法传入特殊字符的限制。

接收到的参数会经过处理存入到ActionMapping的method属性中。DefaultActionProxyFactory将ActionMappping的method属性设置到ActionProxy中的method属性(虽然做了escapeEcmaScript,escapeHtml4过滤,但是我们可以通过变量传递方式绕过,具体可以参考poc)。如下图

而DefaultActionInvocation.java中会把ActionProxy中的method属性取出来放入到ognlUtil.getValue(methodName + “()”, getStack().getContext(), action);方法中执行ognl表达式,如下图

3. 沙盒绕过

通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,这样就可以绕过SecurityMemberAccess的限制。

4. poc

a. 测试环境

b. 结果

修复方案

升级至struts 2.3.20.2,struts 2.3.24.2, struts 2.3.28.1

* 参考原文,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 介绍
  • 2. 漏洞分析
  • 3. 沙盒绕过
  • 4. poc
  • 修复方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档