一些Java反序列化漏洞的复现

Apache Common Collections

Apache Common Collections 反序列化造成的 rce 出现在 InvokerTransformer 这个类里,漏洞点是通过 Java 反射机制调用方法:

在 InvokerTransformer.class 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Object transform(Object input) {
if (input == null) {
return null;
}
try {
Class cls = input.getClass();
Method method = cls.getMethod(iMethodName, iParamTypes);
return method.invoke(input, iArgs);
} catch (NoSuchMethodException ex) {
throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' does not exist");
} catch (IllegalAccessException ex) {
throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' cannot be accessed");
} catch (InvocationTargetException ex) {
throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' threw an exception", ex);
}
}

可以看到,在漏洞函数内存在反射调用,回溯 iMethodName 和 iParamType 以及 iArgs,可以看到 InvokerTransformer 类的构造函数:

1
2
3
4
5
6
public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) {
super();
iMethodName = methodName;
iParamTypes = paramTypes;
iArgs = args;
}

变量可控。

接着看 TransformedMap.class,在 TransformedMap 类的 checkSetValue 方法中,可以看到:

1
2
3
protected Object checkSetValue(Object value) {
return valueTransformer.transform(value);
}

这里存在一个 transform 的方法调用,回溯一下 valueTransformer,构造函数:

1
2
3
4
5
6
7
8
9
public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {  // 对外创建类对象
return new TransformedMap(map, keyTransformer, valueTransformer);
}

protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {
super(map);
this.keyTransformer = keyTransformer;
this.valueTransformer = valueTransformer;
}

valueTransformer 类型为 Transformer 且可控。

另外,在 AbstractInputCheckedMapDecorator.class 中,重载了 Map 的内部借口 Map.Entry 的 setValue 方法,并且调用了 checkSetValue 方法:

1
2
3
4
public Object setValue(Object value) {
value = parent.checkSetValue(value);
return entry.setValue(value);
}

也就是说,如果再某个类中自定义了反序列化方法,并且对 map 对象操作了键值,那么就可以触发以上反序列化链。

Contents
  1. 1. Apache Common Collections
|