讲一下 CC1-7 的原理

CC1: InvokerTransformer

  • 原理:这是最经典、最著名的利用链。它利用了 InvokerTransformer 这个类,它的 transform 方法可以通过反射调用任何对象的任何方法

  • 攻击链

  • LazyMap:它是一个惰性加载的 Map,当访问一个不存在的键时,会调用一个 Transformer 来生成值

  • InvokerTransformer:攻击者将 InvokerTransformer 封装到 LazyMap 中,并指定其调用 Runtime.getRuntime().exec() 方法

  • AnnotationInvocationHandler:当 LazyMap 被反序列化时,AnnotationInvocationHandler 会调用它的 invoke 方法,从而触发 LazyMapget 方法

  • Runtime.exec():最终,LazyMapget 方法会调用 InvokerTransformer,通过反射执行 Runtime.exec(),从而执行任意命令

  • 绕过:由于 InvokerTransformer 过于危险,它很快被许多安全框架和应用服务器加入了反序列化黑名单

CC2-CC7:黑名单绕过与新 Gadget Chain 的发现

在 CC1 被加入黑名单后,研究人员开始寻找新的、没有被列入黑名单的 Gadget Chain。这些新的利用链都遵循同样的原理,只是利用了不同的类来构建多米诺骨牌

  • CC2 (j_object):利用 Spring 框架中的 Javassist 类库。它通过 ClassPathXmlApplicationContext 加载一个远程 XML 文件,从而执行远程代码

  • CC3 (j_object):利用 AbstractMaphashCode 方法,通过 equals 方法来触发 InvokerTransformer

  • CC4 (j_object):利用 SpringBadAttributeValueExpException 类。当这个类被反序列化时,它的 toString 方法会被调用,从而触发 InvokerTransformer

  • CC5 (j_object):这个利用链与 CC1 类似,但它通过 TiedMapEntry 来触发 LazyMap,从而绕过了一些针对 AnnotationInvocationHandler 的防御

  • CC6 (j_object):这个利用链也使用了 TiedMapEntry,但它通过 TiedMapEntrytoString 方法来触发 LazyMap

  • CC7 (j_object):这个利用链使用 HashedMapreadObject 方法来触发 AbstractMapput 方法,最终触发 InvokerTransformer