-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
870 lines (488 loc) · 62 KB
/
atom.xml
File metadata and controls
870 lines (488 loc) · 62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>妙尽璇机</title>
<link href="https://changeyourway.github.io/atom.xml" rel="self"/>
<link href="https://changeyourway.github.io/"/>
<updated>2026-03-07T08:14:18.871Z</updated>
<id>https://changeyourway.github.io/</id>
<author>
<name>妙尽璇机</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>漏洞篇 - Hessian Aspectj 二次反序列化新链</title>
<link href="https://changeyourway.github.io/2026/03/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87%20-%20Hessian%20Aspectj%20%E4%BA%8C%E6%AC%A1%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B0%E9%93%BE/"/>
<id>https://changeyourway.github.io/2026/03/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87%20-%20Hessian%20Aspectj%20%E4%BA%8C%E6%AC%A1%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B0%E9%93%BE/</id>
<published>2026-03-07T08:13:03.991Z</published>
<updated>2026-03-07T08:14:18.871Z</updated>
<summary type="html"><p>起因是我在用自制的 codeql mcp 工具测试 2026 alictf Fury 反序列化时,发现了一条新的二次反序列化链,可惜等构造完了才发现这个链子上的类没有实现 serializable ,本以为要难产了,jsjcw 师傅提醒说可以用在 hessian 上,因为是 toString 触发的,一语点醒梦中人,测试了确实可以,故而分享一下这条生来残缺的链子。</p>
<h2 id="利用链总结"><a href="#利用链总结" class="headerlink" title="利用链总结"></a>利用链总结</h2><p>这条链从 toString 到 readObject 全都是 Aspectj 依赖中的类:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependency&gt;</span><br><span class="l</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Fastjson 1.2.68 - 1.2.80 利用</title>
<link href="https://changeyourway.github.io/2025/08/23/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Fastjson%201.2.68-1.2.80%20%E5%88%A9%E7%94%A8/"/>
<id>https://changeyourway.github.io/2025/08/23/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Fastjson%201.2.68-1.2.80%20%E5%88%A9%E7%94%A8/</id>
<published>2025-08-23T04:00:00.000Z</published>
<updated>2026-03-22T15:57:02.991Z</updated>
<summary type="html"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>经过先前的分析:<a href="https://changeyourway.github.io/2024/09/18/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Fastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/">漏洞篇 - Fastjson 反序列化</a>,我们已经知道需要找 Throwable 的子类来进行绕过,浅蓝师傅提供了三个方面的思路来进行利用链挖掘:</p>
<img src="/images/image-20250529100918-ybtp3d0.png">
<p>之前我们分析的是一个普通的 Java 类,所以调用 JavaBeanDeserializer 来反序列化。在 1.2.68 以后,我们从 Throwable 的子类入手,会调用 ThrowableDeserializer 进行反序列化。而 ThrowableDeserializer 在反序列化一个 Throwable 对象的时候会将 public 属性、setter 方法参数、构造方法参数(或者简而言之,类的属性)加入到缓存当中,从而绕过 checkAutoType 的校验。<strong>这一部分的原理,在 Fastjson 1.2.80 的源码分析中给出解释。</strong></p>
<p>不过,在正式开始之前,我需要先纠正先前的一个粗浅的认知。</p>
<p>我们认为 Fastjson 1.2.68 的利用可以通过寻找 Throwable 的子类进行利用,是因为我们认为 checkAutoType 方法只有当传入的类为传入的 expectCl</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>RASP 研究,OpenRasp 原理与绕过</title>
<link href="https://changeyourway.github.io/2025/07/12/Java%20%E5%AE%89%E5%85%A8/RASP%20%E7%A0%94%E7%A9%B6%EF%BC%8COpenRasp%20%E5%8E%9F%E7%90%86%E4%B8%8E%E7%BB%95%E8%BF%87/"/>
<id>https://changeyourway.github.io/2025/07/12/Java%20%E5%AE%89%E5%85%A8/RASP%20%E7%A0%94%E7%A9%B6%EF%BC%8COpenRasp%20%E5%8E%9F%E7%90%86%E4%B8%8E%E7%BB%95%E8%BF%87/</id>
<published>2025-07-12T04:00:00.000Z</published>
<updated>2026-03-22T15:55:13.216Z</updated>
<summary type="html"><h2 id="RASP-快速入门"><a href="#RASP-快速入门" class="headerlink" title="RASP 快速入门"></a>RASP 快速入门</h2><h3 id="RASP-生成"><a href="#RASP-生成" class="headerlink" title="RASP 生成"></a>RASP 生成</h3><p>前置知识:<a href="https://changeyourway.github.io/2024/10/23/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-JavaAgent%E8%AF%A6%E8%A7%A3/#transform-%E6%96%B9%E6%B3%95">基础篇 - Java Agent 详解</a></p>
<p>仿照搭建 Java Agent 示例环境的过程,只需要将 Hook 的类改变为关键漏洞触发的类,即可实现一个简单的 RASP 。</p>
<p>Java 不允许在默认包中定义代理类。因此,建议为您的代理类添加包声明。</p>
<p>下面是我的简单 rasp 代码示例:</p>
<p><strong>Agent:</strong></p>
<p>实现了 premain 和 agentmain 两种方法,覆盖了 jvm 启动与 动态 attach 两种方式。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="lin</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>2025 D^3CTF Web WP</title>
<link href="https://changeyourway.github.io/2025/06/02/CTF/2025%20D%5E3CTF%20Web%20WP/"/>
<id>https://changeyourway.github.io/2025/06/02/CTF/2025%20D%5E3CTF%20Web%20WP/</id>
<published>2025-06-02T04:00:00.000Z</published>
<updated>2026-03-22T15:54:49.650Z</updated>
<summary type="html"><h2 id="d3model"><a href="#d3model" class="headerlink" title="d3model"></a>d3model</h2><h3 id="CVE-2025-1550"><a href="#CVE-2025-1550" class="headerlink" title="CVE-2025-1550"></a>CVE-2025-1550</h3><p>考察 CVE-2025-1550 ,参考文章:</p>
<p><a href="https://blog.huntr.com/inside-cve-2025-1550-remote-code-execution-via-keras-models">https://blog.huntr.com/inside-cve-2025-1550-remote-code-execution-via-keras-models</a></p>
<p><a href="https://jfrog.com/blog/keras-safe_mode-bypass-vulnerability/">https://jfrog.com/blog/keras-safe_mode-bypass-vulnerability/</a></p>
<p>CVE-2025-1550 大致讲的是 Keras 模型的一个反序列化任意代码执行漏洞。Keras 的模型加载流程由 load_model 函数启动。该函数会根据模型类型和文件扩展名执行不同的加载路径。当调用 <code>_load_model_from_fileobj</code> 函数时,会提取 ZIP 文件的内容并开始重建模型。在此阶段,会检查 <code>config.json</code> 文件,并调用 <code>_model_from_config</c</summary>
<category term="CTF" scheme="https://changeyourway.github.io/categories/CTF/"/>
</entry>
<entry>
<title>漏洞篇 - SnakeYaml 反序列化</title>
<link href="https://changeyourway.github.io/2025/05/17/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-SnakeYaml%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
<id>https://changeyourway.github.io/2025/05/17/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-SnakeYaml%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/</id>
<published>2025-05-17T04:00:00.000Z</published>
<updated>2026-03-22T15:54:32.298Z</updated>
<summary type="html"><h2 id="SnakeYaml-反序列化"><a href="#SnakeYaml-反序列化" class="headerlink" title="SnakeYaml 反序列化"></a>SnakeYaml 反序列化</h2><p>又来炒冷饭了伙计们。</p>
<h2 id="一、SnakeYaml-简介"><a href="#一、SnakeYaml-简介" class="headerlink" title="一、SnakeYaml 简介"></a>一、SnakeYaml 简介</h2><p>SnakeYaml 是 Java 中解析 yaml 的库,而 yaml 是一种人类可读的数据序列化语言,通常用于编写配置文件等。</p>
<p>YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和 YAML 非常接近)。</p>
<h3 id="0x1:yaml-基本语法"><a href="#0x1:yaml-基本语法" class="headerlink" title="0x1:yaml 基本语法"></a>0x1:yaml 基本语法</h3><ul>
<li><p>大小写敏感</p>
</li>
<li><p>使用缩进表示层级关系</p>
</li>
<li><p>缩进只允许使用空格</p>
</li>
<li><p><code>#</code> 表示注释</p>
</li>
<li><p>支持对象、数组、纯量这 3 种数据结构</p>
<ul>
<li>对象:键值对的集合,又称为映射(mapping)&#x2F; 哈希(hashes) &#x2F; 字典(dictionary)</li>
<li>数组:一组</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>2025 ACTF Web 复现</title>
<link href="https://changeyourway.github.io/2025/04/30/CTF/2025%20ACTF%20Web%20WP/"/>
<id>https://changeyourway.github.io/2025/04/30/CTF/2025%20ACTF%20Web%20WP/</id>
<published>2025-04-30T04:00:00.000Z</published>
<updated>2026-03-22T15:54:14.779Z</updated>
<summary type="html"><h2 id="2025-ACTF-Web-WP"><a href="#2025-ACTF-Web-WP" class="headerlink" title="2025 ACTF Web WP"></a>2025 ACTF Web WP</h2><p>感谢 <a href="https://www.cnblogs.com/F12-blog">F12</a> 师傅提供的源码和指导,感谢其他 NK 师傅的帮助。</p>
<p>下面的 wp 全部为自己搭环境赛后复测的,所以没有 flag ,仅展示过程。(本人因为某些原因错过了本场比赛,同时又决定现在开始好好打 CTF )</p>
<h3 id="ACTF-upload"><a href="#ACTF-upload" class="headerlink" title="ACTF upload"></a>ACTF upload</h3><p>核心考点:文件读取,命令执行</p>
<p>由于本题我在 Windows 上复现环境,部分地方可能与实际比赛不同。</p>
<p>进入主页,看到如下画面,提示 “无需注册” :</p>
<img src="/images/image-20250427215500-a64z3wa.png">
<p>随便输入一个普通用户名 test:test ,来到文件上传界面:</p>
<img src="/images/image-20250427215540-82cas62.png">
<p>随便选择一个文件上传,会跳转到这个图片对应的路径:</p>
<img src="/images/image-20250427215628-iaxeb0t.png">
<p>根据路径中的 ?file_path&#x3D;xxx 猜测存在任意文件读取,响应头里写了是 python 环境,这边是通过读取 app&#x2F</summary>
<category term="CTF" scheme="https://changeyourway.github.io/categories/CTF/"/>
</entry>
<entry>
<title>CVE-2024-50379 - Tomcat 远程 RCE</title>
<link href="https://changeyourway.github.io/2025/02/20/CVE%20%E5%88%86%E6%9E%90/CVE-2024-50379%20Tomcat%E8%BF%9C%E7%A8%8BRCE/"/>
<id>https://changeyourway.github.io/2025/02/20/CVE%20%E5%88%86%E6%9E%90/CVE-2024-50379%20Tomcat%E8%BF%9C%E7%A8%8BRCE/</id>
<published>2025-02-20T04:10:00.000Z</published>
<updated>2026-03-22T15:53:57.560Z</updated>
<summary type="html"><h2 id="漏洞描述"><a href="#漏洞描述" class="headerlink" title="漏洞描述"></a>漏洞描述</h2><p>Apache Tomcat 中 JSP 编译期间的检查时间使用时间 (TOCTOU) 竞争条件漏洞允许在默认 servlet 启用写入时(非默认配置)对不区分大小写的文件系统进行 RCE。由于 Apache Tomcat 的 JSP 编译过程存在条件竞争漏洞,当在不区分大小写的系统上启用了 default servlet 的写入功能(默认关闭)时,并发同时读取和上传同一个文件可以绕过 Tomcat 的大小写敏感检查,将可能造成远程代码执行,漏洞利用需要条件竞争,对网络以及机器性能环境等有一定要求。</p>
<h2 id="影响版本"><a href="#影响版本" class="headerlink" title="影响版本"></a>影响版本</h2><p>11.0.0-M1 &lt;&#x3D; Apache Tomcat &lt; 11.0.2</p>
<p>10.1.0-M1 &lt;&#x3D; Apache Tomcat &lt; 10.1.34</p>
<p>9.0.0.M1 &lt;&#x3D; Apache Tomcat &lt; 9.0.98</p>
<h2 id="快速复现"><a href="#快速复现" class="headerlink" title="快速复现"></a>快速复现</h2><p>下面我们快速搭建环境,并用给定的脚本测试一下。</p>
<h3 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h3><p>我使用的是 Tomcat 10.1.19 ,需要搭配 JDK 11 。</p>
<p>在</summary>
<category term="CVE 分析" scheme="https://changeyourway.github.io/categories/CVE-%E5%88%86%E6%9E%90/"/>
</entry>
<entry>
<title>漏洞篇 - Hessian 反序列化详解</title>
<link href="https://changeyourway.github.io/2025/02/20/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Hessian%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
<id>https://changeyourway.github.io/2025/02/20/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Hessian%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/</id>
<published>2025-02-20T04:00:00.000Z</published>
<updated>2026-03-22T15:53:35.328Z</updated>
<summary type="html"><p>本文前置知识:<a href="https://changeyourway.github.io/2024/11/13/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Hessian%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/">基础篇 - Hessian 协议详解</a></p>
<h2 id="细节补充"><a href="#细节补充" class="headerlink" title="细节补充"></a>细节补充</h2><p>在学习漏洞利用之前,还需要补充一些细节,以更好的理解。这些细节算是在前面的原理分析中漏掉的部分,并且也需要特别强调一下。</p>
<h3 id="协议版本"><a href="#协议版本" class="headerlink" title="协议版本"></a>协议版本</h3><p>su18 师傅提到目前的 Hessian 协议同时兼容两种版本,并且<strong>默认情况下,客户端向服务端发送序列化数据时采用 1.0 版本,而服务端向客户端发送序列化响应数据时采用 2.0 版本</strong>,并且指出控制位在 HessianProxyFactory 的 <code>_isHessian2Reply </code> 和 <code>_isHessian2Request</code> 两个属性中:</p>
<img src="/images/image-20241114150330418.png">
<p>为了弄清楚这两个控制点究竟在何处发挥作用,我重新调试了客户端代码,并找到了它们最终发挥作用的点。</p>
<p>我们曾说客户端主要是调用 HessianProxy 的 sendRequest 发送请求,sendRequest 方法中又主要是</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>CVE-2024-52046 - Apache Mina 漏洞分析</title>
<link href="https://changeyourway.github.io/2025/01/03/CVE%20%E5%88%86%E6%9E%90/CVE-2024-52046%20Apache%20mina%20%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2025/01/03/CVE%20%E5%88%86%E6%9E%90/CVE-2024-52046%20Apache%20mina%20%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/</id>
<published>2025-01-03T04:00:00.000Z</published>
<updated>2026-03-22T15:53:07.763Z</updated>
<summary type="html"><h2 id="漏洞描述"><a href="#漏洞描述" class="headerlink" title="漏洞描述"></a>漏洞描述</h2><p>Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源的网络通信框架,它为开发网络应用程序提供了高效、可扩展的解决方案。MINA 封装了许多底层网络通信的细节,简化了开发网络应用所需的工作。它的设计目标是使开发者能够轻松地构建基于高性能、低延迟的网络协议的应用程序。</p>
<p>Apache MINA 中的 ObjectSerializationDecoder 使用 Java 的原生反序列化协议来处理传入的序列化数据,但缺乏必要的安全检查和防御。此漏洞允许攻击者通过发送特制的恶意序列化数据来利用反序列化过程,从而可能导致远程代码执行 (RCE) 攻击。同样需要注意的是,使用 MINA 核心库的应用程序只有在调用 IoBuffer#getObject() 方法时才会受到影响,并且当使用 ObjectSerializationCodecFactory 类在过滤器链中添加 ProtocolCodecFilter 实例时可能会调用此特定方法。</p>
<h2 id="影响范围"><a href="#影响范围" class="headerlink" title="影响范围"></a>影响范围</h2><p>Apache MINA 2.0.X &lt; 2.0.27</p>
<p>Apache MINA 2.1.X &lt; 2.1.10</p>
<p>Apache MINA 2.2.X &lt; 2.2.4</p>
<h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a</summary>
<category term="CVE 分析" scheme="https://changeyourway.github.io/categories/CVE-%E5%88%86%E6%9E%90/"/>
</entry>
<entry>
<title>基础篇 - Hessian 协议详解</title>
<link href="https://changeyourway.github.io/2024/11/13/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Hessian%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/"/>
<id>https://changeyourway.github.io/2024/11/13/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Hessian%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/</id>
<published>2024-11-13T04:00:00.000Z</published>
<updated>2026-03-22T15:52:32.464Z</updated>
<summary type="html"><h2 id="Hessian-协议介绍"><a href="#Hessian-协议介绍" class="headerlink" title="Hessian 协议介绍"></a>Hessian 协议介绍</h2><p>Hessian 协议是一种高效、跨语言的二进制 RPC(Remote Procedure Call,远程过程调用)协议,由 Caucho 公司设计,最早应用于 Java 和 Java 之间的远程调用。其主要特点是使用紧凑的二进制格式传输数据,提供高性能的序列化和反序列化操作,因此适合在网络带宽较低或数据传输效率要求较高的场景中使用。</p>
<h6 id="Hessian-协议的特点"><a href="#Hessian-协议的特点" class="headerlink" title="Hessian 协议的特点"></a>Hessian 协议的特点</h6><ol>
<li><strong>跨语言支持</strong>:Hessian 协议设计为跨平台的,支持多种语言,如 Java、Python、C#、PHP 等。不同语言的系统可以通过 Hessian 协议实现远程调用,达到语言无关的通信目的。</li>
<li><strong>高效的二进制序列化</strong>:与 XML 或 JSON 相比,Hessian 采用二进制格式,不仅能减少数据体积,还能降低解析的开销,从而提升性能。Hessian 使用较少的字节来表示复杂的数据结构,尤其适合需要频繁远程调用的分布式系统。</li>
<li><strong>轻量化</strong>:Hessian 协议比传统的 SOAP 和 XML-RPC 更轻量,不依赖任何外部配置文件,序列化和反序列化开销低,适合在资源有限的环境中使用。</li>
<li><strong>良好的兼容性和扩展性</strong>:Hess</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - JavaAgent 内存马</title>
<link href="https://changeyourway.github.io/2024/10/31/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-JavaAgent%E5%86%85%E5%AD%98%E9%A9%AC/"/>
<id>https://changeyourway.github.io/2024/10/31/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-JavaAgent%E5%86%85%E5%AD%98%E9%A9%AC/</id>
<published>2024-10-31T04:00:00.000Z</published>
<updated>2026-03-22T15:52:06.106Z</updated>
<summary type="html"><p>本文的前置知识:<a href="https://changeyourway.github.io/2024/10/23/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-JavaAgent%E8%AF%A6%E8%A7%A3/">基础篇 - Java Agent 详解</a> 。</p>
<p>Java Agent 允许开发者在 JVM 运行时通过修改类的字节码,那么它其实就相当于 JVM 层面的一个拦截器或者说增强代理(类似于 AOP),既然如此,我们就可以在一些类中插入我们想要的代码逻辑。</p>
<h2 id="实现思路"><a href="#实现思路" class="headerlink" title="实现思路"></a>实现思路</h2><h3 id="注入-ApplicationFilterChain"><a href="#注入-ApplicationFilterChain" class="headerlink" title="注入 ApplicationFilterChain"></a>注入 ApplicationFilterChain</h3><p>冰蝎作者 rebeyond 师傅的内存马项目(<a href="https://github.com/rebeyond/memShell%EF%BC%89%E9%80%89%E5%8F%96">https://github.com/rebeyond/memShell)选取</a> ApplicationFilterChain 的 internalDoFilter 方法作为 hook 点,在 Tomcat 的运行过程中,ApplicationFilterChain 的 internalDoFilter 方法会被反复调用以执行过滤器的 DoFilter</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Java Agent 详解</title>
<link href="https://changeyourway.github.io/2024/10/23/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-JavaAgent%E8%AF%A6%E8%A7%A3/"/>
<id>https://changeyourway.github.io/2024/10/23/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-JavaAgent%E8%AF%A6%E8%A7%A3/</id>
<published>2024-10-23T04:00:00.000Z</published>
<updated>2026-03-22T15:51:40.753Z</updated>
<summary type="html"><h2 id="Java-Agent-介绍"><a href="#Java-Agent-介绍" class="headerlink" title="Java Agent 介绍"></a>Java Agent 介绍</h2><p>Java Agent 是一种允许开发者在 JVM 运行时通过修改类的字节码来动态增强 Java 应用程序的工具。它基于 <code>Instrumentation</code> 接口,可以使用 <code>ClassFileTransformer</code> 来拦截和修改字节码。在 Java Agent 中,<code>Instrumentation.addTransformer()</code> 可以用来添加一个字节码转换器,它将在类加载时对字节码进行操作。</p>
<p>我们平时接触到的很多地方都用到了这个 Java Agent :</p>
<ul>
<li>各个 Java IDE 的调试功能,例如 eclipse、IntelliJ IDEA;</li>
<li>热部署功能,例如 JRebel、XRebel、 spring-loaded;</li>
<li>各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas;</li>
<li>各种性能分析工具,例如 Visual VM、JConsole 等;</li>
</ul>
<p>Java Agent 最终以 jar 包的形式存在,我们也只能以调用 jar 包的方式去调用它。</p>
<h2 id="Java-Agent-快速入门"><a href="#Java-Agent-快速入门" class="headerlink" title="Java Agent 快速入门"></a>Java Agent 快速入门</h2><p>接下来就来实现一个简单的 Java Agent,基于 J</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Spring 内存马</title>
<link href="https://changeyourway.github.io/2024/10/21/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Spring%E5%86%85%E5%AD%98%E9%A9%AC/"/>
<id>https://changeyourway.github.io/2024/10/21/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Spring%E5%86%85%E5%AD%98%E9%A9%AC/</id>
<published>2024-10-21T04:00:00.000Z</published>
<updated>2026-03-22T15:51:19.339Z</updated>
<summary type="html"><h2 id="Spring-概念总结"><a href="#Spring-概念总结" class="headerlink" title="Spring 概念总结"></a>Spring 概念总结</h2><p>本节的前置知识是 Spring、SpringBoot、SpringMVC 。这里总结一下基本问题:</p>
<h3 id="Spring-Framework"><a href="#Spring-Framework" class="headerlink" title="Spring Framework"></a><strong>Spring Framework</strong></h3><p>Spring 是一个全功能的 Java 应用开发框架,提供核心容器功能、AOP、数据访问等模块。</p>
<ul>
<li><strong>IoC(控制反转)容器</strong>:对 Java 对象的控制权由用户转移到 Spring IOC 容器,通过依赖注入(DI)管理对象的创建和依赖关系。</li>
<li><strong>AOP(面向切面编程)</strong>:通过定义通知无侵入式的对切入点方法进行功能增强。</li>
<li><strong>事务管理</strong>:提供声明式和编程式事务管理,支持数据库事务和其他资源的管理。</li>
<li><strong>DAO 支持</strong>:整合 JDBC、Hibernate、JPA 等数据访问框架。</li>
<li><strong>Context</strong>:ApplicationContext 作为核心容器,管理 Bean 的生命周期和依赖注入。</li>
</ul>
<h4 id="Spring-常用注解"><a href="#Spring-常用注解" class="headerlink" title</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Tomcat 内存马</title>
<link href="https://changeyourway.github.io/2024/09/26/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Tomcat%E5%86%85%E5%AD%98%E9%A9%AC/"/>
<id>https://changeyourway.github.io/2024/09/26/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Tomcat%E5%86%85%E5%AD%98%E9%A9%AC/</id>
<published>2024-09-26T04:10:00.000Z</published>
<updated>2026-03-22T15:50:51.981Z</updated>
<summary type="html"><h2 id="Servlet-动态注册机制"><a href="#Servlet-动态注册机制" class="headerlink" title="Servlet 动态注册机制"></a>Servlet 动态注册机制</h2><p>Servlet API 提供了动态注册机制,允许在运行时动态注册 Servlets、Filters 和 Listeners,而不需要通过 <code>web.xml</code> 文件或者注解进行静态配置。这种机制从 Servlet 3.0 开始引入,提供了更灵活的方式来配置 Web 应用组件,特别是对于基于注解和自动配置的现代 Web 应用非常有用。</p>
<p>在 ServletContext 类中提供了一系列 addServlet、addFilter、addListener 方法来提供动态注册功能。</p>
<h2 id="内存马初探"><a href="#内存马初探" class="headerlink" title="内存马初探"></a>内存马初探</h2><p>学习内存马需要先掌握 JavaWeb ,尤其是三大组件(Servlet、Filter、Listener)和 jsp 的知识。这部分因为我已经学过了,我就不再写博客来说明了。</p>
<p>此外建议看完前一篇文章 Tomcat 架构再来哦~</p>
<p>那么先来展示一个简单的内存马:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Tomcat 架构</title>
<link href="https://changeyourway.github.io/2024/09/26/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Tomcat%E6%9E%B6%E6%9E%84/"/>
<id>https://changeyourway.github.io/2024/09/26/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Tomcat%E6%9E%B6%E6%9E%84/</id>
<published>2024-09-26T04:00:00.000Z</published>
<updated>2026-03-22T15:49:46.408Z</updated>
<summary type="html"><h2 id="Tomcat-介绍"><a href="#Tomcat-介绍" class="headerlink" title="Tomcat 介绍"></a>Tomcat 介绍</h2><p>Tomcat 是 Apache 软件基金会开发的一个开源 Java Servlet 容器,用于运行 Java Web 应用程序。它实现了多个 Java EE 规范,如 Servlet、JSP(Java Server Pages)和 WebSocket 等,主要用于处理动态网页请求。作为一个轻量级的应用服务器,Tomcat 常用于开发和测试环境中,同时也适用于生产环境中的中小型应用。</p>
<h2 id="Tomcat-架构"><a href="#Tomcat-架构" class="headerlink" title="Tomcat 架构"></a>Tomcat 架构</h2><p>在 Tomcat Server 中,核心架构主要由三个组件组成:<strong>Service</strong>、<strong>Connector</strong> 和 <strong>Container</strong>。它们共同构成了 Tomcat 的请求处理和应用管理机制。</p>
<img src="/images/Tomcat-2.png">
<p>以下是对这三个组件的介绍:</p>
<h3 id="Service-服务"><a href="#Service-服务" class="headerlink" title="Service (服务)"></a>Service (服务)</h3><ul>
<li><strong>功能</strong>:<code>Service</code> 是 Tomcat 中用于组织和管理多个 <code>Connector</code> 和一个 <code></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Fastjson 反序列化</title>
<link href="https://changeyourway.github.io/2024/09/18/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Fastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
<id>https://changeyourway.github.io/2024/09/18/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Fastjson%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/</id>
<published>2024-09-18T04:00:00.000Z</published>
<updated>2026-03-22T15:49:25.933Z</updated>
<summary type="html"><h2 id="Fastjson-介绍"><a href="#Fastjson-介绍" class="headerlink" title="Fastjson 介绍"></a>Fastjson 介绍</h2><p>Fastjson 是阿里巴巴开发的一个高性能 JSON 解析库,广泛应用于 Java 项目中。它的主要功能是对 JSON 数据进行序列化和反序列化,即将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串解析为 Java 对象。Fastjson 的优势在于其速度和灵活性,特别是在处理大规模数据时性能表现良好。</p>
<h3 id="快速入门"><a href="#快速入门" class="headerlink" title="快速入门"></a>快速入门</h3><p>导入如下依赖:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependencies&gt;</span><br><span class="line"> &lt;dependency&gt;</span><br><span class="</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - 关于 JEP 290</title>
<link href="https://changeyourway.github.io/2024/09/08/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-%E5%85%B3%E4%BA%8EJEP290/"/>
<id>https://changeyourway.github.io/2024/09/08/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-%E5%85%B3%E4%BA%8EJEP290/</id>
<published>2024-09-08T04:00:00.000Z</published>
<updated>2026-03-22T15:49:08.223Z</updated>
<summary type="html"><h2 id="JEP-290"><a href="#JEP-290" class="headerlink" title="JEP 290"></a>JEP 290</h2><p>JEP290 是 Java 底层为了缓解反序列化攻击提出的一种解决方案。这是一个针对 JAVA 9 提出的安全特性,但同时对 JDK 6,7,8 都进行了支持,在 JDK 6u141、JDK 7u131、JDK 8u121 版本进行了更新。</p>
<p>JEP 290 主要提供了以下几个机制:</p>
<ul>
<li>用黑白名单的方式限制可反序列化的类;</li>
<li>限制反序列化的调用深度和复杂度;</li>
<li>为 RMI export 的对象设置了验证机制;</li>
<li>提供一个全局过滤器,可以在 properties 或配置文件中进行配置;</li>
</ul>
<p>现在使用 JDK 8u392 ,再次运行 ysoserial 中的 payloads&#x2F;JRMPListener 和 exploit&#x2F;JRMPClient ,会爆出如下错误:</p>
<img src="/images/image-20240908125709750.png">
<p>这在我之前的分析文章中也提到过,是由于 JEP 290 机制阻止了我反序列化 HashSet 类。</p>
<p>从报错信息中,可以发现一个 ObjectInputFilter 接口,其中定义了三种状态,分别是未定义、接受和拒绝:</p>
<img src="/images/image-20240908125941036.png">
<p>另外从报错信息中发现 ObjectInputStream 有一个 filterCheck 方法,这个方法与反序列化的检查相关:</p>
<figure class="h</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - JNDI 注入详解</title>
<link href="https://changeyourway.github.io/2024/09/06/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-JNDI%E6%B3%A8%E5%85%A5%E8%AF%A6%E8%A7%A3/"/>
<id>https://changeyourway.github.io/2024/09/06/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-JNDI%E6%B3%A8%E5%85%A5%E8%AF%A6%E8%A7%A3/</id>
<published>2024-09-06T04:00:00.000Z</published>
<updated>2026-03-22T15:56:41.124Z</updated>
<summary type="html"><h2 id="JNDI-基础"><a href="#JNDI-基础" class="headerlink" title="JNDI 基础"></a>JNDI 基础</h2><p>JNDI 全称为 <strong>Java Naming and Directory Interface</strong>,即 Java 名称与目录接口。JNDI 提供了一种统一的接口来访问不同的命名和目录服务。它被广泛应用于企业级 Java 应用程序中,用于查找和访问各种资源,如数据库连接、EJB(Enterprise JavaBeans)组件、消息队列、环境变量等。</p>
<p>那么提到命名和目录服务,就有一些名词需要了解一下。</p>
<h3 id="命名服务(Naming-Service)"><a href="#命名服务(Naming-Service)" class="headerlink" title="命名服务(Naming Service)"></a>命名服务(Naming Service)</h3><p>所谓命名服务,就是通过名称查找实际对象的服务。比如:</p>
<ul>
<li>DNS:通过域名查找实际的 IP 地址;</li>
<li>文件系统:通过文件名定位到具体的文件;</li>
</ul>
<p>在命名服务中有一些重要的概念:</p>
<ul>
<li><strong>Bindings</strong>:表示一个名称和对应对象的绑定关系。</li>
<li><strong>Context</strong>:上下文,它是一个容器,代表了一个命名空间或环境,用户可以在其中查找、绑定和管理名字与对象之间的关联。</li>
<li><strong>References</strong>:引用,它用于表示某个名字所对应的对象的“指针”或“引用路径”。通过引用,命名服务能够提供对</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - ysoserial 的 JRMP 模块分析</title>
<link href="https://changeyourway.github.io/2024/08/28/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-ysoserial%E7%9A%84JRMP%E6%A8%A1%E5%9D%97%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/08/28/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-ysoserial%E7%9A%84JRMP%E6%A8%A1%E5%9D%97%E5%88%86%E6%9E%90/</id>
<published>2024-08-28T04:10:00.000Z</published>
<updated>2026-03-22T15:56:17.803Z</updated>
<summary type="html"><h2 id="JRMP-协议介绍"><a href="#JRMP-协议介绍" class="headerlink" title="JRMP 协议介绍"></a>JRMP 协议介绍</h2><p>JRMP(Java Remote Method Protocol)是为 Java RMI 设计的专有协议,负责处理 RMI 调用的实际网络传输。它是基于 TCP 的,确保了通信的可靠性和有序性。也就是说:RMI 使用 JRMP 协议来处理网络通信。</p>
<p>当然,RMI 并不止支持 JRMP 这一种协议,还可以使用比如 IIOP 协议来进行网络通信。</p>
<h2 id="ysoserial-中的-JRMP-模块"><a href="#ysoserial-中的-JRMP-模块" class="headerlink" title="ysoserial 中的 JRMP 模块"></a>ysoserial 中的 JRMP 模块</h2><p>通常有两种利用方式。</p>
<p>第一种:payloads&#x2F;JRMPListener + exploit&#x2F;JRMPClient </p>
<p>第二种:exploit&#x2F;JRMPListener + payloads&#x2F;JRMPClient </p>
<p>接下来我们会逐个分析这四个类。</p>
<h3 id="payloads-JRMPListener-exploit-JRMPClient"><a href="#payloads-JRMPListener-exploit-JRMPClient" class="headerlink" title="payloads&#x2F;JRMPListener + exploit&#x2F;JRMPClient"></a>payloads&#x2F;JRMPList</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - RMI 相关的攻击</title>
<link href="https://changeyourway.github.io/2024/08/28/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-RMI%E7%9B%B8%E5%85%B3%E7%9A%84%E6%94%BB%E5%87%BB/"/>
<id>https://changeyourway.github.io/2024/08/28/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-RMI%E7%9B%B8%E5%85%B3%E7%9A%84%E6%94%BB%E5%87%BB/</id>
<published>2024-08-28T04:00:00.000Z</published>
<updated>2026-03-22T15:55:56.353Z</updated>
<summary type="html"><h2 id="攻击-RMI"><a href="#攻击-RMI" class="headerlink" title="攻击 RMI"></a>攻击 RMI</h2><p>前置知识:<a href="https://changeyourway.github.io/2024/07/08/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-RMI%E8%BF%9C%E7%A8%8B%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%8E%B7%E5%8F%96-Registry-%E4%BB%A3%E7%90%86%E5%AF%B9%E8%B1%A1">基础篇 - RMI 协议详解</a> </p>
<p>我们可以将参与 RMI 远程调用的角色分为三个:Server 端、Registry 端、Client 端(一般来说 Server 端和 Registry 端在一起),它们三者之间都会进行通信,并且全部的通信流程均通过序列化与反序列化实现。基于此,我们可以实现反序列化攻击。</p>
<h3 id="攻击-Server-端"><a href="#攻击-Server-端" class="headerlink" title="攻击 Server 端"></a>攻击 Server 端</h3><h4 id="参数反序列化"><a href="#参数反序列化" class="headerlink" title="参数反序列化"></a>参数反序列化</h4><p>如果服务端提供的服务对象参数是 Object 类型,那么意味着客户端远程调用时可以传递任意类型的参数,这个参数将会被序列化发送到服务端,然后在服务端反序</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - RMI 协议详解</title>
<link href="https://changeyourway.github.io/2024/07/08/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-RMI%E8%BF%9C%E7%A8%8B%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/"/>
<id>https://changeyourway.github.io/2024/07/08/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-RMI%E8%BF%9C%E7%A8%8B%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/</id>
<published>2024-07-08T04:00:00.000Z</published>
<updated>2026-03-22T15:55:38.594Z</updated>
<summary type="html"><p>RMI 入门案例及源码分析</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Javassist 使用指南</title>
<link href="https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-javassist%E7%94%A8%E6%B3%95%E6%8C%87%E5%8D%97/"/>
<id>https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-javassist%E7%94%A8%E6%B3%95%E6%8C%87%E5%8D%97/</id>
<published>2024-06-07T04:20:00.000Z</published>
<updated>2026-03-22T15:48:34.008Z</updated>
<summary type="html"><p>Javassist 是一个用于操作 Java 字节码的类库。Java 字节码存储在类文件的二进制文件中。每个类文件都包含一个 Java 类或接口。<br>类 Javassist.CtClass 是对类文件的抽象表示。(编译时类 CtClass )对象是处理类文件的句柄(句柄 Handle 是一个用来标识对象或者项目的标识符)。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Rome 链之 HotSwappableTargetSource 利用链</title>
<link href="https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Rome%E9%93%BE%E4%B9%8BHotSwappableTargetSource%E9%93%BE/"/>
<id>https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Rome%E9%93%BE%E4%B9%8BHotSwappableTargetSource%E9%93%BE/</id>
<published>2024-06-07T04:10:00.000Z</published>
<updated>2026-03-22T15:48:02.887Z</updated>
<summary type="html"><p>HotSwappableTargetSource 是在 Spring AOP 中出现的一个类。作用是可以在代理 bean 运行过程中,动态更新实际 bean 对象。HotSwappableTargetSource 类实现了 TargetSource 接口。对外暴露 getTarget 方法,提供真正的 target 对象。再说的明白一点,HotSwappableTargetSource 是对真正 target 对象的封装。在 Spring 的源码中,体现在 JdkDynamicAopProxy 中的 invoke 方法中。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Java 反序列化之 Rome 链</title>
<link href="https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Rome%E5%88%A9%E7%94%A8%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/06/07/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-Rome%E5%88%A9%E7%94%A8%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-06-07T04:00:00.000Z</published>
<updated>2026-03-22T15:47:41.308Z</updated>
<summary type="html"><p>ROME 是一个强大的 Java 库,用于解析和生成各种格式的 RSS 和 Atom feeds 。它兼容多种版本的 RSS(包括 RSS 0.90、0.91、0.92、0.93、0.94、1.0 和 2.0 )和 Atom(包括 0.3 和 1.0 )。ROME 提供了一个统一的 API ,简化了处理不同 feed 格式的复杂性。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Java 反序列化之 CC4+CC2+CC5+CC7 链</title>
<link href="https://changeyourway.github.io/2024/06/05/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC4+CC2+CC5+CC7%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/06/05/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC4+CC2+CC5+CC7%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-06-05T04:00:00.000Z</published>
<updated>2026-03-22T15:47:14.118Z</updated>
<summary type="html"><h2 id="CC4-链"><a href="#CC4-链" class="headerlink" title="CC4 链"></a>CC4 链</h2><p>在 Commons Collections 版本为 3.2.1 的背景下,可以使用 TransformedMap 或者 LazyMap 来执行 transform 方法,但当 Commons Collections 的版本提升到 4.0 时,就又多出了一种办法:利用 TransformingComparator 来执行 transform 方法。</p>
<p>先前我们将 AnnotationInvocationHandler 和 HashMap 作为入口类,利用它们的 readObject 方法来反序列化,但是现在我们还可以利用 PriorityQueue 的 readObject 来反序列化。</p>
<p><strong>实验环境</strong> </p>
<ul>
<li>java &#x3D; 8u65</li>
<li>CommonsCollections &#x3D; 4.0</li>
</ul>
<p>pom.xml 中导入如下依赖:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt</summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Java 反序列化之 CC3 链</title>
<link href="https://changeyourway.github.io/2024/05/27/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC3%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/05/27/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC3%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-05-27T04:00:00.000Z</published>
<updated>2026-03-22T15:46:56.680Z</updated>
<summary type="html"><p>CC3 链的核心在于利用 TemplatesImpl 加载恶意类时执行静态代码块。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>内网渗透 03 - 隧道通信</title>
<link href="https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F03-%E9%9A%A7%E9%81%93%E9%80%9A%E4%BF%A1/"/>
<id>https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F03-%E9%9A%A7%E9%81%93%E9%80%9A%E4%BF%A1/</id>
<published>2024-05-16T04:20:00.000Z</published>
<updated>2026-03-22T15:46:32.736Z</updated>
<summary type="html"><p>网络隧道技术指的是利用一种网络协议来传输另一种网络协议,它主要利用网络隧道协议来实现这种功能。网络隧道技术涉及了三种网络协议,即网络隧道协议、隧道协议下面的承载协议和隧道协议所承载的被承载协议。</p></summary>
<category term="内网渗透" scheme="https://changeyourway.github.io/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
</entry>
<entry>
<title>内网渗透 02 - 端口扫描</title>
<link href="https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F02-%E5%86%85%E7%BD%91%E6%89%AB%E6%8F%8F/"/>
<id>https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F02-%E5%86%85%E7%BD%91%E6%89%AB%E6%8F%8F/</id>
<published>2024-05-16T04:10:00.000Z</published>
<updated>2026-03-22T15:46:24.005Z</updated>
<summary type="html"><p>收集内网 IP ,进行端口扫描。</p></summary>
<category term="内网渗透" scheme="https://changeyourway.github.io/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
</entry>
<entry>
<title>内网渗透 01 - 端口转发</title>
<link href="https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F01-%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/"/>
<id>https://changeyourway.github.io/2024/05/16/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F01-%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/</id>
<published>2024-05-16T04:00:00.000Z</published>
<updated>2026-03-22T15:46:02.824Z</updated>
<summary type="html"><p>在进行渗透测试过程中会遇到内网中的其他机器是不允许外网机器访问的,因此需要通过端口转发(即隧道)或将得到的外网服务器设置为代理,使得攻击机可以直接访问并操作内网中的其他机器,这一过程就叫做内网转发。</p></summary>
<category term="内网渗透" scheme="https://changeyourway.github.io/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
</entry>
<entry>
<title>漏洞篇 - Java 反序列化之 CC6 链</title>
<link href="https://changeyourway.github.io/2024/05/13/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC6%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/05/13/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC6%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-05-13T04:00:00.000Z</published>
<updated>2026-03-22T15:45:30.939Z</updated>
<summary type="html"><p>前面在分析 CC1链 的 ysoserial 版时,我们知道 LazyMap 的 get 方法会调用成员属性 factory 的 transform 方法,而我们上一次是通过 AnnotationInvocationHandler 的 invoke 方法来调用这个 get 方法的。那么还有哪里能调用 LazyMap 的 get 方法呢?我们的 CC6 链给出了另一条路径:TiedMapEntry 类的 getValue 方法会调用成员属性的 get 方法。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - CC1 链之 ysoserial 版</title>
<link href="https://changeyourway.github.io/2024/05/12/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC1%E9%93%BEysoserial%E7%89%88/"/>
<id>https://changeyourway.github.io/2024/05/12/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC1%E9%93%BEysoserial%E7%89%88/</id>
<published>2024-05-12T04:10:00.000Z</published>
<updated>2026-03-22T15:45:11.081Z</updated>
<summary type="html"><p>在前面学习 CC1 链时,我们使用 TransformedMap 作为利用链,但其实除了 TransformedMap 之外,还有 DefaultedMap 和 LazyMap 也可以作为利用链,它们都在 org.apache.commons.collections.map 包下。这一节我们来分析 ysoserial 工具中利用的 CC1 链,它是将 LazyMap 作为利用链的。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>配置篇 - IDEA 查看带 sun 包的 JDK 源码</title>
<link href="https://changeyourway.github.io/2024/05/12/Java%20%E5%AE%89%E5%85%A8/%E9%85%8D%E7%BD%AE%E7%AF%87-idea%E6%9F%A5%E7%9C%8BJDK%E5%92%8C%E4%BE%9D%E8%B5%96%E7%9A%84%E6%BA%90%E7%A0%81/"/>
<id>https://changeyourway.github.io/2024/05/12/Java%20%E5%AE%89%E5%85%A8/%E9%85%8D%E7%BD%AE%E7%AF%87-idea%E6%9F%A5%E7%9C%8BJDK%E5%92%8C%E4%BE%9D%E8%B5%96%E7%9A%84%E6%BA%90%E7%A0%81/</id>
<published>2024-05-12T04:00:00.000Z</published>
<updated>2026-03-22T15:44:44.182Z</updated>
<summary type="html"><p>前言:前面在分析初始版本 CC1 链的时候,查看 sun 包里的 AnnotationInvocationHandler 类的源码,发现变量名全都是 var 开头,非常不便于阅读,接下来将介绍如何使用 IDEA 查看带 sun 包的 JDK 源码,以及导入的依赖源码,这里的源码指的是 .java 文件。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Java 动态代理</title>
<link href="https://changeyourway.github.io/2024/05/11/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/"/>
<id>https://changeyourway.github.io/2024/05/11/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/</id>
<published>2024-05-11T04:00:00.000Z</published>
<updated>2026-03-22T15:44:19.939Z</updated>
<summary type="html"><p>在 Java 动态代理中,代理对象能够通过调用 invoke 方法来增强被代理对象的原始方法。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>配置篇 - Maven 手动下载与导入依赖</title>
<link href="https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E9%85%8D%E7%BD%AE%E7%AF%87-Maven%E6%89%8B%E5%8A%A8%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AF%BC%E5%85%A5%E4%BE%9D%E8%B5%96/"/>
<id>https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E9%85%8D%E7%BD%AE%E7%AF%87-Maven%E6%89%8B%E5%8A%A8%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AF%BC%E5%85%A5%E4%BE%9D%E8%B5%96/</id>
<published>2024-05-10T04:40:00.000Z</published>
<updated>2026-03-22T15:43:39.352Z</updated>
<summary type="html"><p>遇到 maven 无法自动导入的依赖怎么办,本文介绍了如何手动下载与导入 maven 依赖</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - Java 反序列化之 CC1 链</title>
<link href="https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC1%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-CC1%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-05-10T04:30:00.000Z</published>
<updated>2026-03-22T15:43:00.936Z</updated>
<summary type="html"><p>Apache Commons Collections 是对 java.util.Collection 的扩展,对常用的集合操作进行了很好的封装、抽象和补充,在保证性能的同时大大简化代码。CC 链正是在 Commons Collections 包中的反序列化利用链,本次介绍的是 CC1 链。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>漏洞篇 - URLDNS 利用链分析</title>
<link href="https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-URLDNS%E5%88%A9%E7%94%A8%E9%93%BE%E5%88%86%E6%9E%90/"/>
<id>https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E6%BC%8F%E6%B4%9E%E7%AF%87-URLDNS%E5%88%A9%E7%94%A8%E9%93%BE%E5%88%86%E6%9E%90/</id>
<published>2024-05-10T04:20:00.000Z</published>
<updated>2026-03-22T15:42:41.845Z</updated>
<summary type="html"><p>本文详尽地讲述了 URLDNS 反序列化利用链的原理</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Java 的类加载与反射</title>
<link href="https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E7%9A%84%E7%B1%BB%E5%8A%A0%E8%BD%BD%E4%B8%8E%E5%8F%8D%E5%B0%84/"/>
<id>https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E7%9A%84%E7%B1%BB%E5%8A%A0%E8%BD%BD%E4%B8%8E%E5%8F%8D%E5%B0%84/</id>
<published>2024-05-10T04:10:00.000Z</published>
<updated>2026-03-22T15:41:58.844Z</updated>
<summary type="html"><p>本文介绍了 Java 的类加载与反射机制,概括了获得 Class 对象的几种方式,以及总结了反射获取类信息的方法。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
<entry>
<title>基础篇 - Java 序列化与反序列化</title>
<link href="https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
<id>https://changeyourway.github.io/2024/05/10/Java%20%E5%AE%89%E5%85%A8/%E5%9F%BA%E7%A1%80%E7%AF%87-Java%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/</id>
<published>2024-05-10T04:00:00.000Z</published>
<updated>2026-03-22T15:41:33.829Z</updated>
<summary type="html"><p>Java 序列化是指把 Java 对象转换为字节序列的过程,而 Java 反序列化是指把字节序列恢复为 Java 对象的过程。本文详细讲解了 Java 序列化与反序列化的实现。</p></summary>
<category term="Java 安全" scheme="https://changeyourway.github.io/categories/Java-%E5%AE%89%E5%85%A8/"/>
</entry>
</feed>