CC1、CC6 区别

Commons Collections 1 (CC1) 利用链

CC1 是最经典、最广为人知的 Commons Collections 反序列化利用链。它利用了 InvokerTransformer 这个转换器来反射调用任意方法

利用链核心原理

CC1 利用链的核心思想是通过调用链,最终在反序列化过程中触发 TemplatesImpl 类的 newTransformer 方法,从而执行任意命令

  1. InvokerTransformer:这是核心组件。它的 transform() 方法能够通过反射调用任意对象的任意方法。攻击者可以利用它来调用 Runtime.getRuntime().exec()
  2. InstantiateTransformer:这个转换器用于实例化一个对象,其 transform() 方法会调用构造函数。在利用链中,它常用来实例化 InvokerTransformer 对象
  3. LazyMap:这是一个延迟加载的 Map,它的 get() 方法会在键不存在时调用一个预设的转换器(Transformer)。攻击者可以将 InvokerTransformer 作为这个转换器,当对一个不存在的键进行 get() 操作时,就会触发 InvokerTransformertransform() 方法
  4. AnnotationInvocationHandlerBadAttributeValueExpException:CC1 利用链通常需要一个入口点,来触发 LazyMapget() 方法。在旧版本的 JDK 中,AnnotationInvocationHandlerreadObject() 方法会在反序列化时自动调用其内部的 Proxy 对象的 invoke() 方法,从而间接触发 LazyMapget()。对于新版本的 JDK,由于对 AnnotationInvocationHandler 进行了限制,攻击者转而利用 BadAttributeValueExpExceptionreadObject() 方法

Commons Collections 6 (CC6) 利用链

CC6 旨在解决 CC1 在较新版本的库和 JDK 中失效的问题。它抛弃了 CC1 中常用的 InvokerTransformer,转而利用 TiedMapEntryLinkedSet 等新的类来构造利用链

利用链核心原理

CC6 的核心思想是利用 TiedMapEntry 在反序列化时触发 Mapget() 方法,最终同样达到命令执行的目的

  1. TiedMapEntry:这是 CC6 利用链的核心。它的 toString() 方法在调用时会触发其内部 Mapget() 方法
  2. AbstractMap$TansformMapDecorator:这是一个装饰器,它装饰了一个 Map,并用一个 Transformer 来处理其键值
  3. TransformedMap:当向这个 Map 添加元素时,其 put() 方法会调用一个预设的 Transformer
  4. LinkedSet:在 CC6 的利用中,攻击者通常会利用 LinkedSetequals() 方法,该方法会遍历集合中的元素并调用它们的 equals()。通过精心构造 LinkedSet,可以使其内部的 TiedMapEntry 实例的 toString() 方法被调用
  5. InvokerTransformer (再次出现):尽管 CC6 旨在避开 InvokerTransformer,但在某些变体中,它仍然可以作为最终的命令执行器。不同的是,CC6 利用链的触发点不再是 CC1 中的 LazyMap
特性 Commons Collections 1 (CC1) Commons Collections 6 (CC6)
核心触发器 LazyMap 的 get() 方法 TiedMapEntry 的 toString() 方法
主要攻击类 InvokerTransformer, LazyMap, AnnotationInvocationHandler TiedMapEntry, LinkedSet, TransformedMap
核心思想 通过 LazyMap 间接调用 InvokerTransformer 通过 TiedMapEntry 的 toString() 调用 Map 的 get()
适用范围 较老的 Commons Collections 库版本,以及旧版 JDK 较新的 Commons Collections 库版本,解决了 CC1 在新版本中的问题
链条复杂性 相对简单,逻辑直接 相对复杂,涉及更多的类和间接调用
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:55

results matching ""

    No results matching ""