启明星辰ADLab:Struts2 S2-052 RCE分析与利用

2017-09-06 07:08:48 启明星辰 ADLab



更多资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)


漏洞描述

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最新版本

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

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