转载Struts2 S2-052 RCE分析与利用

Posted 金融本部陆吾安全实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载Struts2 S2-052 RCE分析与利用相关的知识,希望对你有一定的参考价值。


漏洞描述


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方法,同时增加了几个方法,作用是拒绝不安全的类执行。如下图所示:

【转载】Struts2 S2-052 RCE分析与利用

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


漏洞分析


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


【转载】Struts2 S2-052 RCE分析与利用

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

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

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

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

如下图所示:


【转载】Struts2 S2-052 RCE分析与利用


结合之前对补丁的分析,这里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





本文转自启明星辰ADAlab发布预警,可点击阅读原文查看

以上是关于转载Struts2 S2-052 RCE分析与利用的主要内容,如果未能解决你的问题,请参考以下文章

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

Struts2 S2-052 RCE简单测试

转载网防G01 完美狙击Struts2 (S2-052/046/045) 漏洞利用

安全通告|Struts2(S2-052)远程命令执行漏洞

漏洞分析Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052) 分析报告