* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को हैकट्रिक्स में विज्ञापित करना चाहते हैं**? या क्या आपको **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की इच्छा है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFT**](https://opensea.io/collection/the-peass-family) संग्रह
* [**आधिकारिक PEASS & HackTricks swag**](https://peass.creator-spring.com) प्राप्त करें
* [**💬**](https://emojipedia.org/speech-balloon/) [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में **शामिल हों** या मुझे **ट्विटर** पर **फ़ॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
**सीरीयलाइज़ेशन** एक ऐसी प्रक्रिया है जिसमें किसी ऑब्जेक्ट को एक डेटा प्रारूप में बदला जाता है जिसे बाद में पुनर्स्थापित किया जा सकता है। लोग अक्सर ऑब्जेक्ट को सीरीयलाइज़ करते हैं ताकि उन्हें संग्रहण में सहेजा जा सके, या संचार का हिस्सा के रूप में भेजा जा सके।
**डेसीरियलाइज़ेशन** उस प्रक्रिया का उल्टा है, जिसमें किसी फ़ॉर्मेट से संरचित डेटा को ले जाकर उसे एक ऑब्जेक्ट में पुनर्निर्मित किया जाता है। आजकल, डेटा को सीरीयलाइज़ करने के लिए सबसे लोकप्रिय डेटा प्रारूप JSON है। इससे पहले, यह XML था।
**आपको पढ़ना चाहिए:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **अटैक करने के लिए कैसे सीखें।**
*`__wakeup` जब एक ऑब्जेक्ट को डेसीरियलाइज़ किया जाता है तो यह कॉल होता है।
*`__unserialize` यदि यह मौजूद होता है तो `__wakeup` के बजाय यह कॉल होता है।
*`__destruct` PHP स्क्रिप्ट समाप्त होने पर और ऑब्जेक्ट नष्ट होने पर कॉल होता है।
*`__toString` ऑब्जेक्ट को स्ट्रिंग के रूप में उपयोग करता है लेकिन इसके अलावा इसमें फ़ंक्शन कॉल के आधार पर फ़ाइल पढ़ने या इससे अधिक कुछ करने के लिए भी उपयोग किया जा सकता है।
यदि आप परिणामों की ओर देखें, तो आप देख सकते हैं कि जब ऑब्जेक्ट को डीसीरियलाइज किया जाता है, तो फ़ंक्शन **`__wakeup`** और **`__destruct`** को कॉल किया जाता है। ध्यान दें कि कई ट्यूटोरियल में आपको मिलेगा कि जब कोई विशेषता प्रिंट करने की कोशिश करते हैं, तो **अब वह नहीं हो रहा है**.
यदि कक्षा में इसे लागू किया जाता है, तो **`__wakeup()` के बजाय `__unserialize(array $data)`** विधि को कॉल किया जाता है। यह आपको ऑब्जेक्ट को अनसीरियलाइज करने की अनुमति देता है और अर्रेय के रूप में सीरियलाइज किए गए डेटा को प्रदान करता है। आप इस विधि का उपयोग करके गुणों को अनसीरियलाइज कर सकते हैं और डीसीरियलाइजेशन पर आवश्यक कार्यों को कर सकते हैं।
आप एक PHP उदाहरण यहां पढ़ सकते हैं: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), यहां [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) या यहां [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
ध्यान दें कि कई मामलों में आपको एक ऐसा तरीका नहीं मिलेगा कि आप एप्लिकेशन के स्रोत कोड में डिसीरियलाइज़ेशन का दुरुपयोग करें, लेकिन आप PHP के बाहरी एक्सटेंशन के कोड का दुरुपयोग कर सकते हैं।\
तो, यदि संभव हो सके तो, सर्वर की `phpinfo()` की जांच करें और इंटरनेट पर खोजें (और **PHPGGC** के **गैजेट्स** पर भी) कुछ संभावित गैजेट जिनका आप दुरुपयोग कर सकते हैं।
यदि आपने एक LFI खोजा है जो केवल फ़ाइल को पढ़ रहा है और उसमें php कोड को नहीं चला रहा है, उदाहरण के लिए _**file\_get\_contents(), fopen(), file() या file\_exists(), md5\_file(), filemtime() या filesize()**_**_ जैसे फ़ंक्शनों का उपयोग करके। आप एक **डिसीरियलाइज़ेशन** का दुरुपयोग करने की कोशिश कर सकते हैं जो होता है जब एक **फ़ाइल** को **phar** प्रोटोकॉल का उपयोग करके **पढ़ा** जाता है।\
निम्नलिखित पृष्ठ में यह तकनीक प्रस्तुत की गई है कि कैसे यामल्स पायथन पुस्तकालयों में एक असुरक्षित डिसीरियलाइज़ेशन का दुरुपयोग किया जा सकता है और इसके साथ एक उपकरण भी है जिसका उपयोग करके **Pickle, PyYAML, jsonpickle और ruamel.yaml** के लिए RCE डिसीरियलाइज़ेशन पेलोड उत्पन्न किया जा सकता है:
JS **PHP या पायथन की तरह "जादूई" फ़ंक्शन नहीं** है जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित होंगे। लेकिन इसमें कुछ **फ़ंक्शन** हैं जो **सीधे बुलाए जाने के बिना भी अक्सर उपयोग होते हैं** जैसे **`toString`**, **`valueOf`**, **`toJSON`**।\
यदि डिसीरियलाइज़ेशन का दुरुपयोग करके आप इन फ़ंक्शनों को **कंप्रोमाइज़** करते हैं ताकि वे अन्य कोड को निष्पादित कर सकें** (संभावित रूप से प्रोटोटाइप प्रदूषण का दुरुपयोग करके) तो जब उन्हें बुलाया जाएगा तो आप विचारहीन कोड को निष्पादित कर सकते हैं।
एक और **"जादूई" तरीका एक फ़ंक्शन को** सीधे बुलाने के बिना बुलाने का है एक **ऐसे ऑब्जेक्ट को कंप्रोमाइज़ करना जो एक एसिंक फ़ंक्शन द्वारा वापस दिया जाता है** (प्रॉमिस)। क्योंकि, यदि आप उस **वापसी ऑब्जेक्ट** को एक और **प्रॉमिस** में बदल देते हैं जिसमें एक **"then"** नामक **गुण** होता है जिसका प्रकार फ़ंक्शन होता है, तो यह इसलिए **निष्पादित** होगा क्योंकि यह दूसरे प्रॉमिस द्वारा वापस दिया जाता है। _अधिक जानकारी के लिए_ [_**इस लिंक**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _पर जाएं।_
जैसा कि आप अंतिम कोड टुकड़े में देख सकते हैं, **अगर फ़्लैग मिल जाता है** तो `eval` का उपयोग फ़ंक्शन को डीसीरीयलाइज़ करने के लिए किया जाता है, इसलिए मूल रूप से **उपयोगकर्ता इनपुट `eval` फ़ंक्शन के अंदर का उपयोग किया जाता है**।
हालांकि, केवल एक फ़ंक्शन को सीरीयलाइज़ करने से उसे नहीं चलाया जा सकता है क्योंकि इसके लिए कोड के किसी हिस्से में होना चाहिए कि हमारे उदाहरण में `y.rce` को कॉल किया जाए और यह बहुत ही **असंभाव्य** है।
फिर भी, आप सीरीयलाइज़ किए गए ऑब्जेक्ट में कुछ परेंथेसिस जोड़कर सीरीयलाइज़ किए गए फ़ंक्शन को ऑटोमेटिक रूप से चलाने के लिए उसे **संशोधित** कर सकते हैं।
अगले कोड टुकड़े में **अंतिम परेंथेसिस** का ध्यान दें और कैसे `unserialize` फ़ंक्शन आपकोड को ऑटोमेटिक रूप से चलाएगा:
जैसा पहले इंगित किया गया था, यह पुस्तकालय `_$$ND_FUNC$$_` के बाद कोड प्राप्त करेगी और `eval` का उपयोग करके इसे **चलाएगी**। इसलिए, कोड को **ऑटो-चलाने** के लिए आपको **फंक्शन निर्माण** भाग और अंतिम ब्रैकेट को हटा देना होगा और **बस एक JS वनलाइनर को चलाना** होगा, जैसा कि निम्न उदाहरण में दिखाया गया है:
आप इस विकल्पितता को शोधने के लिए [**यहां**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **अधिक जानकारी** पा सकते हैं।
यहां दिलचस्प अंतर है कि **मानक अंतर्निहित वस्तुएं अभिगम्य नहीं हैं**, क्योंकि वे बाहरी क्षेत्र में हैं। इसका अर्थ है कि हम अपना कोड चला सकते हैं, लेकिन बिल्ट-इन वस्तुओं के विधियों को नहीं बुला सकते हैं। इसलिए अगर हम `console.log()` या `require(something)` का उपयोग करते हैं, तो नोड एक अपवाद लौटाता है जैसे `"ReferenceError: console is not defined"`।
हालांकि, हम आसानी से सब कुछ तक पहुंच पा सकते हैं क्योंकि हमें अभी भी ग्लोबल संदर्भ का उपयोग करके ग्लोबल संदर्भ तक पहुंच है, जैसे `this.constructor.constructor("console.log(1111)")();`:
**अधिक जानकारी के लिए इस पेज को पढ़ें**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**।**
**पैकेज में कोई डीसीरियलाइज़ेशन कार्यक्षमता शामिल नहीं है और आपको इसे खुद लागू करने की आवश्यकता होती है।** उनका उदाहरण `eval` का सीधा उपयोग करता है। यह आधिकारिक डीसीरियलाइज़ेशन उदाहरण है:
जावा में डिसीरियलाइज़ किए गए ऑब्जेक्ट्स की मुख्य समस्या यह है कि **डिसीरियलाइज़ेशन के दौरान डिसीरियलाइज़ेशन कॉलबैक को आमंत्रित किया जाता है**। इससे एक **हमलावर** को **उस कॉलबैक का लाभ उठाने** और एक पेलोड तैयार करने की संभावना होती है जो कॉलबैक का दुरुपयोग करके **दुष्कर्मी कार्रवाई** करती है।
सीरीयलाइज़ेशन कक्षाओं और फ़ंक्शन के लिए कोड में खोजें। उदाहरण के लिए, `Serializable` को लागू करने वाली कक्षाओं, `java.io.ObjectInputStream` या `readObject` या `readUnshare` फ़ंक्शन का उपयोग करने की खोज करें।
*`application/x-java-serialized-object` पर सेट किए गए एचटीटीपी प्रतिक्रिया के `Content-type` हैडर
* पहले से संकुचित हेक्स में `1F 8B 08 00`
* पहले से संकुचित बेस64 में `H4sIA`
* वेब फ़ाइलें जिनमें एक्सटेंशन `.faces` और `faces.ViewState` पैरामीटर हैं। यदि आपको वेबऐप में यह मिलता है, तो [**जावा JSF VewState डिसीरियलाइज़ेशन**](java-jsf-viewstate-.faces-deserialization.md) के बारे में पोस्ट पर एक नज़र डालें।
### यदि आप जानना चाहते हैं कि जावा डिसीरियलाइज़ेशन अपशिष्ट कैसे काम करता है, तो आपको [**बेसिक जावा डिसीरियलाइज़ेशन**](basic-java-deserialization-objectinputstream-readobject.md), [**जावा DNS डिसीरियलाइज़ेशन**](java-dns-deserialization-and-gadgetprobe.md), और [**कॉमन्स कलेक्शन1 पेलोड**](java-transformers-to-rutime-exec-payload.md) पर नज़र डालनी चाहिए।
आप उन सभी पुस्तकालयों की जांच करने की कोशिश कर सकते हैं जिन्हें ज्ञात रूप से खुलासा किया गया है और जिनके लिए [**Ysoserial**](https://github.com/frohoff/ysoserial) एक उत्पादन कर सकता है। या आप [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) पर दिए गए पुस्तकालयों की जांच कर सकते हैं।\
आप [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) का भी उपयोग कर सकते हैं ताकि आप उपयोग करने योग्य संभावित गैजेट श्रृंखलाओं की खोज कर सकें जिन्हें उपयोग किया जा सकता है।\
**gadgetinspector** को चलाते समय (इसे बिल्ड करने के बाद) उसे जा रही चेतावनियों / त्रुटियों के बारे में चिंता न करें और उसे पूरा होने दें। यह सभी खोजों को _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ के तहत लिखेगा। कृपया ध्यान दें कि **gadgetinspector एक उत्पादन नहीं बनाएगा और यह गलत सकारात्मक नतीजे दिखा सकता है**।
बर्प एक्सटेंशन [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) का उपयोग करके आप **जांच सकते हैं कि कौन सी पुस्तकालयें उपलब्ध हैं** (और उनके संस्करण भी)। इस जानकारी के साथ, यह आसान हो सकता है कि आप किस payload का चयन करें जिससे संक्रमण की कमजोरी का उपयोग किया जा सके।\
[**गैजेटप्रोब के बारे में और अधिक जानने के लिए यह पढ़ें**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**।**\
GadgetProbe **`ObjectInputStream`** संक्रमण पर ध्यान केंद्रित है।
बर्प एक्सटेंशन [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) का उपयोग करके आप ysoserial के साथ उपयोग किया जा सकने वाली विकल्पयुक्त पुस्तकालयों की पहचान कर सकते हैं और उन्हें **शोषण** कर सकते हैं।\
[**जावा संक्रमण स्कैनर के बारे में और अधिक जानने के लिए यह पढ़ें।**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
जावा संक्रमण स्कैनर **`ObjectInputStream`** संक्रमण पर ध्यान केंद्रित है।
आप [**Freddy**](https://github.com/nccgroup/freddy) का उपयोग कर सकते हैं ताकि आप **बर्प** में संक्रमण की कमजोरियों की पहचान कर सकें। यह प्लगइन **केवल `ObjectInputStream`** संबंधित कमजोरियों की पहचान करेगा बल्कि **Json** और **Yml** संक्रमण पुस्तकालयों से भी vulns की पहचान करेगा। सक्रिय मोड में, यह सोए या DNS payloads का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।\
[**आप फ्रेडी के बारे में अधिक जानकारी यहां पा सकते हैं।**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
सभी चीजें यह नहीं हैं कि केवल यह जांचें कि क्या सर्वर द्वारा कोई भी कमजोर पुस्तकालय उपयोग की जा रही है। कभी-कभी आप संक्रमित ऑब्जेक्ट में डेटा बदल सकते हैं और कुछ जांचों को छलना कर सकते हैं (शायद वेबऐप में व्यवस्थापक विशेषाधिकार प्रदान करें)।\
यदि आपको एक जावा संक्रमित ऑब्जेक्ट मिलता है जो वेब एप्लिकेशन को भेजा जाता है, तो आप [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) का उपयोग कर सकते हैं ताकि आप उस संक्रमण ऑब्जेक्ट को मानव पठनीय स्वरूप में प्रिंट कर सकें। जानना कि आप कौन से डेटा भेज रहे हैं, उसे संशोधित करना और कुछ जांचों को छलना करना आसान होगा।
जावा संक्रमणों का शोषण करने के लिए सबसे अधिक जाना जाने वाला उपकरण है [**ysoserial**](https://github.com/frohoff/ysoserial) ([**यहां डाउनलोड करें**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))। आप [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) का भी उपयोग कर सकते हैं जिससे आप जटिल आदेश (उदाहरण के लिए पाइप के साथ) का उपयोग कर सकते हैं।\
ध्यान दें कि यह उपकरण **`ObjectInputStream`** के शोषण पर ध्यान केंद्रित है।\
मैं सलाह दूंगा कि आप पहले "URLDNS" payload का उपयोग करें और फिर RCE payload का उपयोग करें ताकि आप जांच सकें कि संक्रमण संभव है या नहीं। फिर भी, ध्यान दें कि शायद "URLDNS" payload काम नहीं कर रहा हो लेकिन अन्य RCE payload काम कर रहा हो।
जब **java.lang.Runtime.exec()** के लिए एक payload बनाते हैं, तो आप **">" या "|"** जैसे विशेष वर्ण उपयोग नहीं कर सकते हैं ताकि एक execution के आउटपुट को रीडायरेक्ट कर सकें, "$()" कोमांड्स को चलाने के लिए या यहां तक कि एक कमांड में **स्पेस** से अलग तत्वों को **पास** कर सकें (आप `echo -n "hello world"` कर सकते हैं लेकिन आप `python2 -c 'print "Hello world"'` नहीं कर सकते हैं)। पेलोड को सही ढंग से एनकोड करने के लिए आप [इस वेबपेज](http://www.jackson-t.ca/runtime-exec-payloads.html) का उपयोग कर सकते हैं।
विन्डोज और लिनक्स के लिए **सभी संभव** कोड एक्जीक्यूशन पेलोड्स बनाने और उन्हें विकल्पशील वेब पेज पर टेस्ट करने के लिए आगे दिए गए स्क्रिप्ट का उपयोग करें:
आप **https://github.com/pwntester/SerialKillerBypassGadgetCollection** का उपयोग कर सकते हैं जो ysoserial के साथ और अधिक एक्सप्लॉइट बनाने के लिए है। इस टूल के बारे में अधिक जानकारी टूल के प्रस्तावना के स्लाइड में है: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
[**मार्शलसेक**](https://github.com/mbechler/marshalsec) का उपयोग जावा में विभिन्न **Json** और **Yml** सीरियलाइज़ेशन पुस्तकालयों को अपनाने के लिए पेलोड उत्पन्न करने के लिए किया जा सकता है।\
इस जावा JSON पुस्तकालय के बारे में और अधिक जानें: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
* यदि आप कुछ ysoserial payloads का परीक्षण करना चाहते हैं तो आप **इस वेबऐप** को चला सकते हैं: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
`Serializable` का एक कक्षा उस कक्षा के भीतर किसी भी ऑब्जेक्ट को `transient` के रूप में लागू कर सकती है जो सीरीयलाइज़ किया नहीं जाना चाहिए। उदाहरण के लिए:
आपके कुछ अनुप्रयोग ऑब्जेक्ट को उनकी वंशवृद्धि के कारण `Serializable` को लागू करना पड़ सकता है। अपने अनुप्रयोग ऑब्जेक्ट को डिसीरियलाइज़ नहीं किया जा सकता होने की गारंटी देने के लिए, एक `readObject()` मेथड घोषित किया जाना चाहिए (जिसमें `final` संशोधक हो) जो हमेशा एक अपवाद फेंकता है:
`java.io.ObjectInputStream` क्लास का उपयोग ऑब्जेक्ट्स को डिसीरियलाइज़ करने के लिए किया जाता है। इसे सख्त बनाने के लिए इसका सबक्लास बनाना संभव है। यह सबसे अच्छा समाधान है अगर:
सामान्य विचार यह है कि [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) को ओवरराइड करें ताकि केवल वे क्लासेस डिसीरियलाइज़ करने के लिए अनुमति दी जा सके जिन्हें आप चाहते हैं।
यहां एक सरल उदाहरण दिखाया गया है, जहां `LookAheadObjectInputStream` क्लास को गारंटी है कि वह `Bicycle` क्लास के अलावा कोई अन्य टाइप डिसीरियलाइज़ नहीं करेगा:
यदि आपके पास कोड नहीं है या पैच का इंतजार नहीं कर सकते हैं, तो `java.io.ObjectInputStream` में हार्डनिंग को वोवेव करने के लिए एक एजेंट का उपयोग करना सबसे अच्छा समाधान है।
इस तरीके का उपयोग करके आप केवल ज्ञात खतरनाक प्रकारों को ब्लैकलिस्ट कर सकते हैं और उन्हें व्हाइटलिस्ट नहीं कर सकते हैं क्योंकि आपको नहीं पता होता कि कौन से ऑब्जेक्ट सीरियलाइज हो रहे हैं।
* Gadgetinspector के बारे में टॉक: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) और स्लाइड्स: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
जानें कि **JNDI Injection क्या है, इसे RMI, CORBA और LDAP के माध्यम से कैसे दुरुपयोग किया जाता है और log4shell को कैसे शोषित किया जाता है** (और इस दुरुपयोग का उदाहरण) निम्नलिखित पृष्ठ पर:
> **जावा संदेश सेवा** (**JMS**) एपीआई दो या अधिक क्लाइंटों के बीच संदेश भेजने के लिए एक जावा संदेश-अभिन्यासी मध्यवर्ती एपीआई है। यह उत्पादक-उपभोक्ता समस्या को हैंडल करने के लिए एक कार्यान्वयन है। JMS जावा प्लेटफॉर्म, एंटरप्राइज़ एडिशन (जावा ईई) का हिस्सा है और यह सूर्य माइक्रोसिस्टम्स द्वारा विकसित एक विनिर्देशित विनिर्माण द्वारा परिभाषित किया गया था, लेकिन जिसे बाद में जावा समुदाय प्रक्रिया ने मार्गदर्शन किया है। यह एक संदेश मानक है जो जावा ई पर आधारित अनुप्रयोग घटकों को संदेश बनाने, भेजने, प्राप्त करने और पढ़ने की अनुमति देता है। इसकी सहायता से वितरित एक अनुप्रयोग के विभिन्न घटकों के बीच संचार को ढीला, विश्वसनीय और असिंक्रोनस बनाने की अनुमति होती है। (विकिपीडिया से)।
इसलिए, मूल रूप से एक **समूह सेवाओं का उपयोग JMS का कर रहे हैं**। इसलिए, यदि आपके पास इन सेवाओं को संदेश भेजने के लिए पर्याप्त अधिकार हैं (आमतौर पर आपको मान्य प्रमाणिकरण की आवश्यकता होगी) तो आप **दुरुपयोग करने के लिए बनाए गए दुष्प्रभावी ऑब्जेक्ट्स को सीरीयलाइज़ कर सकते हैं जो कि उपभोक्ता/सदस्य द्वारा डेसीरियलाइज़ किए जाएंगे**।
इसका मतलब है कि इस शोषण में सभी **उन क्लाइंट्स को जो संदेश का उपयोग करेंगे, संक्रमित हो जाएंगे**।
आपको याद रखना चाहिए कि यदि एक सेवा संक्रमित होती है (क्योंकि यह उपयोगकर्ता इनपुट को असुरक्षित ढंग से डेसीरियलाइज़ कर रही है) तो आपको फिर भी मान्य गैजेट्स को खोजने की आवश्यकता होगी दुरुपयोग को शोषित करने के लिए।
आप बेस64 कोडित स्ट्रिंग **AAEAAAD/////** या किसी अन्य चीज की खोज कर सकते हैं जो पीछे की ओर से **डिसीरियलाइज़ किया जा सकता है** और जिसमें आपको डिसीरियलाइज़ करने वाले प्रकार को नियंत्रित करने की अनुमति होती है। उदाहरण के लिए, एक **JSON** या **XML** में `TypeObject` या `$type` हो सकता है।
इस मामले में आप उपकरण [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) का उपयोग कर सकते हैं ताकि आप **डिसीरियलाइज़ के उपयोग से उत्पन्न दुरुपयोग** बना सकें। जब आपने git रिपॉजिटरी डाउनलोड कर ली हो तो आपको उपकरण को कंपाइल करना होगा, उदाहरण के लिए Visual Studio का उपयोग करके।
यदि आप जानना चाहते हैं कि **ysoserial.net दुरुपयोग कैसे बनाता है**, तो आप [**इस पृष्ठ की जांच कर सकते हैं जहां ObjectDataProvider गैजेट + ExpandedWrapper + Json.Net फॉर्मेटर का विवरण दिया गया है**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
* **`--gadget`** इस्तेमाल किया जाता है ताकि दुरुपयोग करने के लिए गैजेट को दुरुपयोग किया जाए (डिसीरियलाइज़ करने के दौरान कमांड निष्पादित करने के लिए क्लास/फ़ंक्शन को दर्ज करें)।
* **`--formatter`**, इस्तेमाल किया जाता है ताकि दुरुपयोग को सीरियलाइज़ करने के लिए विधि को दर्ज किया जाए (आपको जानना होगा कि पीछे का उपयोग करने वाला लाइब्रेरी कौन सा है जिसे पेलोड को डिसीरियलाइज़ करने के लिए उपयोग किया जाता है और उसी का उपयोग करें)
* \*\*`--output` \*\* इस्तेमाल किया जाता है ताकि आप दुरुपयोग को **सीधा** या **बेस64 कोडित** प्रारूप में प्राप्त कर सकें। _ध्यान दें कि **ysoserial.net** पेलोड को **UTF-16LE** का उपयोग करके कोडित करेगा (विंडोज पर डिफ़ॉल्ट रूप से उपयोग की जाने वाली कोडिंग) इसलिए यदि आप रॉ डेटा प्राप्त करते हैं और उसे लिनक्स कंसोल से कोडित करते हैं तो आपको कुछ **कोडिंग संगतता समस्याएं** हो सकती हैं जो दुरुपयोग को सही ढंग से काम करने से रोकेंगी (HTB JSON बॉक्स में पेलोड UTF-16LE और ASCII दोनों में काम कर गया था लेकिन यह यह नहीं मतलब है कि यह हमेशा काम करेगा)।_
* \*\*`--plugin` \*\* ysoserial.net विशेष फ्रेमवर्क के लिए **दुरुपयोग बनाने के लिए प्लगइन्स** का समर्थन करता है, जैसे ViewState
*`--raf -f Json.Net -c "anything"` इससे उपयोग किए जाने वाले सभी गैजेट्स को दर्ज करेगा जो एक दिए गए फॉर्मेटर (`Json.Net` इस मामले में) के साथ उपयोग किए जा सकते हैं
*`--sf xml` आप एक गैजेट (`-g`) की घोषणा कर सकते हैं और ysoserial.net वे फॉर्मेटर खोजेगा जिनमें "xml" शब्द होता है (अवधिकारी नहीं होता है)
यदि आप इस पैरामीटर को निर्दिष्ट करते हैं, तो **ysoserial.net** लोकली एक्सप्लॉइट की कोशिश करेगा, इसलिए आप यह जांच सकते हैं कि आपका पेलोड सही ढंग से काम करेगा या नहीं।\
यह पैरामीटर मददगार है क्योंकि यदि आप कोड की समीक्षा करते हैं, तो आप निम्नलिखित तरह के कोड टुकड़ों को पाएंगे (यहां से: [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
इसका मतलब है कि एक्सप्लॉइट की परीक्षण के लिए कोड [serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) को कॉल करेगा।
**पिछले कोड में उत्पन्न खोज के प्रति असुरक्षित है।** इसलिए अगर आपको किसी .Net एप्लिकेशन में कुछ ऐसा मिलता है तो यह इसका मतलब है कि शायद वह एप्लिकेशन भी संकटग्रस्त है।\
इसलिए **`--test`** पैरामीटर हमें समझने में मदद करता है कि डेसीरियलाइज़ेशन खोज के लिए कौन से कोड टुकड़े संकटग्रस्त हैं, जिन्हें **ysoserial.net** बना सकता है।
[**इस पोस्ट को देखें जो .Net के \_\_ViewState पैरामीटर को उत्पन्न करने का प्रयास कैसे करें**](exploiting-\_\_viewstate-parameter.md) जिससे **अनियमित कोड को निष्पादित करें।** यदि आप **पहले से ही पीड़ित मशीन द्वारा उपयोग किए जाने वाले रहस्यों को जानते हैं**, तो [**इस पोस्ट को पढ़ें जिससे कोड को निष्पादित करने के बारे में जानें**](exploiting-\_\_viewstate-knowing-the-secret.md)**।**
डेटास्ट्रीम को निर्धारित करने दें कि स्ट्रीम को किस प्रकार के ऑब्जेक्ट के लिए डेसीरियलाइज़ किया जाएगा। आप इसे रोक सकते हैं उदाहरण के लिए `DataContractSerializer` या `XmlSerializer` का उपयोग करके।
यदि आपको डेटा स्ट्रीम को डिसीरियलाइज़ करना हो जो अपने खुद के टाइप को परिभाषित करती है, तो उन टाइप को सीमित करें जो डिसीरियलाइज़ किए जा सकते हैं। इसे अभिवेदन करना चाहिए कि यह फिर भी जोखिमपूर्ण है क्योंकि कई मूल .Net टाइप स्वतः में संभवतः खतरनाक हो सकते हैं। उदा.
`FileInfo` ऑब्जेक्ट जो सर्वर पर वास्तविक रूप से संदर्भित फ़ाइलों को संदर्भित करते हैं, जब डीसीरियलाइज़ किए जाते हैं, तो उन फ़ाइलों की गुणवत्ता को बदल सकते हैं, जैसे कि केवल पढ़ने योग्य, जो एक संकटात्मक विरोध हो सकता है।
यदि आपने सीमित किए हैं कि कौन से प्रकार डीसीरियलाइज़ किए जा सकते हैं, तो भी ध्यान दें कि कुछ प्रकारों में रिस्की गुणवत्ताएं हो सकती हैं। उदाहरण के लिए, `System.ComponentModel.DataAnnotations.ValidationException` में `Value` नामक एक `Object` प्रकार की प्रॉपर्टी होती है। यदि इस प्रकार को डीसीरियलाइज़ करने के लिए अनुमति है तो हमलावर `Value` प्रॉपर्टी को किसी भी वस्तु प्रकार पर सेट कर सकते हैं जो उनकी पसंद हो।
हमलावरों को निर्माण किए जाने वाले प्रकार को निर्देशित करने से रोका जाना चाहिए। यदि यह संभव है तो `DataContractSerializer` या `XmlSerializer` भी अवरुद्ध किए जा सकते हैं। उदाहरण के लिए,
`BinaryFormatter` और `JSON.Net` के लिए एक सुरक्षित व्हाइटलिस्ट नियंत्रण का निर्माण करने के लिए एक कस्टम `SerializationBinder` का उपयोग करके एक सुरक्षित रूप बनाना संभव है।
ज्ञात .Net असुरक्षित डिसीरियलाइज़ेशन गैजेट्स पर अद्यतित रहने का प्रयास करें और खास ध्यान दें जहां ऐसे प्रकार के टाइप आपके डिसीरियलाइज़ेशन प्रक्रियाओं द्वारा बनाए जा सकते हैं। **एक डिसीरियलाइज़र केवल उन टाइप्स को निर्माण कर सकता है जिनके बारे में उसे पता होता है**।
किसी भी कोड को अलग रखने का प्रयास करें जो संभावित गैजेट्स को बना सकता है और जिसमें इंटरनेट कनेक्टिविटी हो सकती है। उदाहरण के रूप में, WPF एप्लिकेशन में उपयोग किए जाने वाले `System.Windows.Data.ObjectDataProvider` एक ज्ञात गैजेट है जो विचारहीन डेटा को डिसीरियलाइज़ करने वाले एक REST सेवा परियोजना में इस एसेंबली का संदर्भ रखना जोखिमपूर्ण होगा।
रूबी में सीरीयलाइज़ेशन को लागू करने के लिए **मार्शल** पुस्तकालय के अंदर दो तरीके हैं: पहली तकनीक है **डंप** जो ऑब्जेक्ट को बाइट स्ट्रीम में परिवर्तित करता है **(सीरीयलाइज़ करता है)**। और दूसरी तकनीक है **लोड** जो बाइट स्ट्रीम को फिर से ऑब्जेक्ट में परिवर्तित करता है (**डिसीरियलाइज़ करता है**)।\
रूबी 2.X जेनेरिक डिसीरियलाइज़ेशन से RCE गैजेट चेन (अधिक जानकारी के लिए [https://www.elttam.com/blog/ruby-deserialization/](https://www.elttam.com/blog/ruby-deserialization/))।
Ruby On Rails को अनुशासित करने के लिए अन्य RCE चेन: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की इच्छा है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* खोजें [**The PEASS Family**](https://opensea.io/collection/the-peass-family), हमारा विशेष संग्रह [**NFTs**](https://opensea.io/collection/the-peass-family)
* प्राप्त करें [**आधिकारिक PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में या मुझे **Twitter** पर **फ़ॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**