专栏名称: 深信服千里目安全实验室
深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。
目录
相关文章推荐
丁香生活研究所  ·  比跑步还伤膝盖的动作,第一个你正在做! ·  3 天前  
广东疾控  ·  冰箱里冻了一年的肉,到底还能不能吃? ·  3 天前  
51好读  ›  专栏  ›  深信服千里目安全实验室

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

深信服千里目安全实验室  · 公众号  ·  · 2020-12-11 10:00

正文

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

威胁等级 : 高危

影响范围 : Apache  Struts 2.0.0 - 2.5.25

漏洞类型 : 远程代码执行

利用难度 : 中等


漏洞分析


1 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版本的补丁中,主要进行两处修补,如下图。

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


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

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

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

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

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

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

解析模板中的元素,当解析到时,会调用freemarker.core

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

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

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


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


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

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

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

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

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

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

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


4 漏洞复现

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


影响范围


目前受影响的Apache Struts2版本:

Apache Struts 2.0.0 - 2.5.25


解决方案


1 修复建议

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

https://github.com/apache/struts


2 深信服解决方案

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


时间轴







请到「今天看啥」查看全文