Files
Sec-Interview/Chapter6/6-22.md
T
2025-09-25 03:24:57 +08:00

31 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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 代码,例如:
```groovy
"whoami".execute()
```
5. **远程代码执行**:最终,Groovy 代码会被执行,实现了 RCE
这个攻击链的本质是利用了 `Groovy.lang.Closure` 这个 Bad Gadget,结合 `ConcurrentHashMap` 的反序列化特性,在不被 XStream 黑名单拦截的情况下,触发了命令执行