XStream是一个基于Java库,可以将Java工具序列化为XML,反之亦然。

2020年,Xstream有两个影响对照大的高危破绽被爆出:CVE-2020-26217远程代码执行破绽与CVE-2020-26259随便文件删除破绽。纵观两个破绽,他们泛起的缘故原由与机制上极其相似,因此我们在这里放到一块来剖析。

明了poc

首先把CVE-2020-26217与CVE-2020-26259的poc放到一起对照下:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第1张

从上图两个破绽poc的对比上来看:二者行使链前半部门都是一样的,只有中心is元素的class属性值差别:其中一个为java.io.SequenceInputStream而另一个为com.sun.xml.internal.ws.util.ReadAllStream$FileStream。

因此,我们可以先从他们相同部门的挪用链入手剖析,等到了他们分歧之处,我们再分开来剖析。在剖析破绽之前,我们需要搞明了poc中的元素以及其属性到底代表什么意思。

由于poc是个xml花样,我们一层层来剖析这个xml。首先把poc元素折叠起来,看看entry元素中包罗的元素内容,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第2张

entry元素中包罗了jdk.nashorn.internal.objects.NativeString与string两个元素

上图这样的结构代表什么意思呢?又是怎么天生的呢?

我们内陆做了一个demo,看一下下面的例子:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第3张

在这个demo中,HashMap的key为一个Person工具,而value为String类型”test”

Xstream将这个map输出为下图形式

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第4张

让我们对比一下poc与我们测试demo

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第5张

从我们的demo与现实poc两个例子可以看出:在Xstream将Map天生xml花样数据时,会为每个Entry工具天生一个<entry>…</entry>元素,并将该Entry中的key与value作为其子元素顺次放置于其中第一个和第二个元素处。因此我们可以通过这个特点推断出,poc中jdk.nashorn.internal.objects.NativeString与string两个元素实在就是该Entry的key与value。此外,我们转头看一下我们的demo

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第6张

从上图可见:在天生xml时,我们为Person工具赋值的name(“kumamon”)与age(3)属性值成为了Person工具节点(<person>…</person>)的子元素(<name>…</name>、<age>…</age>)

因此可以推断,当一个java工具通过Xstream天生xml时,其结构应遵照如下结构:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第7张

转头看一下我们的poc,我们再睁开一级看看

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第8张

通过上文的明了,上图poc可以明了为一个map聚集,其中存在key为jdk.nashorn.internal.objects.NativeString工具、value值为test的Entry。而jdk.nashorn.internal.objects.NativeString工具又存在flags、value属性,它的flags属性值为0、value属性值为com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data

在弄明了poc结构之后,我们来调试下poc的剖析的历程

Xstream程序在剖析xml时遇到Map结构后,会新建了一个map并将xml中key-value对取出并put入其中,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第9张

上图key值即为poc中Entry内key值(NativeString工具),而values则为Entry中value(test字符串)

凭据map的原理可知:map在put key操作时需要获取key的hash值。因此程序挪用了jdk.nashorn.internal.objects.NativeString的hashCode方式,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第10张

从上图可见,程序挪用了getStringValue方式,我们跟入这个方式,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第11张

在这个方式中,程序将判断this.value是否为String实例,并实验挪用this.value.toString方式

经由上文对poc的剖析,此时的this.value实在就是<jdk.nashorn.internal.objects.NativeString>

…</jdk.nashorn.internal.objects.NativeString>元素中的value子元素值,攻击者可以通过xml中NativeString元素的value子元素控制。在官方给出的poc中,将value值组织为com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data类。见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第12张

因此,此时this.value为com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data。程序挪用Base64Data类的toString方式,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第13张

Base64Data类中toString方式首先挪用了其自身的get方式,跟入get方式中,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第14张

剖析上图代码:this.dataHandler.getDataSource().getInputStream();将其拆分来看:

  1. 首先程序执行this.dataHandler.getDataSource(),即是获取Base64Data工具中dataHandler属性的DataSource值。Base64Data的dataHandler属性值以及dataHandler的dataSource属性值都可以在xml中设置。poc中将dataSource设置为:com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource。因此this.dataHandler.getDataSource()获取的值为:com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource
  2. 随后程序执行com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource类的getInputStream方式,这将获取com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSourc的is属性值

CVE-2020-26217与CVE-2020-26259两个POC中设置的DataSource的is属性值差别,这将导致两个破绽进入了差别的挪用链。我们先来看看CVE-2020-26217

CVE-2020-26217

我们来看看CVE-2020-26217 的poc中DataSource元素包罗的is元素是什么

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第15张

通过上图可见,poc中组织的is值为java.io.SequenceInputStream

,

皇冠APP下载

:www.huangguan.us是一个提供皇冠 *** APP下载、皇冠会员APP下载、皇冠体育最新登录线路、新2皇冠网址的的体育平台。新皇冠体育官网是多年来值得广大客户信赖的平台,我们期待您的到来!

,

随后,程序将is变量传入readFrom方式中,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第16张

readFrom方式实现如下:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第17张

此时的is变量为java.io.SequenceInputStream,随后程序挪用java.io.SequenceInputStream类的read方式

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第18张

从上图可见,程序将挪用java.io.SequenceInputStream类的read方式中的nextStream方式,跟入nextStream方式中,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第19张

从上图110行可见,程序将执行in = (InputStream) e.nextElement();

而e的值,可以通过向xml中SequenceInputStream元素中的e元素值来控制。在poc中将这个e元素值设置为javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第20张

因此,程序事实上挪用的是javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator的nextElement方式。接下来进入位于javax/swing/MultiUIDefaults.java中的nextElement方式

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第21张

可见,这次需要执行的是iterator.next().getKey();

我们需要为javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator工具组织一个满足要求的iterator属性值。通过剖析poc可知,poc中选取了javax.imageio.spi.FilterIterator作为iterator属性值,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第22张

跟入位于javax/imageio/spi/ServiceRegistry.java的javax.imageio.spi.FilterIterator类的next方式,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第23张

在javax.imageio.spi.FilterIterator类的next方式中,执行advance方式。跟入advance方式

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第24张

从上图可见,程序执行了T elt = iter.next();
此时的iter显然可以通过xml中javax.imageio.spi.FilterIterator元素中iter元素控制,我们看一下poc中组织的iter子节点,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第25张

当iter.next()执行后,poc中组织的java.lang.ProcessBuilder被返回并赋值给elt,见下图

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第26张

随后,程序执行filter.filter(elt)

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第27张

很显然,filter值是可以通过xml中javax.imageio.spi.FilterIterator元素中filter元素控制的。看一下poc

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第28张

Filter赋值为javax.imageio.ImageIO$ContainsFilter类

我们跟入javax.imageio.ImageIO$ContainsFilter类的filter方式中,位于javax/imageio/ImageIO.java

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第29张

可见在javax.imageio.ImageIO$ContainsFilter类的filter方式中,执行了method.invoke(elt)。method可以通过xml中javax.imageio.ImageIO$ContainsFilter元素包罗的method元素控制,见poc

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第30张

此时method为ProcessBuilder类的start方式,而通过上文可知:elt为组织好的java.lang.ProcessBuilder工具。在method与elt都可控的情况下,举行反射挪用即可实现远程代码执行行使。

我们接下来看看CVE-2020-26259随便文件删除破绽

CVE-2020-26259

首先剖析下CVE-2020-26259的poc

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第31张

从poc中可以发现:CVE-2020-26259的poc中is元素为com.sun.xml.internal.ws.util.ReadAllStream$FileStream,这与上一个破绽poc不一样。

值得注意的是,这次破绽行使的不是Base64Data中get方式里的baos.readFrom(is)这个入口,而是位于它下面一行的is.close()这行代码。通过调试,程序在执行过get方式中baos.readFrom(is)后,紧接着执行is.Close(),见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第32张

此时的is是com.sun.xml.internal.ws.util.ReadAllStream$FileStream,跟入com.sun.xml.internal.ws.util.ReadAllStream$FileStream中的close方式,见下图:

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第33张

当com.sun.xml.internal.ws.util.ReadAllStream$FileStream工具的tempFile属性值不为空时,删除tempFile文件。

tempFile是com.sun.xml.internal.ws.util.ReadAllStream$FileStream工具的属性值,因此可以直接在poc中com.sun.xml.internal.ws.util.ReadAllStream$FileStream元素内组织tempFile属性元素,通过tempFile属性元素控制要删除的文件,见下图poc

电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析 安全技术 漏洞分析 第34张

到此,一个随便文件删除破绽产生了

总结

通过对这两个破绽的剖析不难发现,CVE-2020-26259实在是CVE-2020-26217的一个思路上的延伸:在is可控时,既然baos.readFrom(is)可以行使,那么is.close()是否也能组织出一个行使链呢?从CVE-2020-26259谜底上来看是可以的。
从CVE-2020-26259也可以延伸出另一个问题:只要找到一个类,其中存在close方式且close方式中有可行使的地方,那么一条新的行使链就被挖掘出来了。

Allbet Gaming声明:该文看法仅代表作者自己,与www.allbetgame.us无关。转载请注明:电银付pos机(dianyinzhifu.com):CVE-2020-26217/26259 Xstream远程代码执行/随便文件删除破绽剖析
发布评论

分享到:

usdt自动充值(caibao.it):外媒:印度讲述6例熏染变异新冠病毒确诊病例,患者近期从英国入境
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。