Deserialization
मूल जानकारी
सिरियलाइजेशन को एक विधि के रूप में समझा जाता है जिसमें एक ऑब्जेक्ट को एक ऐसे प्रारूप में परिवर्तित करना शामिल है जो संरक्षित किया जा सकता है, जिसका उद्देश्य या तो ऑब्ज
यदि आप परिणामों की दिशा देखते हैं तो आप देख सकते हैं कि फ़ंक्शन __wakeup
और __destruct
को जब ऑब्जेक्ट को डीसीरियलाइज़ किया जाता है, तो वे कॉल किए जाते हैं। ध्यान दें कि कई ट्यूटोरियल में आपको मिलेगा कि __toString
फ़ंक्शन को किसी विशेषता को प्रिंट करने की कोशिश करने पर कॉल किया जाता है, लेकिन ऐसा लगता है कि अब यह हो नहीं रहा है।
यदि यह क्लास में लागू किया गया है, तो विधि __unserialize(array $data)
को __wakeup()
के बजाय कॉल किया जाता है। यह आपको ऑब्ज
आप यहाँ PHP उदाहरण को पढ़ सकते हैं: https://www.notsosecure.com/remote-code-execution-via-php-unserialize/, यहाँ https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf या यहाँ https://securitycafe.ro/2015/01/05/understanding-php-object-injection/
PHP Deserial + Autoload Classes
आप PHP autoload functionality का दुरुपयोग करके विभिन्न php फ़ाइलें और अधिक लोड कर सकते हैं:
pagePHP - Deserialization + Autoload Classesसंदर्भित मानों को Serialize करना
यदि किसी कारणवश आप किसी मान को एक अन्य मान के serialize हुए संदर्भ के रूप में serialize करना चाहते हैं तो:
PHPGGC (ysoserial for PHP)
PHPGGC आपको PHP डिसीरियलाइजेशन का दुरुपयोग करने के लिए payloads उत्पन्न करने में मदद कर सकता है।
ध्यान दें कि कई मामलों में आपको एप्लिकेशन के स्रोत कोड में डिसीरियलाइजेशन का दुरुपयोग करने का कोई तरीका नहीं मिलेगा लेकिन आप बाहरी PHP एक्सटेंशन के कोड का दुरुपयोग कर सकते हैं।
तो, अगर संभव हो तो, सर्वर का phpinfo()
जांचें और इंटरनेट पर खोजें (और PHPGGC के गैजेट्स पर भी) कुछ संभावित गैजेट जिनका आप दुरुपयोग कर सकते हैं।
phar:// metadata deserialization
अगर आपने एक LFI पाया है जो केवल फ़ाइल पढ़ रहा है और उसके भीतर PHP कोड को नहीं चला रहा है, उदाहरण के लिए file_get_contents(), fopen(), file() या file_exists(), md5_file(), filemtime() या filesize() की तरह के फ़ंक्शनों का उपयोग करके। तो आप phar प्रोटोकॉल का उपयोग करके एक फ़ाइल पढ़ते समय हो रही डिसीरियलाइजेशन का दुरुपयोग करने की कोशिश कर सकते हैं। अधिक जानकारी के लिए निम्नलिखित पोस्ट पढ़ें:
pagephar:// deserializationPython
Pickle
जब ऑब्ज
अधिक जानकारी के लिए pickle jails से बचने के बारे में जांच करें:
pageBypass Python sandboxesYaml & jsonpickle
निम्नलिखित पृष्ठ उन python पुस्तकालयों में असुरक्षित डेसीरियलाइजेशन का दुरुपयोग करने की तकनीक प्रस्तुत करता है और एक उपकरण के साथ समाप्त होता है जिसका उपयोग Pickle, PyYAML, jsonpickle और ruamel.yaml के लिए RCE डेसीरियलाइजेशन पेलोड उत्पन्न करने के लिए किया जा सकता है:
pagePython Yaml DeserializationClass Pollution (Python Prototype Pollution)
pageClass Pollution (Python's Prototype Pollution)NodeJS
JS Magic Functions
JS PHP या Python की तरह "जादू" फ़ंक्शन नहीं है जो केवल एक ऑब्जेक्ट बनाने के लिए निष्पादित किए जाएंगे। लेकिन इसमें कुछ फ़ंक्शन हैं जो सीधे नहीं कहते हुए भी अक्सर उपयोग किए जाते हैं जैसे toString
, valueOf
, toJSON
।
डेसीरियलाइजेशन का दुरुपयोग करते समय आप इन फ़ंक्शनों को कंप्रोमाइज कर सकते हैं ताकि अन्य कोड को निष्पादित किया जा सके (प्रोटोटाइप पोल्यूशन का दुरुपयोग करना संभावित है)।
एक और "जादू" तरीका एक फ़ंक्शन को सीधे नहीं बुलाए जाने के लिए एक ऑब्जेक्ट को कंप्रोमाइज करना है जो एक असिंक फ़ंक्शन द्वारा वापस दिया जाता है (प्रमिस)। क्योंकि, अगर आप उस **वापसी ऑब्ज
__proto__
और prototype
प्रदूषण
__proto__
और prototype
प्रदूषणयदि आप इस तकनीक के बारे में सीखना चाहते हैं तो निम्नलिखित ट्यूटोरियल देखें:
pageNodeJS - __proto__ & prototype Pollutionयह पुस्तकालय फ़ंक्शन को serialize करने की अनुमति देती है। उदाहरण:
**सिरियलाइज्ड ऑब्ज
आप उदाहरण में देख सकते हैं कि जब एक फ़ंक्शन को serialize किया जाता है तो _$$ND_FUNC$$_
ध्वज सीरीज़ किए गए ऑब्ज
जैसा पहले इंडिकेट किया गया था, यह लाइब्रेरी _$$ND_FUNC$$_
के बाद कोड प्राप्त करेगी और eval
का उपयोग करके इसे चलाएगी। इसलिए, कोड स्वत: चलाने के लिए आप फंक्शन निर्माण भाग और अंतिम ब्रैकेट को हटा सकते हैं और बस निम्नलिखित उदाहरण में एक JS वनलाइनर चला सकते हैं:
आप इस यहाँ वुलनरेबिलिटी को कैसे शोषित करने के बारे में अधिक जानकारी पा सकते हैं।
funcster का एक महत्वपूर्ण पहलू यह है कि मानक इनबिल्ट ऑब्जेक्ट्स की अप्राप्यता; वे पहुंचने योग्य दायरे के बाहर हैं। यह प्रतिबंध किसी भी मानक इनबिल्ट ऑब्जेक्ट्स पर विधियों को आमंत्रित करने की कोशिश करने वाले कोड का निष्पादन रोकता है, जिससे उत्पन्न होने वाली अपवाद जैसे कि "ReferenceError: console is not defined"
जब आप console.log()
या require(something)
जैसे कमांड का उपयोग करते हैं।
इस प्रतिबंध के बावजूद, वैशिष्ट्यपूर्ण दृष्टिकोण को पूरी पहुंच की पुनर्स्थापना संभव है, जिसमें सभी मानक इनबिल्ट ऑब्जेक्ट्स शामिल हैं। इस प्रतिबंध को छलकरने के लिए एक विशिष्ट दृष्टिकोण का उपयोग करके ग्लोबल संदर्भ का सीधा उपयोग करके, यह संभव है। उदाहरण के लिए, निम्नलिखित स्निपेट का उपयोग करके पहुंच पुनः स्थापित की जा सकती है:
अधिक जानकारी के लिए इस स्रोत को पढ़ें](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)।
serialize-javascript पैकेज को केवल सिरियलाइज़ेशन के उद्देश्य के लिए डिज़ाइन किया गया है, जिसमें कोई भी बिल्ट-इन डिसीरियलाइज़ेशन क्षमताएँ नहीं हैं। उपयोगकर्ताओं को डिसीरियलाइज़ेशन के लिए अपनी खुद की विधि का अमल करने के लिए जिम्मेदार होते हैं। सीरियलाइज़ किए गए डेटा को डिसीरियलाइज़ करने के लिए आधिकारिक उदाहरण द्वारा eval
का सीधा उपयोग सुझाया गया है:
यदि इस फ़ंक्शन का उपयोग ऑब्जेक्ट्स को डीसीरियलाइज़ करने के लिए किया जाता है, तो आप इसे आसानी से उत्पीड़ित कर सकते हैं:
अधिक जानकारी के लिए इस स्रोत को पढ़ें](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/).
Cryo पुस्तकालय
निम्नलिखित पृष्ठों में आपको इस पुस्तकालय का दुरुपयोग कैसे करना है जानकारी मिलेगी जिससे विचारहीन कमांड्स को क्रियान्वित किया जा सकता है:
Java - HTTP
Java में, डेसीरियलाइजेशन कॉलबैक डेसीरियलाइजेशन प्रक्रिया के दौरान क्रियान्वित किए जाते हैं। हमलावर इस क्रिया का शिकार बन सकते हैं जो दुरुपयोगी पेलोड का निर्माण करते हैं जो इन कॉलबैक को ट्रिगर करते हैं, जिससे हानिकारक क्रियाएँ क्रियान्वित हो सकती हैं।
Fingerprints
White Box
कोडबेस में संभावित सीरीयलाइजेशन वंरबिलिटीज की पहचान के लिए खोज करें:
वर्ग जो
Serializable
इंटरफेस का अमल करते हैं।java.io.ObjectInputStream
,readObject
,readUnshare
फ़ंक्शन का उपयोग।
विशेष ध्यान दें:
बाह्य उपयोगकर्ताओं द्वारा परिभाषित पैरामीटर के साथ उपयोग किया गया
XMLDecoder
।XStream
काfromXML
विधि, विशेष रूप से यदि XStream संस्करण 1.46 से कम या बराबर है, क्योंकि इसमें सीरीयलाइजेशन समस्याएँ हो सकती हैं।ObjectInputStream
जोreadObject
विधि के साथ है।readObject
,readObjectNodData
,readResolve
, याreadExternal
जैसी विधियों का कार्यान्वयन।ObjectInputStream.readUnshared
।Serializable
का सामान्य उपयोग।
Black Box
काले बॉक्स परीक्षण के लिए, विशेष हस्ताक्षर या "मैजिक बाइट्स" खोजें जो जावा सीरीयलाइज्ड ऑब्जेक्ट्स को दर्शाते हैं (ObjectInputStream
से उत्पन्न):
हेक्साडेसिमल पैटर्न:
AC ED 00 05
।बेस64 पैटर्न:
rO0
।HTTP प्रतिक्रिया हेडर जिसमें
Content-type
कोapplication/x-java-serialized-object
सेट किया गया है।पूर्व संकुचन को दर्शाने वाला हेक्साडेसिमल पैटर्न:
1F 8B 08 00
।पूर्व संकुचन को दर्शाने वाला बेस64 पैटर्न:
H4sIA
।.faces
एक्सटेंशन औरfaces.ViewState
पैरामीटर के साथ वेब फ़ाइलें। एक वेब एप्लिकेशन में इन पैटर्न की खोज को जांचने के लिए एक जांच को प्रेरित करना चाहिए जैसा कि Java JSF ViewState Deserialization के पोस्ट में विस्तार से वर्णित है।
यदि आप जानना चाहते हैं कि एक जावा डिसीरियलाइज़ड अभियांत्रिकी कैसे काम करती है, तो आपको बेसिक जावा डिसीरियलाइज़ेशन, जावा DNS डिसीरियलाइज़ेशन, और कॉमन्स कलेक्शन 1 पेलोड पर नजर डालनी चाहिए।
व्हाइट बॉक्स टेस्ट
आप यह जांच सकते हैं कि क्या कोई ऐसा एप्लिकेशन इंस्टॉल किया गया है जिसमें पता चली व्यवस्थाओं की कोई समस्या है।
आप सभी पुस्तकालयों की जांच कर सकते हैं जिन्हें वंशवादी माना जाता है और जिनके लिए Ysoserial एक उत्पीड़न प्रदान कर सकता है। या आप Java-Deserialization-Cheat-Sheet पर दिखाए गए पुस्तकालयों की जांच कर सकते हैं। आप gadgetinspector का उपयोग करके उत्पीड़न श्रृंखलाओं की खोज कर सकते हैं जो उत्पीड़न के लिए उपयोग किए जा सकते हैं। gadgetinspector को चलाते समय (इसे बिल्ड करने के बाद) उसके द्वारा जा रही सभी चेतावनियों/त्रुटियों की चिंता न करें और उसे समाप्त होने दें। यह सभी खोजों को gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt के तहत लिखेगा। कृपया ध्यान दें कि gadgetinspector एक उत्पीड़न नहीं बनाएगा और यह गलत सकारात्मक परिणाम दिखा सकता है।
काला बॉक्स परीक्षण
बर्प एक्सटेंशन gadgetprobe का उपयोग करके आप किस पुस्तकालयों का उपयोग किया जा रहा है (और किस संस्करण) को पहचान सकते हैं। इस जानकारी के साथ, यह वंशवाद को उत्पीड़ित करने के लिए एक पेलोड चुनना सरल हो सकता है।
इसे और अधिक जानने के लिए GadgetProbe पढ़ें।
GadgetProbe ObjectInputStream
उत्पीड़न पर ध्यान केंद्रित है।
बर्प एक्सटेंशन Java Deserialization Scanner का उपयोग करके आप ysoserial के साथ उत्पीड़न करने योग्य पुस्तकालयों की पहचान कर सकते हैं और उन्हें उत्पीड़ित कर सकते हैं।
जानने के लिए इसे Java Deserialization Scanner के बारे में और पढ़ें
Java Deserialization Scanner ObjectInputStream
उत्पीड़न पर ध्यान केंद्रित है।
आप Freddy का उपयोग करके बर्प में उत्पीड़न संकटों की पहचान कर सकते हैं। यह प्लगइन केवल ObjectInputStream
संबंधित संकटों की पहचान करेगा बल्कि Json और Yml उत्पीड़न पुस्तकालयों से भी vulns की पहचान करेगा। सक्रिय मोड में, यह उन्हें सुनी या DNS पेलोड का उपयोग करके पुष्टि करने की कोशिश करेगा।
आप फ्रेडी के बारे में अधिक जानकारी यहाँ पा सकते हैं।
संचयन परीक्षण
सभी यह नहीं है कि सर्वर द्वारा कोई भी वंशवादी पुस्तकालय का उपयोग किया जा रहा है या नहीं। कभी-कभी आप संचित वस्तु के अंदर के डेटा को बदल सकते हैं और कुछ जांचों को छलकर निकाल सकते हैं (शायद एक वेब ऐप्लिकेशन के अंदर व्यवस्थापक विशेषाधिकार प्रदान कर सकते हैं)। अगर आपको एक जावा संचित वस्तु मिलती है जो एक वेब एप्लिकेशन में भेजी जा रही है, तो आप SerializationDumper का उपयोग कर सकते हैं ताकि भेजे जा रहे संचयन वस्तु को एक अधिक मानवीय पठनीय स्वरूप में प्रिंट कर सकें। जानना कि आप कौन से डेटा भेज रहे हैं उसे संशोधित करना और कुछ जांचों को छलकर निकालना सरल होगा।
उत्पीड़न
ysoserial
जावा वंशवादों का उत्पीड़न करने के लिए मुख्य उपकरण ysoserial है (यहाँ से डाउनलोड करें)। आप ysoseral-modified का भी उपयोग कर सकते हैं जो आपको जटिल कमांडों का उपयोग करने देगा (उदाहरण के लिए पाइप्स के साथ)।
ध्यान दें कि यह उपकरण ObjectInputStream
का उत्पीड़न करने पर केंद्रित है।
मैं "URLDNS" पेलोड का उपयोग RCE पेलोड से पहले करने की सिफारिश करूंगा ताकि प्रविष्टि संभव है या नहीं यह जांचने के लिए। फिर भी, ध्यान दें कि शायद "URLDNS" पेलोड काम नहीं कर रहा हो लेकिन अन्य RCE पेलोड काम कर रहा हो।
जब java.lang.Runtime.exec() के लिए payload बनाते हैं तो आप विशेष वर्ण जैसे ">" या "|" का उपयोग नहीं कर सकते हैं ताकि एक क्रिया के आउटपुट को रीडायरेक्ट कर सकें, "$()" का उपयोग करके कमांड को निष्पादित कर सकें या यहाँ तक कि कमांड को अलग-अलग अर्ग्यूमेंट्स के साथ अलग करने के लिए अंतरिक्ष से अलग नहीं कर सकते हैं (आप echo -n "hello world"
कर सकते हैं लेकिन आप python2 -c 'print "Hello world"'
नहीं कर सकते हैं)। Payload को सही ढंग से एन्कोड करने के लिए आप इस वेबपेज का उपयोग कर सकते हैं।
विन्डोज और लिनक्स के लिए सभी संभावित कोड निष्पादन payloads बनाने के लिए अगले स्क्रिप्ट का उपयोग करें और फिर उन्हें संक्रमित वेब पेज पर परीक्षण करें:
सीरियलकिलरबायपासगैजेट्स
आप इस्तेमाल कर सकते हैं https://github.com/pwntester/SerialKillerBypassGadgetCollection ysoserial के साथ अधिक उत्पीड़न बनाने के लिए। इस टूल के बारे में अधिक जानकारी टॉक के स्लाइड्स में है जहाँ टूल प्रस्तुत किया गया था: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1
मार्शलसेक
marshalsec का उपयोग किया जा सकता है विभिन्न Json और Yml सिरीकरण पुस्तकालयों को उत्पीड़ित करने के लिए।
परियोजना को कॉम्पाइल करने के लिए मुझे pom.xml
में इस डिपेंडेंसी को जोड़ने की आवश्यकता थी:
मेवेन इंस्टॉल करें, और परियोजना को कंपाइल करें:
FastJSON
इस Java JSON पुस्तकालय के बारे में अधिक जानकारी पढ़ें: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html
Labs
यदि आप कुछ ysoserial payloads का परीक्षण करना चाहते हैं तो आप इस वेब ऐप को चला सकते हैं: https://github.com/hvqzao/java-deserialize-webapp
Why
Java विभिन्न उद्देश्यों के लिए धारणीकरण का बहुत उपयोग करता है जैसे:
HTTP अनुरोध: धारणीकरण पैरामीटर, ViewState, कुकी आदि के प्रबंधन में व्यापक रूप से प्रयुक्त होता है।
RMI (Remote Method Invocation): Java RMI प्रोटोकॉल, जो पूरी तरह से धारणीकरण पर निर्भर है, जावा एप्लिकेशन में दूरस्थ संचार के लिए एक मूलग्रंथ है।
RMI ओवर HTTP: यह विधि जावा आधारित मोटे क्लाइंट वेब एप्लिकेशन्स द्वारा सामान्य रूप से प्रयुक्त की जाती है, जो सभी ऑब्जेक्ट संचार के लिए धारणीकरण का उपयोग करती है।
JMX (Java Management Extensions): JMX नेटवर्क के माध्यम से ऑब्जेक्ट्स को भेजने के लिए धारणीकरण का उपयोग करता है।
कस्टम प्रोटोकॉल: जावा में मानक अभ्यास शामिल है जिसमें कच्चे जावा ऑब्जेक्ट्स के प्रेषण का उपयोग किया जाता है, जो आगामी शोषण उदाहरणों में प्रदर्शित किया जाएगा।
Prevention
अस्थायी ऑब्ज
एक कक्षा की सिरलेबलिजेशन से बचें जो Serializable
इंटरफेस का अनुसरण करने की आवश्यकता है
Serializable
इंटरफेस का अनुसरण करने की आवश्यकता हैऐसे परिदृश्यों में जहाँ कुछ **ऑब्ज
जावा में डेसीरियलाइज़ेशन सुरक्षा को बढ़ाना
java.io.ObjectInputStream
को कस्टमाइज़ करना डेसीरियलाइज़ेशन प्रक्रियाओं को सुरक्षित बनाने के लिए एक व्यावहारिक दृष्टिकोण है। यह विधि उपयुक्त है जब:
डेसीरियलाइज़ेशन कोड आपके नियंत्रण में है।
डेसीरियलाइज़ेशन के लिए अपेक्षित कक्षाएँ ज्ञात हैं।
resolveClass()
मेथड को ओवरराइड करें ताकि डेसीरियलाइज़ेशन को केवल अनुमति प्राप्त कक्षाओं तक ही सीमित किया जा सके। इससे Bicycle
कक्षा तक ही डेसीरियलाइज़ेशन की प्रतिबंधित किया जा सकता है, जैसे निम्नलिखित उदाहरण में:
सुरक्षा में सुधार के लिए जावा एजेंट का उपयोग एक विकल्प प्रदान करता है जब कोड संशोधन संभव नहीं होता। यह विधि मुख्य रूप से हानिकारक कक्षाओं को ब्लैकलिस्ट करने के लिए लागू होती है, जेवीएम पैरामीटर का उपयोग करके:
यह एक तरीका प्रदान करता है जो डेसीरियलाइज़ेशन को निरंतर सुरक्षित बनाए रखने के लिए उपयुक्त है, जो स्थितियों के लिए आद immediate कोड परिवर्तन असंभव है।
rO0 by Contrast Security में एक उदाहरण देखें।
सिरीकरण फ़िल्टर्स का लागू करना: जावा 9 ने ObjectInputFilter
इंटरफेस के माध्यम से सिरीकरण फ़िल्टर्स का परिचय किया, जो डेसीरियलाइज़ किए जाने से पहले सिरीकरण किए जाने वाले ऑब्ज
बेहतर सुरक्षा के लिए बाह्य पुस्तकालयों का उपयोग करना: NotSoSerial, jdeserialize, और Kryo जैसी पुस्तकालय जावा डेसीरियलाइज़ेशन को नियंत्रित और मॉनिटर करने के लिए उन्नत सुविधाएं प्रदान करती हैं। ये पुस्तकालय व्हाइटलिस्टिंग या ब्लैकलिस्टिंग क्लासेस, डेसीरियलाइज़ेशन से पहले सिरीयलाइज़ किए गए ऑब्जेक्ट्स का विश्लेषण करने, और कस्टम सीरियलाइज़ेशन रणनीतियों को लागू करने जैसी अतिरिक्त सुरक्षा स्तर प्रदान कर सकती हैं।
NotSoSerial अविश्वसनीय कोड का निषेध करने के लिए डेसीरियलाइज़ेशन प्रक्रियाओं को रोकता है।
jdeserialize डेसीरियलाइज़ किए जाने से पहले सिरीयलाइज़ किए गए जावा ऑब्ज
ysoserial.net में एक बहुत दिलचस्प पैरामीटर भी है जो हर एक एक्सप्लॉइट काम कैसे करता है, इसे बेहतर समझने में मदद करता है: --test
यदि आप इस पैरामीटर को इंडिकेट करते हैं तो ysoserial.net लोकली एक्सप्लॉइट की कोशिश करेगा, ताकि आप यह जांच सकें कि आपका पेलोड सही ढंग से काम करेगा।
यह पैरामीटर मददगार है क्योंकि यदि आप कोड की समीक्षा करते हैं तो आप निम्नलिखित तरह के कोड टुकड़े पाएंगे (ObjectDataProviderGenerator.cs):
इसका मतलब है कि एक्सप्लॉइट का परीक्षण करने के लिए कोड serializersHelper.JsonNet_deserialize को कॉल करेगा।
पिछले कोड में उत्पन्न दुरुपयोग के लिए वंशीकरण योग्य है। इसलिए अगर आप .Net एप्लिकेशन में कुछ समान ढूंढते हैं तो यह संभावना है कि वह एप्लिकेशन भी वंशीकरण के लिए भेद्य है।
इसलिए --test
पैरामीटर हमें समझने में मदद करता है कि कौन से कोड खंड वंशीकरण दुरुपयोग के लिए भेद्य हैं जिन्हें ysoserial.net बना सकता है।
ViewState
इस पोस्ट को देखें जिसमें बताया गया है कि .Net के __ViewState पैरामीटर का दुरुपयोग कैसे किया जा सकता है। यदि आप पहले से ही पीड़ित मशीन द्वारा उपयोग किए गए रहस्यों को जानते हैं, तो इस पोस्ट को पढ़ें जिसमें कोड कैसे चलाया जा सकता है।**
रोकथाम
.Net में वंशीकरण के साथ जुड़े जोखिमों को कम करने के लिए:
डेटा स्ट्रीम को उनके ऑब्जेक्ट प्रकार को परिभाषित करने से बचें। संभावना होने पर
DataContractSerializer
याXmlSerializer
का उपयोग करें।JSON.Net
के लिए,TypeNameHandling
कोNone
पर सेट करें: %%%TypeNameHandling = TypeNameHandling.None%%%JavaScriptSerializer
का उपयोगJavaScriptTypeResolver
के साथ न करें।वंशीकरण करने के लिए उपयोग किए जा सकने वाले प्रकारों की सीमा निर्धारित करें, .Net प्रकारों के साथ संगहित जोखिमों को समझें, जैसे
System.IO.FileInfo
, जो सर्वर फ़ाइलों की गुणवत्ता को संशोधित कर सकता है, जिससे नकारात्मक सेवा हमलों की ओर ले जा सकता है।जोखिमपूर्ण गुणवत्ता वाले प्रकारों के साथ सतर्क रहें, जैसे
System.ComponentModel.DataAnnotations.ValidationException
जिसमें उसकीValue
गुणवत्ता हो, जिसका शोषण किया जा सकता है।वंशीकरण प्रक्रिया पर प्रभाव डालने वाले हमलावरों से बचाव करने के लिए प्रकार निर्माण को सुरक्षित रूप से नियंत्रित करें, जिससे
DataContractSerializer
याXmlSerializer
भी भेद्य हो सकते हैं।BinaryFormatter
औरJSON.Net
के लिए एक कस्टमSerializationBinder
का उपयोग करके सफेद सूची नियंत्रण लागू करें।.Net में पता चले असुरक्षित वंशीकरण गैजेट्स के बारे में जानकारी रखें और सुनिश्चित करें कि वंशीकरणकर्ता ऐसे प्रकारों को संचालित न करें।
इंटरनेट एक्सेस वाले कोड से संभावित जोखिमपूर्ण कोड को अलग रखें ताकि ज्ञात गैजेट्स को उद्घाटित न करें, जैसे WPF एप्लिकेशन में
System.Windows.Data.ObjectDataProvider
को अविश्वसनीय डेटा स्रोतों के लिए अनुप्रयोग करने से बचाएं।
संदर्भ
रूबी
रूबी में, वंशीकरण को मार्शल पुस्तकालय के दो विधियों द्वारा सुविधाजनक बनाया गया है। पहला विधि, जिसे डंप कहा जाता है, एक ऑब्जेक्ट को बाइट स्ट्रीम में परिवर्तित करने के लिए उपयोग किया जाता है। इस प्रक्रिया को वंशीकरण कहा जाता है। उल्टे, दूसरा विधि, लोड नामक है, जिसका उपयोग एक बाइट स्ट्रीम को फिर से एक ऑब्जेक्ट में बदलने के लिए किया जाता है, जिसे वंशीकरण कहा जाता है।
वंशीकरणित ऑब्ज
Ruby On Rails को अनुभवित करने के लिए अन्य RCE श्रृंखला: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/
Last updated