* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को हैकट्रिक्स में विज्ञापित करना चाहते हैं**? या क्या आपको **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/) [**डिस्कॉर्ड समूह**](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/)
[**PHPGCC**](https://github.com/ambionics/phpggc) आपको PHP डिसीरियलाइज़ेशन का दुरुपयोग करने के लिए पेलोड उत्पन्न करने में मदद कर सकता है।\
ध्यान दें कि कई मामलों में आपको एक ऐसा तरीका नहीं मिलेगा कि आप एप्लिकेशन के स्रोत कोड में डिसीरियलाइज़ेशन का दुरुपयोग करें, लेकिन आप PHP के बाहरी एक्सटेंशन के कोड का दुरुपयोग कर सकते हैं।\
तो, यदि संभव हो सके तो, सर्वर की `phpinfo()` की जांच करें और इंटरनेट पर खोजें (और **PHPGCC** के **गैजेट्स** पर भी) कुछ संभावित गैजेट जिनका आप दुरुपयोग कर सकते हैं।
यदि आपने एक LFI खोजा है जो केवल फ़ाइल को पढ़ रहा है और उसमें php कोड को नहीं चला रहा है, उदाहरण के लिए _**file\_get\_contents(), fopen(), file() या file\_exists(), md5\_file(), filemtime() या filesize()**_**_ जैसे फ़ंक्शनों का उपयोग करके। आप **phar** प्रोटोकॉल का उपयोग करके एक **डिसीरियलाइज़ेशन** का दुरुपयोग करने की कोशिश कर सकते हैं।\
निम्नलिखित पृष्ठ में यह तकनीक प्रस्तुत करता है **yamls** पायथन पुस्तकालयों में एक असुरक्षित डेसीरियलाइज़ेशन का दुरुपयोग करने के बारे में और एक उपकरण के साथ समाप्त होता है जिसका उपयोग किया जा सकता है **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` फ़ंक्शन का उपयोग करने की खोज करें।
*`Content-type` हैडर एक एचटीटीपी प्रतिक्रिया में `application/x-java-serialized-object` के रूप में सेट किया गया है
*`1F 8B 08 00` हेक्स पहले संपीड़ित
*`H4sIA` बेस64 पहले संपीड़ित
* वेब फ़ाइलें जिनमें एक्सटेंशन `.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) का उपयोग करके आप **जांच सकते हैं कि कौन सी पुस्तकालयें उपलब्ध हैं** (और उनके संस्करण भी)। इस जानकारी के साथ, यह आसान हो सकता है कि आप एक पेलोड चुनें जिससे संक्रमण की कमजोरी का उपयोग कर सकें।
[**गैजेटप्रोब के बारे में और अधिक जानें**](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 पेलोड का उपयोग करके उन्हें पुष्टि करने की कोशिश करेगा।
[**आप Freddy के बारे में अधिक जानकारी यहां पा सकते हैं।**](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"** पेलोड का उपयोग करने की सलाह देता हूँ **RCE** पेलोड से पहले इंजेक्शन की जांच करने के लिए। फिर भी, ध्यान दें कि शायद "URLDNS" पेलोड काम नहीं कर रहा हो, लेकिन अन्य RCE पेलोड काम कर रहा हो।
जब आप **java.lang.Runtime.exec()** के लिए एक पेलोड बना रहे होते हैं, तो आप **विशेष वर्ण** जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि एक निष्पादन के आउटपुट को रीडायरेक्ट कर सकें, "$()" का उपयोग करें ताकि कमांड को निष्पादित किया जा सके या यहां तक कि एक कमांड को **अर्ग्यूमेंट्स** के रूप में अलग करें जो **स्पेस** द्वारा अलग होते हैं (आप `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** सीरियलाइज़ेशन पुस्तकालयों को अनुचित उपयोग करने के लिए पेलोड उत्पन्न कर सकते हैं।\
प्रोजेक्ट को कंपाइल करने के लिए मुझे `pom.xml` में इन **डिपेंडेंसीज़** को **जोड़ने** की आवश्यकता थी:
इस जावा 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` क्लास का उपयोग ऑब्जेक्ट को डिसीरियलाइज़ करने के लिए किया जाता है। इसे सख्त बनाना संभव है उसके व्यवहार को subclass करके। यह सबसे अच्छा समाधान है अगर:
सामान्य विचार यह है कि [`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 अपने उत्पाद को कैसे बनाता है**, तो आप [**इस पृष्ठ की जांच कर सकते हैं जहां विस्तारित व्रैपर + Json.Net फॉर्मेटर के साथ ObjectDataProvider गैजेट का व्याख्यान किया गया है**](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 विशेष फ्रेमवर्क के लिए **उत्पादों को तैयार करने के लिए एक्सप्लॉइट** का निर्माण करने के लिए प्लगइन्स का समर्थन करता है।
**ysoserial.net** में एक बहुत दिलचस्प पैरामीटर भी है जो हर एक एक्सप्लॉइट के काम करने को बेहतर समझने में मदद करता है: `--test`\
यदि आप इस पैरामीटर को इंडिकेट करते हैं, तो **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 के \_\_ViewState पैरामीटर को अपनाने का प्रयास करती है**](exploiting-\_\_viewstate-parameter.md) ताकि **विचारशील कोड को निष्पादित करें**। यदि आप **पहले से ही पीड़ित मशीन द्वारा उपयोग किए जाने वाले रहस्य** को जानते हैं, तो [**इस पोस्ट को पढ़ें ताकि कोड को निष्पादित करने के बारे में जानें**](exploiting-\_\_viewstate-knowing-the-secret.md)**।**
डेटास्ट्रीम को नहीं दें कि स्ट्रीम को किस प्रकार के ऑब्जेक्ट में डेसीरियलाइज किया जाएगा। आप इसे रोक सकते हैं उदाहरण के लिए `DataContractSerializer` या `XmlSerializer` का उपयोग करके।
यदि आपको डेटा स्ट्रीम को डिसीरियलाइज़ करना हो जो अपने खुद के टाइप को परिभाषित करती है, तो उन टाइप को सीमित करें जो डिसीरियलाइज़ किए जा सकते हैं। इसे अवश्य ध्यान दें कि यह फिर भी जोखिमपूर्ण है क्योंकि कई मूल .Net टाइप स्वतः में संभवतः खतरनाक हो सकते हैं। उदा.
`FileInfo` ऑब्जेक्ट जो सर्वर पर वास्तविक फ़ाइलों का संदर्भ करते हैं, जब वे डीसीरियलाइज़ किए जाते हैं, तो उन फ़ाइलों की गुणवत्ता को बदल सकते हैं, जैसे कि केवल पढ़ने योग्य, जो एक पोटेंशियल डिनायल ऑफ सर्विस हमला बना सकता है।
यदि आपने डीसीरियलाइज़ करने के लिए सीमित टाइप किए हैं, तो भी ध्यान दें कि कुछ टाइप के रिस्की प्रॉपर्टीज़ हो सकती हैं। उदाहरण के लिए, `System.ComponentModel.DataAnnotations.ValidationException` एक `Object` टाइप की `Value` प्रॉपर्टी होती है। यदि इस टाइप को डीसीरियलाइज़ करने के लिए अनुमति दी गई है, तो हमलावर वापसी प्रॉपर्टी `Value` को किसी भी ऑब्जेक्ट टाइप पर सेट कर सकता है।
हमलावरों को टाइप को निर्देशित करने से रोका जाना चाहिए। यदि यह संभव है, तो डेटाकंट्रैक्टसीरियलाइज़र या एक्सएमलसीरियलाइज़र भी अवरुद्ध किए जा सकते हैं, उदाहरण के लिए।
`BinaryFormatter` और `JSON.Net` के लिए एक सुरक्षित व्हाइटलिस्ट नियंत्रण का निर्माण करने के लिए एक कस्टम `SerializationBinder` का उपयोग करके एक सुरक्षित रूप बनाना संभव है।
ज्ञात .Net असुरक्षित डिसीरियलाइज़ेशन गैजेट्स पर अद्यतित रहने का प्रयास करें और खास ध्यान दें जहां ऐसे प्रकार के टाइप आपके डिसीरियलाइज़ेशन प्रक्रियाओं द्वारा बनाए जा सकते हैं। **एक डिसीरियलाइज़र केवल उन टाइप्स को निर्माण कर सकता है जिनके बारे में उसे पता होता है**।
किसी भी कोड को अलग रखने का प्रयास करें जो संभावित गैजेट्स को बना सकता है और जिसमें इंटरनेट कनेक्टिविटी हो सकती है। उदाहरण के रूप में, WPF ऐप्लिकेशन में उपयोग किए जाने वाले `System.Windows.Data.ObjectDataProvider` एक ज्ञात गैजेट है जो विचारहीन डेटा को डिसीरियलाइज़ करने वाले एक REST सेवा परियोजना में इस एसेंबली का संदर्भ रखना जोखिमपूर्ण होगा।
रूबी में सीरीयलाइज़ेशन को लागू करने के लिए **मार्शल** पुस्तकालय में दो विधियाँ हैं: पहली विधि है **डंप** जो ऑब्जेक्ट को बाइट स्ट्रीम में परिवर्तित करती है **(सीरीयलाइज़ करती है)**। और दूसरी विधि है **लोड** जो बाइट स्ट्रीम को फिर से ऑब्जेक्ट में परिवर्तित करती है (**डिसीरियलाइज़ करती है**)।\
रूबी HMAC का उपयोग करता है ताकि सीरीयलाइज़ किए गए ऑब्जेक्ट को साइन करें और कुंजी को निम्नलिखित फ़ाइलों में सहेजें:
रूबी 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), हमारा विशेष [**NFT**](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)**.**