讲一下 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方法来触发InvokerTransformerCC4 (
j_object):利用Spring的BadAttributeValueExpException类。当这个类被反序列化时,它的toString方法会被调用,从而触发InvokerTransformerCC5 (
j_object):这个利用链与 CC1 类似,但它通过TiedMapEntry来触发LazyMap,从而绕过了一些针对AnnotationInvocationHandler的防御CC6 (
j_object):这个利用链也使用了TiedMapEntry,但它通过TiedMapEntry的toString方法来触发LazyMapCC7 (
j_object):这个利用链使用HashedMap的readObject方法来触发AbstractMap的put方法,最终触发InvokerTransformer