14-2
约 457 字大约 2 分钟
2025-11-02
讲一下 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