XStreadm 反序列化漏洞原理

1. 核心原理:readObject() 方法和 Bad Gadget

XStream 反序列化漏洞的原理与 CommonsCollections 漏洞非常相似,都是利用 Java 的反序列化机制和一些恶意类(Gadget)

  1. 恶意 XML 构造:攻击者首先会找到一个可以被利用的 Java 类(通常称为 “Bad Gadget”),这个类的 readObject() 方法(或其它类似方法,如 finalize())在反序列化时会触发一些非预期的行为
  2. readObject() 的魔法:当 XStream 对一个 XML 数据进行反序列化时,如果它解析到一个 <object-name> 标签,它会尝试实例化这个类,并调用其 readObject() 方法来填充数据
  3. 触发命令执行:如果攻击者能找到一个 Bad Gadget,它的 readObject() 方法能通过反射或其他方式,间接调用 java.lang.Runtime.exec(),那么就可以实现远程代码执行

CommonsCollections 不同的是,XStream 的攻击链并不局限于 CommonsCollections 库。只要能找到一个可以被利用的类,就可以构造出攻击链。

2. 典型的 XStream 攻击链(Groovy 示例)

一个经典的 XStream 攻击链利用了 Groovy 库,它曾经在 XStream 的黑名单之外

  1. 恶意 XML 构造:攻击者构造一个 XML,其中包含一个 Groovy.lang.Closure 对象。这个对象可以在其 call() 方法中执行任意代码

  2. 利用java.util.concurrent.ConcurrentHashMap:攻击者会将 Groovy.lang.Closure 封装到 ConcurrentHashMap 中,并利用其序列化特性

  3. XStream 反序列化:当 XStream 解析 XML 时,它会创建 ConcurrentHashMap 实例,并填充其数据

  4. Groovy 代码执行:在反序列化过程中,ConcurrentHashMap 会调用其内部的某些方法,这些方法会触发 Groovy.lang.Closurecall() 方法,从而执行攻击者预设的 Groovy 代码,例如:

    "whoami".execute()
    
  5. 远程代码执行:最终,Groovy 代码会被执行,实现了 RCE

这个攻击链的本质是利用了 Groovy.lang.Closure 这个 Bad Gadget,结合 ConcurrentHashMap 的反序列化特性,在不被 XStream 黑名单拦截的情况下,触发了命令执行

Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:20

results matching ""

    No results matching ""