专栏首页FreeBufStruts2 s2-032远程代码执行分析

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

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. 漏洞分析

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

<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)

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 钓鱼邮件中的Remcos RAT变种分析

    7月份,我们发现了一个伪装成新订单通知的钓鱼邮件,里面带有一个恶意附件,会导致Remcos RAT(被Trend Micro检测为BKDR_SOCMER.SM)...

    FB客服
  • 漏洞预警 | Apache Struts2 曝任意代码执行漏洞 (S2-045,CVE-2017-5638)

    ? FreeBuf上次曝Struts 2的漏洞已经是半年多以前的事情了。 这次的漏洞又是个RCE远程代码执行漏洞。简单来说,基于Jakarta Multipa...

    FB客服
  • XCTR-Hacking-Tools:一款多合一功能的信息收集工具

    除此之外,你还可以在设置区域中更新用户代理以及代理信息,或者更新URL、代理、项目名、字典和线程数等等。

    FB客服
  • Struts2 s2-032远程代码执行分析

    1. 介绍: Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的St...

    安恒信息
  • 如何在两台linux服务器之间用RSA键对的方法SSH/SCP不需密码

    1。 分别从A和B上登录作为root后运行ssh-keygen,目的是简单地在/root下创建目录.ssh,当提示输入passphase时打入两次回车。 ...

    梦_之_旅
  • 使用 Node.js 和 Express.js 搭建简易 HTTP/2 服务器

    自从 1975 年左右使用 TCP/IP 协议的现代互联网诞生至今已经过了惊人的41年了。在它生涯的大部分时间里,我们使用 HTTP 以及它的继任者 HTTP/...

    疯狂的技术宅
  • TensorFlow函数:tf.Session()和tf.Session().as_default()的区别

    对于run()方法也是一样,如果想让默认会话在退出上下文管理器时关闭会话,可以调用sess.close()方法。

    于小勇
  • winscp 通过 ssh 连接 ubuntu on windows

      写在前面: 用户升级到 Windows 10 秋季创意者版 Build 16190 及以上,就可以在windows store应用商店下载和安装 Ubunt...

    企鹅号小编
  • Ubuntu 常用命令

    1、查看Linux当前操作系统位数   sudo uname --m   如果显示 i686,你安装了32位操作系统   如果显示 x86_64,你安装了64位...

    随机来个数
  • 开源和SD-WAN革命的交汇点:西班牙电信打响2020 SD-WAN开源第一枪

    近日,西班牙电信企业创新中心和投资部门Wayra Germany宣布投资flexiWAN。

    SDNLAB

扫码关注云+社区

领取腾讯云代金券