当前位置: 首页 >> 正文
Apache Struts 2任意代码执行漏洞通告
作者: 发布时间:2016-04-27 23:47:33  来源: 

1 漏洞简要说明
Apache Struts 2 远程代码执行漏洞(S2-032)

日期
2016-4-26

严重性
高危


影响版本
Struts 2.0.0 - Struts Struts 2.3.28(except 2.3.20.2 and 2.3.24.2)
 


2 漏洞成因
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的变化很小。  

今天有安全研究员在Struts 2上发现了一个严重的远程代码执行漏洞(CVE-2016-3081),所以Struts 2的开发者和用户都应该知晓此漏洞,以防被不法企图者恶意利用。  


3 漏洞|事件危害
前提:开启动态方法调用。

假如动态方法调用已经开启,然后我们要调用对应的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的限制。
a. 测试环境:

b. 结果:

网页poc执行测试结果


4 处置意见
提醒用户及时下载补丁更新,避免引发漏洞相关的网络安全事件。
修复建议
关闭动态方法调用:  
<constantname=“struts.enable.DynamicMethodInvocation” value=“false”/>  
升级至(升级前备份) struts 2.3.20.2,struts 2.3.24.2,struts 2.3.28.1
5 参考资料
http://struts.apache.org/docs/s2-032.html 

上一条:关于校园邮箱收到诈骗邮件的说明 下一条:公安机关网安部门提醒:八种行为易造成个人信息泄漏

关闭

联系方式:大学城校区(65910140 | 65910170) 沙坪坝校区(65362042)  投诉(65914444)
重庆师范大学信息技术中心版权所有
COPYRIGHT©1999-2020 CSITC.  ALL RIGHTS RESERVED