讲一下 CC1-7 的原理
CC1: InvokerTransformer
- 原理:这是最经典、最著名的利用链。它利用了
InvokerTransformer
这个类,它的transform
方法可以通过反射调用任何对象的任何方法 - 攻击链:
LazyMap
:它是一个惰性加载的 Map,当访问一个不存在的键时,会调用一个Transformer
来生成值InvokerTransformer
:攻击者将InvokerTransformer
封装到LazyMap
中,并指定其调用Runtime.getRuntime().exec()
方法AnnotationInvocationHandler
:当LazyMap
被反序列化时,AnnotationInvocationHandler
会调用它的invoke
方法,从而触发LazyMap
的get
方法Runtime.exec()
:最终,LazyMap
的get
方法会调用InvokerTransformer
,通过反射执行Runtime.exec()
,从而执行任意命令
- 绕过:由于
InvokerTransformer
过于危险,它很快被许多安全框架和应用服务器加入了反序列化黑名单
CC2-CC7:黑名单绕过与新 Gadget Chain 的发现
在 CC1 被加入黑名单后,研究人员开始寻找新的、没有被列入黑名单的 Gadget Chain。这些新的利用链都遵循同样的原理,只是利用了不同的类来构建多米诺骨牌
- CC2 (
j_object
):利用Spring
框架中的Javassist
类库。它通过ClassPathXmlApplicationContext
加载一个远程 XML 文件,从而执行远程代码 - CC3 (
j_object
):利用AbstractMap
的hashCode
方法,通过equals
方法来触发InvokerTransformer
- CC4 (
j_object
):利用Spring
的BadAttributeValueExpException
类。当这个类被反序列化时,它的toString
方法会被调用,从而触发InvokerTransformer
- CC5 (
j_object
):这个利用链与 CC1 类似,但它通过TiedMapEntry
来触发LazyMap
,从而绕过了一些针对AnnotationInvocationHandler
的防御 - CC6 (
j_object
):这个利用链也使用了TiedMapEntry
,但它通过TiedMapEntry
的toString
方法来触发LazyMap
- CC7 (
j_object
):这个利用链使用HashedMap
的readObject
方法来触发AbstractMap
的put
方法,最终触发InvokerTransformer