【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

admin 2020年12月11日11:00:27评论30 views字数 2827阅读9分25秒阅读模式

漏洞名称 : Apache  Struts2远程代码执行漏洞(CVE-2020-17530)

威胁等级 高危

影响范围 Apache  Struts 2.0.0 - 2.5.25

漏洞类型 远程代码执行

利用难度 : 中等


漏洞分析


Apache Struts2 组件介绍

Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。


2 漏洞描述

深信服千里目安全实验室在2020年12月08日监测到Apache Struts2存在一个远程代码执行漏洞(S2-061)。Struts2在某些标签属性中使用OGNL表达式时,因为没有做内容过滤,在传入精心构造的请求时,可以造成OGNL二次解析,执行指定的远程代码。攻击者可以通过构造恶意请求利用该漏洞,成功利用此漏洞可以造成远程代码执行。


3 漏洞分析

在Struts2 2.5.26版本的补丁中,主要进行两处修补,如下图。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)
【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

第一处修补,对S2-061漏洞利用的标签属性进行修复。第二处修补,添加了黑名单类。


首先进入org.apache.struts2.views.jsp.ui.AbstractUITag类,重点关注补丁删除的if代码块。If会判断是否开启altSyntax,且判断属性的value是否为表达式。如果条件满足,则将key与赋值后的value写入dynamicAttributes中。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

调用org.apache.struts2.views.jsp.ComponentTagSupport#doStartTag方法进行标签解析,在此方法中调用populateParams,进入父类AbstractUITag的populateParams方法。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

在AbstractUITag#populateParams方法中会调用各种uiBean.set方法对属性进行赋值,最终也会调用uiBean.setDynamicAttributes(dynamicAttributes)方法,对前文选中的动态属性进行赋值。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

最终调用ComponentTagSupport#doEndTag,结束标签的解析。在调用此方法的过程中会调用engine.renderTemplate(context)方法进行模板渲染。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

中间会循环调用visit方法选择模板

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

直接跟进到选择dynamic-attributes.ftl模板进行页面渲染,

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

解析模板中的元素,当解析到<#assign value = struts.translateVariables(keyValue)!keyValue/>时,会调用freemarker.core

.Assignment#accept方法,并在此方法中调用this.valueExp.eval方法,解析env环境变量中的表达式。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

最终通过反射调用org.apache.struts2.util.StrutsUtil#translateVariables方法进行ognl表达式解析。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

综上是S2-061的漏洞的表达式注入过程,接下来分析新版本中新增的黑名单类在ognl表达式payload中的作用。


这里参考Smi1e师傅的文章,选择黑名单类中,与tomcat相关的org.apache.catalina.core.DefaultInstanceManager类进行分析。


基于tomcat服务器启动的struts2框架,在获取的OgnlContext中的ApplicationMap中可以通过org.apache.tomcat.InstanceManager键值,找到对应的org.apache.catalina.core.DefaultInstanceManager类。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

DefaultInstanceManager类中存在newInstance方法,利用此方法可以执行任意类中的无参构造方法。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

同时,存在一个org.apache.commons.collections.BeanMap类,通过调用setBean方法,将传入的对象作为bean。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)
【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

通过调用BeanMap#get(Object name)方法,执行bean中的get方法

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

通过上述无参构造方法的类的实例化方法,以及类中get方法的调用。可以构造利用链,调用com.opensymphony.xwork2.ognl.OgnlValueStack#getContext方法,获取OgnlContext。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)
【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

获取到OgnlContext对象后,可以继续调用该对象中的get方法,这里通过调用getMemberAccess方法,获取_SecurityMemberAccess对象。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)
【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

此时可以通过模拟Struts2 2.5.2版本的payload,将黑名单清空。最终调用黑名单的类,进行RCE。


4 漏洞复现

搭建Struts 2.5.25版本的环境,运行sniper,填写表单信息,点击Attack,效果如图。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)


影响范围


目前受影响的Apache Struts2版本:

Apache Struts 2.0.0 - 2.5.25


解决方案


1 修复建议

目前厂商已发布升级补丁修复漏洞,请受影响用户及时更新官方补丁。官方链接如下:

https://github.com/apache/struts


2 深信服解决方案

深信服下一代防火墙】可轻松防御此漏洞, 建议部署深信服下一代防火墙的用户更新至最新的安全防护规则,可轻松抵御此高危风险。
深信服云盾】已第一时间从云端自动更新防护规则,云盾用户无需操作,即可轻松、快速防御此高危风险。
深信服安全感知平台】可检测利用该漏洞的攻击,实时告警,并可联动【深信服下一代防火墙等产品】实现对攻击者ip的封堵。
深信服安全运营服务】深信服云端安全专家提供7*24小时持续的安全运营服务。对存在漏洞的用户,检查并更新了客户防护设备的策略,确保客户防护设备可以防御此漏洞风险。


时间轴


2020/12/08 Apache Struts2官方披露该漏洞

2020/12/08 深信服千里目安全实验室检测该漏洞并发布漏洞安全通告

2020/12/10 深信服千里目安全实验室分析复现漏洞,发布漏洞分析文章,并发布产品解决方案


参考链接


https://github.com/apache/struts


点击阅读原文,及时关注并登录深信服智安全平台,可轻松查询漏洞相关解决方案。

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

深信服千里目安全实验室

【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。

● 扫码关注我们

本文始发于微信公众号(深信服千里目安全实验室):【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年12月11日11:00:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)https://cn-sec.com/archives/200430.html

发表评论

匿名网友 填写信息