@@ -211,6 +211,180 @@ public class Main {
211211
212212- 执行类 sink (rce ssrf 写文件等等)
213213
214+ ### 核心误解
215+
216+ #### 序列化≠序列化类的代码
217+
218+ ** 错误理解的序列化** :
219+ ```
220+ 序列化 → 把整个类的代码都打包进去了
221+ → 包括类定义、方法、readObject()方法等
222+ → 服务器解开就能用
223+ ```
224+
225+ ** 实际的序列化** :
226+ ```
227+ 序列化 → 只序列化对象的数据(字段值)
228+ → 不包含类的代码/方法
229+ → 服务器需要自己有这个类的定义
230+ ```
231+
232+ ** 序列化到底保存了什么?**
233+
234+ 一个例子
235+
236+ ``` java
237+ class Person implements Serializable {
238+ private String name;
239+ private int age;
240+
241+ public Person (String name , int age ) {
242+ this . name = name;
243+ this . age = age;
244+ }
245+
246+ public void sayHello () {
247+ System . out. println(" Hello, I'm " + name);
248+ }
249+ }
250+
251+ // 序列化
252+ Person p = new Person (" Alice" , 25 );
253+ oos. writeObject(p);
254+ ```
255+
256+ ** 序列化文件里有什么?**
257+
258+ ```
259+ ✅ 类的全限定名:com.example.Person
260+ ✅ serialVersionUID:1234567890L
261+ ✅ 字段名和值:
262+ - name = "Alice"
263+ - age = 25
264+
265+ ❌ 构造函数的代码
266+ ❌ sayHello()方法的代码
267+ ❌ 任何方法的实现
268+ ```
269+
270+ ** 用二进制工具查看序列化后的恶意内容 malicious.ser**
271+
272+ ``` bash
273+ hexdump -C malicious.ser | head -20
274+ ```
275+
276+ 你会看到类似这样的内容:
277+ ```
278+ ac ed 00 05 # Java序列化魔数
279+ 73 72 00 10 # 对象流标识
280+ 4d 61 6c 69 63 69 6f 75 73 4f 62 6a 65 63 74 # "MaliciousObject" (类名)
281+ 00 00 00 00 00 00 00 01 # serialVersionUID
282+ 02 00 01 # 字段数量
283+ 4c 00 07 63 6f 6d 6d 61 6e 64 # "command" (字段名)
284+ ...
285+ 77 68 6f 61 6d 69 # "whoami" (字段值)
286+ ```
287+
288+ ** 注意** :里面只有类名和数据,** 没有 readObject() 方法的代码!**
289+
290+ ---
291+
292+ ** 反序列化时发生了什么?**
293+
294+ 第1步:读取类名
295+ ``` java
296+ ois. readObject();
297+ // Java读取字节流,发现:
298+ // "哦,这是一个 MaliciousObject 类的对象"
299+ ```
300+
301+ 第2步:查找类定义
302+ ``` java
303+ // Java尝试加载类:
304+ Class<?> clazz = Class . forName(" MaliciousObject" );
305+ // ↑ 在当前classpath中查找这个类
306+
307+ // 如果找不到 → ClassNotFoundException ❌
308+ // 如果找到了 → 继续下一步 ✓
309+ ```
310+
311+ 第3步:创建对象并填充数据
312+ ``` java
313+ // 创建空对象(不调用构造函数)
314+ MaliciousObject obj = allocateInstance(MaliciousObject . class);
315+
316+ // 从序列化数据中读取字段值
317+ obj. command = " whoami" ; // 从字节流中读取
318+
319+ // 如果类定义中有 readObject() 方法,调用它
320+ obj. readObject(ois); // ← 这里调用的是服务器上的类定义中的方法!
321+ ```
322+
323+ ---
324+
325+ #### 形象类比
326+
327+ - 类比1:组装家具
328+
329+ ** 序列化文件** 就像宜家的包装盒:
330+ ```
331+ 📦 包装盒上写着:
332+ - 产品型号:BILLY书架
333+ - 尺寸:高200cm,宽80cm
334+ - 颜色:白色
335+
336+ ❌ 盒子里没有:
337+ - 如何制造书架的工厂图纸
338+ - 生产线的机器
339+ ```
340+
341+ ** 反序列化** 就像组装:
342+ ```
343+ 你收到包装盒 → 看到型号"BILLY"
344+ → 去查看宜家的组装说明书(类定义)
345+ → 如果你没有说明书 → 无法组装 ❌
346+ → 如果你有说明书 → 按照说明组装 ✓
347+ ```
348+
349+ - 类比2:菜谱
350+
351+ ** 序列化数据** :
352+ ```
353+ 菜名:宫保鸡丁
354+ 食材:鸡肉250g,花生50g,辣椒10个
355+ ```
356+
357+ ** 类定义(方法)** :
358+ ```
359+ 做法:
360+ 1. 鸡肉切丁
361+ 2. 热锅放油
362+ 3. 炒香辣椒...
363+ ```
364+
365+ ** 问题** :
366+ - 你把菜名和食材发给朋友(序列化)
367+ - 朋友收到了,但不知道怎么做(没有类定义)
368+ - 朋友:我没有这道菜的菜谱啊!(ClassNotFoundException)
369+
370+ #### 利用目标已有的类才能实现真实攻击
371+
372+ ``` java
373+ // 目标服务器肯定有这些类:
374+ - java.util. HashMap
375+ - java.util. ArrayList
376+ - org.apache.commons.collections. Transformer // 如果用了这个库
377+
378+ // 攻击者构造利用链:
379+ HashMap map = new HashMap ();
380+ // ... 巧妙构造 ...
381+ // 序列化这个HashMap
382+
383+ // 服务器:
384+ ois. readObject(); // ✓ HashMap我有!反序列化成功
385+ // ✓ 但触发了恶意逻辑
386+ ```
387+
214388### Java 反序列化执行系统命令
215389
216390在Java反序列化漏洞中,最终目标往往是执行系统命令。下面介绍三种执行系统命令的方式:
0 commit comments