XStreadm 反序列化漏洞原理
1. 核心原理:readObject()
方法和 Bad Gadget
XStream 反序列化漏洞的原理与 CommonsCollections
漏洞非常相似,都是利用 Java 的反序列化机制和一些恶意类(Gadget)
- 恶意 XML 构造:攻击者首先会找到一个可以被利用的 Java 类(通常称为 “Bad Gadget”),这个类的
readObject()
方法(或其它类似方法,如finalize()
)在反序列化时会触发一些非预期的行为 readObject()
的魔法:当 XStream 对一个 XML 数据进行反序列化时,如果它解析到一个<object-name>
标签,它会尝试实例化这个类,并调用其readObject()
方法来填充数据- 触发命令执行:如果攻击者能找到一个 Bad Gadget,它的
readObject()
方法能通过反射或其他方式,间接调用java.lang.Runtime.exec()
,那么就可以实现远程代码执行
与 CommonsCollections
不同的是,XStream 的攻击链并不局限于 CommonsCollections
库。只要能找到一个可以被利用的类,就可以构造出攻击链。
2. 典型的 XStream 攻击链(Groovy
示例)
一个经典的 XStream 攻击链利用了 Groovy
库,它曾经在 XStream 的黑名单之外
恶意 XML 构造:攻击者构造一个 XML,其中包含一个
Groovy.lang.Closure
对象。这个对象可以在其call()
方法中执行任意代码利用
java.util.concurrent.ConcurrentHashMap
:攻击者会将Groovy.lang.Closure
封装到ConcurrentHashMap
中,并利用其序列化特性XStream 反序列化:当 XStream 解析 XML 时,它会创建
ConcurrentHashMap
实例,并填充其数据Groovy
代码执行:在反序列化过程中,ConcurrentHashMap
会调用其内部的某些方法,这些方法会触发Groovy.lang.Closure
的call()
方法,从而执行攻击者预设的 Groovy 代码,例如:"whoami".execute()
远程代码执行:最终,Groovy 代码会被执行,实现了 RCE
这个攻击链的本质是利用了 Groovy.lang.Closure
这个 Bad Gadget,结合 ConcurrentHashMap
的反序列化特性,在不被 XStream 黑名单拦截的情况下,触发了命令执行