<p>漏洞描述</p><p>2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。</p><p>相关链接如下:</p><p>https://cwiki.apache.org/confluence/display/WW/S2-052</p><p>https://lgtm.com/blog/apache_struts_CVE-2017-9805</p><p>补丁分析</p><p>在Struts2官方github上下载最新代码,发现org.apache.struts2.rest.handler这个包下多了几个类文件,分别为AbstractContentTypeHandler、AllowedClasses、AllowedClassNames、XStreamPermissionProvider。如下图所示:</p><p></p><p>XStreamHandler类修改了createXStream方法,同时增加了几个方法,作用是拒绝不安全的类执行。如下图所示:
</p><p></p><p>由补丁可以发现,REST插件将XStream处理的数据进行了处理,在调用“xstream.fromXML(in,target);” 反序列化之前对其进行了检查。</p><p>漏洞分析</p><p> 根据补丁分析,构造相对应的漏洞检测数据包。使用调试工具分析,发现Action经过REST插件处理时会被ContentTypeInterceptor这个类拦截,进入intercept方法如下图所示:</p><p></p><p>Image
</p><p>这个Intercept拦截方法很重要,分三步:</p><p>第一步:getHandlerForRequest方法会判断提交的请求类型,如果是XML的话就交给XStreamHandler调用toObject方法。</p><p>第二步:如果浏览器提交的数据包长度大于0的话就获取其输入流,然后将数据包生成一个InputStreamReader对象也就是reader。</p><p>第三步:调用XStreamHandler的toObject方法将reader数据流进行xml反序列化。</p><p>如下图所示:</p><p></p><p>结合之前对补丁的分析,这里XStream并没有对reader的内容进行验证,导致反序列化漏洞。
</p><p></p><p>
</p><p>漏洞复现</p><p></p><p>Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,可直接在数据包中插入恶意代码,导致服务器被攻陷。漏洞复现如下图所示:</p><p></p><p>可以看到服务器回显错误,但是已经成功执行了系统命令。证明漏洞存在,并且通过远程即可实现攻击。
</p><p></p><p></p><p>受影响版本</p><p></p><p>Apache Struts Version:Struts 2.5 - Struts 2.5.12</p><p></p><p>
</p><p></p><p>规避方案</p><p></p><ul><li><p>升级Struts到2.5.13最新版本</p></li><li><p>在不使用时删除StrutsREST插件,或仅限于服务器普通页面和JSONs
<constantname="struts.action.extension" value="xhtml,,json" /></p></li><li><p>部署启明星辰web应用防火墙http://www.venustech.com.cn/SafeProductInfo/413/39.Html  </p></li></ul><p>本文转自启明星辰adlab公众号</p><p>Image
</p>

最后修改:1970 年 01 月 01 日 08 : 00 AM
如果觉得我的文章对你有用,请随意赞赏