作者:启明星辰ADLab

漏洞描述

2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

相关链接如下:

https://cwiki.apache.org/confluence/display/WW/S2-052 https://lgtm.com/blog/apache_struts_CVE-2017-9805

补丁分析

在Struts2官方github上下载最新代码,发现 org.apache.struts2.rest.handler 这个包下多了几个类文件,分别为AbstractContentTypeHandler、AllowedClasses、AllowedClassNames、XStreamPermissionProvider ,如下图所示:

XStreamHandler类修改了createXStream方法,同时增加了几个方法,作用是拒绝不安全的类执行。如下图所示:

由补丁可以发现REST插件将XStream处理的数据进行了处理,在调用 “xstream.fromXML(in, target);” 反序列化之前对其进行了检查。

漏洞分析

根据补丁分析, 构造相对应的漏洞检测数据包。使用调试工具分析,发现Action经过REST插件处理时会被ContentTypeInterceptor这个类拦截,进入intercept方法如下图所示:

这个Intercept拦截方法很重要,分三步:

第一步:getHandlerForRequest方法会判断提交的请求类型,如果是XML的话就交给XStreamHandler调用toObject方法

第二步:如果浏览器提交的数据包长度大于0的话就获取其输入流,然后将数据包生成一个InputStreamReader对象也就是reader

第三步:调用XStreamHandler的toObject方法将reader数据流进行xml反序列化。

如下图所示:

结合之前对补丁的分析,这里XStream并没有对reader的内容进行验证,导致反序列化漏洞。

漏洞复现

Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,可直接在数据包中插入恶意代码,导致服务器被攻陷。漏洞复现如下图所示:

可以看到服务器回显错误,但是已经成功执行了系统命令。证明漏洞存在,并且通过远程即可实现攻击。

受影响的版本

Apache Struts Version:Struts 2.5 - Struts 2.5.12

规避方案

  • 升级Struts到2.5.13最新版本。

  • 在不使用时删除Struts REST插件,或仅限于服务器普通页面和JSONs <constant name="struts.action.extension" value="xhtml,,json" />

  • 部署启明星辰web应用防火墙 http://www.venustech.com.cn/SafeProductInfo/413/39.Html


启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员。截止目前,ADLab通过CVE发布Windows、Linux、Unix等操作系统安全或软件漏洞近300个,持续保持亚洲领先并确立了其在国际网络安全领域的核心地位。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/383/