讲一下 CC1-7 的原理

CC1: InvokerTransformer

  • 原理:这是最经典、最著名的利用链。它利用了 InvokerTransformer 这个类,它的 transform 方法可以通过反射调用任何对象的任何方法
  • 攻击链
    1. LazyMap:它是一个惰性加载的 Map,当访问一个不存在的键时,会调用一个 Transformer 来生成值
    2. InvokerTransformer:攻击者将 InvokerTransformer 封装到 LazyMap 中,并指定其调用 Runtime.getRuntime().exec() 方法
    3. AnnotationInvocationHandler:当 LazyMap 被反序列化时,AnnotationInvocationHandler 会调用它的 invoke 方法,从而触发 LazyMapget 方法
    4. 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
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:55

results matching ""

    No results matching ""