Skip to content

Commit 33c4fa3

Browse files
committed
0106备份
1 parent 5dc73c2 commit 33c4fa3

File tree

2 files changed

+214
-0
lines changed

2 files changed

+214
-0
lines changed

src/CodeAudittutorial/3-JavaVul/deserialize.md

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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反序列化漏洞中,最终目标往往是执行系统命令。下面介绍三种执行系统命令的方式:

src/others/DailySkills.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,46 @@ Start-Process -FilePath ".\Cursor Setup 0.44.11 - x64.exe" -ArgumentList /D="D:\
194194

195195
但感觉他还是在 C 盘到处拉屎
196196

197+
### VSCode 连接 JumpServer 资产
198+
199+
JumpServer 的配置文件(config.txt)中修改如下:
200+
201+
```bash
202+
ENABLE_LOCAL_PORT_FORWARD=true
203+
ENABLE_VSCODE_SUPPORT=true
204+
```
205+
206+
VSCode 使用 Remote-ssh 插件
207+
208+
```text
209+
ssh jumpserverUsername@systemUsername@AssetIP@jumpserverHostIP -p2222
210+
解释:
211+
- jumpserverUsername:登录 JumpServer 的用户
212+
- systemUsername:连接资产指定的系统用户
213+
- AssetIP:指定要连接的资产
214+
- jumpserverHostIP:JumpServer 服务 IP
215+
- 2222:KOKO 端口
216+
注:
217+
systemUsername 是该资产所有授权中,唯一的登录用户名,只匹配一条
218+
AssetIP 是所有资产授权中,唯一匹配到 IP,只匹配一条
219+
```
220+
221+
222+
223+
### Mac双击执行jar包时提示有危害
224+
225+
**macOS安全机制**:macOS的Gatekeeper会对下载的文件添加扩展属性,可能导致无法直接执行。使用`xattr`命令可以清除这些属性。
226+
227+
```bash
228+
xattr -c xxxxx.jar
229+
```
230+
231+
232+
233+
234+
235+
236+
197237
## WSL 相关
198238

199239
### WSL 制作快照和回滚

0 commit comments

Comments
 (0)