PHP - Deserialization + Autoload Classes
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
पहले, आपको Autoloading Classes की जांच करनी चाहिए।
हम एक ऐसी स्थिति में हैं जहाँ हमें एक वेब ऐप में PHP deserialization मिली है जिसमें कोई लाइब्रेरी phpggc
के अंदर गैजेट के लिए कमजोर नहीं है। हालाँकि, उसी कंटेनर में एक अलग कंपोज़र वेब ऐप था जिसमें कमजोर लाइब्रेरी थी। इसलिए, लक्ष्य था दूसरे वेब ऐप के कंपोज़र लोडर को लोड करना और इसका दुरुपयोग करना एक गैजेट लोड करने के लिए जो उस लाइब्रेरी का दुरुपयोग करेगा जो deserialization के लिए कमजोर है।
चरण:
आपने deserialization पाया है और वर्तमान ऐप कोड में कोई गैजेट नहीं है
आप spl_autoload_register
फ़ंक्शन का दुरुपयोग कर सकते हैं जैसे कि निम्नलिखित किसी भी स्थानीय फ़ाइल को लोड करने के लिए जिसमें .php
एक्सटेंशन है
इसके लिए आप एक deserialization का उपयोग करते हैं जहाँ क्लास का नाम $name
के अंदर होगा। आप serialized object में क्लास नाम में "/" या "." का उपयोग नहीं कर सकते, लेकिन कोड underscores ("_") को slashes ("/") के लिए बदल रहा है। इसलिए एक क्लास नाम जैसे tmp_passwd
को /tmp/passwd.php
में परिवर्तित किया जाएगा और कोड इसे लोड करने की कोशिश करेगा।
एक गैजेट उदाहरण होगा: O:10:"tmp_passwd":0:{}
यदि आपके पास फाइल अपलोड है और आप .php
एक्सटेंशन वाली फाइल अपलोड कर सकते हैं, तो आप इस कार्यक्षमता का सीधे दुरुपयोग कर सकते हैं और पहले से ही RCE प्राप्त कर सकते हैं।
मेरे मामले में, मेरे पास ऐसा कुछ नहीं था, लेकिन एक ही कंटेनर के अंदर एक और कंपोजर वेब पेज था जिसमें एक लाइब्रेरी phpggc
गैजेट के लिए संवेदनशील थी।
इस अन्य लाइब्रेरी को लोड करने के लिए, सबसे पहले आपको उस अन्य वेब ऐप का कंपोजर लोडर लोड करना होगा (क्योंकि वर्तमान एप्लिकेशन का लोडर दूसरे की लाइब्रेरी तक पहुंच नहीं पाएगा।) एप्लिकेशन का पथ जानकर, आप इसे बहुत आसानी से प्राप्त कर सकते हैं: O:28:"www_frontend_vendor_autoload":0:{}
(मेरे मामले में, कंपोजर लोडर /www/frontend/vendor/autoload.php
में था)
अब, आप अन्य ऐप का कंपोजर लोडर लोड कर सकते हैं, तो अब phpgcc
पेलोड उत्पन्न करने का समय है। मेरे मामले में, मैंने Guzzle/FW1
का उपयोग किया, जिसने मुझे फाइल सिस्टम के अंदर कोई भी फाइल लिखने की अनुमति दी।
नोट: उत्पन्न गैजेट काम नहीं कर रहा था, इसके काम करने के लिए मैंने उस पेलोड chain.php
को phpggc में संशोधित किया और क्लास के सभी गुणों को प्राइवेट से पब्लिक में सेट किया। यदि नहीं, तो स्ट्रिंग को डीसिरियलाइज़ करने के बाद, बनाए गए ऑब्जेक्ट्स के गुणों में कोई मान नहीं था।
अब हमारे पास अन्य ऐप का कंपोजर लोडर लोड करने का तरीका है और एक phpggc पेलोड है जो काम करता है, लेकिन हमें इसे उसी अनुरोध में करना होगा ताकि लोडर तब लोड हो जब गैजेट का उपयोग किया जाए। इसके लिए, मैंने दोनों ऑब्जेक्ट्स के साथ एक सीरियलाइज्ड एरे भेजा जैसे:
आप देख सकते हैं पहले लोडर लोड होते हुए और फिर पेलोड
अब, हम एक फ़ाइल बना और लिख सकते हैं, हालाँकि, उपयोगकर्ता वेब सर्वर के अंदर किसी भी फ़ोल्डर में नहीं लिख सका। तो, जैसा कि आप पेलोड में देख सकते हैं, PHP system
को कुछ base64 के साथ कॉल कर रहा है जो /tmp/a.php
में बनाया गया है। फिर, हम पहले प्रकार के पेलोड का फिर से उपयोग कर सकते हैं जिसे हमने LFI के रूप में अन्य वेब ऐप के कंपोज़र लोडर को लोड करने के लिए जनित /tmp/a.php
फ़ाइल लोड करने के लिए उपयोग किया था। बस इसे डेसिरियलाइजेशन गैजेट में जोड़ें:
पेलोड का सारांश
एक ही कंटेनर में एक अलग वेब ऐप का कंपोजर ऑटोलोड लोड करें
एक phpggc गैजेट लोड करें ताकि दूसरे वेब ऐप की एक लाइब्रेरी का दुरुपयोग किया जा सके (प्रारंभिक वेब ऐप जो डेसिरियलाइजेशन के लिए संवेदनशील था, उसकी लाइब्रेरी में कोई गैजेट नहीं था)
गैजेट /tmp/a.php में एक PHP पेलोड के साथ एक फ़ाइल बनाएगा जिसमें दुर्भावनापूर्ण कमांड होंगे (वेब ऐप उपयोगकर्ता किसी भी वेब ऐप के किसी भी फ़ोल्डर में लिख नहीं सकता)
हमारे पेलोड का अंतिम भाग जनित PHP फ़ाइल को लोड करेगा जो कमांड निष्पादित करेगा
मुझे इस डेसिरियलाइजेशन को दो बार कॉल करने की आवश्यकता थी। मेरे परीक्षण में, पहली बार /tmp/a.php
फ़ाइल बनाई गई लेकिन लोड नहीं हुई, और दूसरी बार इसे सही ढंग से लोड किया गया।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)