PHP - Deserialization + Autoload Classes
पहले, आपको देखना चाहिए कि ऑटोलोडिंग क्लासेस क्या हैं।
PHP डीसीरियलाइजेशन + spl_autoload_register + LFI/Gadget
हम एक स्थिति में हैं जहाँ हमने एक वेब ऐप में PHP डीसीरियलाइजेशन पाया है जिसमें phpggc
के अंदर कोई गैजेट वलनरेबल लाइब्रेरी नहीं है। हालांकि, उसी कंटेनर में एक वलनरेबल लाइब्रेरी के साथ अलग कंपोजर वेब ऐप था। इसलिए, लक्ष्य था कि दूसरे वेब ऐप के कंपोजर लोडर को लोड करें और इसका दुरुपयोग करें ताकि उस लाइब्रेरी को एक गैजेट के साथ उत्पीड़ित करें जो डीसीरियलाइजेशन के लिए वलनरेबल वेब ऐप से है।
चरण:
आपने एक डीसीरियलाइजेशन पाया है और वर्तमान ऐप कोड में कोई गैजेट नहीं है
आप निम्नलिखित तरह का
spl_autoload_register
फ़ंक्शन दुरुपयोग कर सकते हैं ताकि.php
एक्सटेंशन वाली किसी भी स्थानीय फ़ाइल को लोड करेंइसके लिए आप एक डीसीरियलाइजेशन का दुरुपयोग करते हैं जिसमें क्लास का नाम
$name
के अंदर होगा। आप "/" या "." का उपयोग एक सीरीयलाइज्ड ऑब्जेक्ट में क्लास नाम में नहीं कर सकते हैं, लेकिन कोड ने अंडरस्कोर ("_") को स्लैश ("/") में बदल दिया है। इसलिए, एक क्लास नाम जैसे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
में था)अब, आप अन्य ऐप कॉम्पोज़र लोडर को लोड कर सकते हैं, तो अब समय है
phpggc
पेलोड उपयोग करने के लिए। मेरे मामले में, मैंनेGuzzle/FW1
का उपयोग किया, जिसने मुझे फ़ाइल सिस्टम के अंदर कोई भी फ़ाइल लिखने की अनुमति दी।ध्यान दें: उत्पन्न गैजेट काम नहीं कर रहा था, इसे काम करने के लिए मैंने उस पेलोड
chain.php
को संशोधित किया और सभी विशेषताएँ क्लासों की निजी से सार्वजनिक में सेट की। अगर नहीं, स्ट्रिंग को डिसीरियलाइज़ करने के बाद, बनाए गए ऑब्जेक्ट्स की विशेषताएँ कोई मान नहीं रखती थीं।अब हमारे पास तरीका है अन्य ऐप कॉम्पोज़र लोडर को लोड करने का और एक काम करने वाला phpggc पेलोड है, लेकिन हमें इसे इसी अनुरोध में करने की आवश्यकता है ताकि गैजेट का उपयोग किया जाए जब लोडर लोड हो। उसके लिए, मैंने एक सीरीयलाइज़ एरे भेजा जिसमें दोनों ऑब्जेक्ट्स थे:
आप पहले लोडर को लोड होते देख सकते हैं और फिर पेलोड
अब, हम एक फ़ाइल बना सकते हैं और लिख सकते हैं, हालांकि, उपयोगकर्ता वेब सर्वर के अंदर किसी भी फ़ोल्डर में लिख नहीं सकता था। इसलिए, जैसा कि आप पेलोड में देख सकते हैं, PHP
system
को कुछ base64 के साथ बनाया गया है/tmp/a.php
में। फिर, हम दूसरे वेबऐप के कॉम्पोज़र लोडर को लोड करने के लिए पहले प्रकार के पेलोड को पुनः प्रयोग कर सकते हैं जिसे हमने LFI के रूप में उपयोग किया था/tmp/a.php
फ़ाइल को लोड करने के लिए। इसे डेसीरियलाइज़ेशन गैजेट में जोड़ें:
पेलोड का सारांश
एक अलग वेबऐप के कंटेनर में कॉम्पोजर ऑटोलोड लोड करें
फिलहाल वेबऐप के लाइब्रेरी का दुरुपयोग करने के लिए एक फीजी साधन लोड करें (जिस पर डेसीरियलाइजेशन के लिए विकल्प वेबऐप में कोई गैजेट नहीं था)
फीजी एक फ़ाइल बनाएगा जिसमें PHP पेलोड होगा जिसमें दुराचारी कमांड होंगे (/tmp/a.php में) (वेबऐप उपयोगकर्ता किसी भी वेबऐप के किसी भी फ़ोल्डर में लिख नहीं सकता)
हमारे पेलोड का अंतिम हिस्सा उस उत्पन्न PHP फ़ाइल को लोड करेगा जो कमांड निष्पादित करेगा
मुझे इस डेसीरियलाइजेशन को दो बार कॉल करने की आवश्यकता थी। मेरे परीक्षण में, पहली बार /tmp/a.php
फ़ाइल बनाई गई थी लेकिन लोड नहीं हुई, और दूसरी बार यह सही ढंग से लोड हुई।
Last updated