### 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.Closure` 的 `call()` 方法，从而执行攻击者预设的 Groovy 代码，例如：

       "whoami".execute()

5. 远程代码执行：最终，Groovy 代码会被执行，实现了 RCE

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