前言

/*
Gadget chain:
java.io.ObjectInputStream.readObject()
java.util.HashSet.readObject()
java.util.HashMap.put()
java.util.HashMap.hash()
org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode()
org.apache.commons.collections.keyvalue.TiedMapEntry.getValue()
org.apache.commons.collections.map.LazyMap.get()
org.apache.commons.collections.functors.ChainedTransformer.transform()
org.apache.commons.collections.functors.InvokerTransformer.transform()
java.lang.reflect.Method.invoke()
java.lang.Runtime.exec()
by @matthias_kaiser
*/

CC6解决了高版本Java的限制,而且利用更加通用。不受版本限制

阅读全文 »

前言

简单来说CC2就是从 SerializablereadObject() ⽅法到 Transformertransform() ⽅法的调⽤链,首先 CommonsCollections3 中无法使用,因为在3的版本中 TransformingComparator 无法序列化。其次 只有 CommonsCollections4的4.0 可以使用,因为 CommonsCollections4 其他版本去掉了 InvokerTransformer 的 Serializable 继承,导致无法序列化,进而衍生出CC4。

环境

添加maven依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
阅读全文 »

前言

CC1链之LazyMap链

分析

这次在寻找的 transform 入口中,找到 LazyMap 中的get方法

public Object get(Object key) {
// create value for key if key is not currently in the map
if (map.containsKey(key) == false) {
Object value = factory.transform(key);
map.put(key, value);
return value;
}
return map.get(key);
}
阅读全文 »

前言

通过 defineClass字节码加载任意类而拓宽的一条链子,但是在实际场景中,因为defineClass方法作用域却是不开放的,所以我们很很难直接利用到它,CC3的利用关键就是 TransletClassLoader 中的 defineClass调用了此方法,当过滤Runtime时,可以尝试利用

阅读全文 »
0%