PHP Tricks
कुकीज कॉमन स्थान:
यह phpMyAdmin कुकीज के लिए भी मान्य है।
कुकीज:
स्थान:
PHP तुलनाएँ अनदेखी करना
ढीली तुलनाएँ/टाइप जग्गलिंग ( == )
यदि PHP में ==
का उपयोग किया जाता है, तो अप्रत्याशित स्थितियाँ हो सकती हैं जहां तुलना उम्मीद के अनुसार व्यवहार नहीं करती। यह इसलिए है क्योंकि "==" केवल मानों की तुलना करता है जो एक ही प्रकार में परिवर्तित होते हैं, यदि आप यह भी तुलना करना चाहते हैं कि तुलित डेटा का प्रकार भी समान है तो आपको ===
का उपयोग करना होगा।
PHP तुलना सारणियाँ: https://www.php.net/manual/en/types.comparisons.php
"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
स्ट्रिंग में कोई भी अक्षर इंट 0 के बराबर है
अधिक जानकारी https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09
in_array()
टाइप जग्गलिंग को डिफ़ॉल्ट रूप से in_array()
फ़ंक्शन पर भी प्रभाव डालता है (आपको एक सख्त तुलना बनाने के लिए तीसरे तर्क को सच करना होगा):
strcmp()/strcasecmp()
यदि इस फ़ंक्शन का उपयोग किसी प्रमाणीकरण जाँच के लिए किया जाता है (जैसे पासवर्ड की जाँच करना) और उपयोगकर्ता तुलना का एक पक्ष नियंत्रित करता है, तो वह पासवर्ड के मान के रूप में एक खाली सरणी भेज सकता है बजाय एक स्ट्रिंग के (https://example.com/login.php/?username=admin&password[]=
) और इस जाँच को उमकर सकता है:
सख्त प्रकार जग्गलिंग
यद्यपि ===
का उपयोग हो रहा है तो त्रुटियाँ हो सकती हैं जो तुलना को प्रकार जग्गलिंग के लिए संवेदनशील बना सकती है। उदाहरण के लिए, यदि तुलना डेटा को एक विभिन्न प्रकार के ऑब्जेक्ट में परिवर्तित कर रही है पहले तुलना करने से:
preg_match(/^.*/)
preg_match()
का उपयोग उपयोगकर्ता इनपुट की पुष्टि के लिए किया जा सकता है (यह जांचता है कि क्या कोई शब्द/रीजेक्स एक ब्लैकलिस्ट से उपयोगकर्ता इनपुट पर मौजूद है और अगर नहीं है, तो कोड अपनी क्रिया जारी रख सकता है।
नई लाइन बाईपास
हालांकि, जब रेजेक्स की शुरुआत को वर्गीकृत किया जाता है, preg_match()
केवल उपयोगकर्ता इनपुट की पहली पंक्ति की जांच करता है, फिर अगर किसी तरह से आप इनपुट को कई पंक्तियों में भेज सकते हैं, तो आप इस जांच को छल सकते हैं। उदाहरण:
इस जांच को छलकरने के लिए आप नए लाइन्स urlencoded (%0A
) के साथ मान भेज सकते हैं या अगर आप JSON डेटा भेज सकते हैं, तो इसे कई लाइनों में भेजें:
Find an example here: https://ramadistra.dev/fbctf-2019-rceservice
लंबाई त्रुटि बायपास
(यह बायपास प्रायः PHP 5.2.5 पर प्रयास किया गया था और मुझे लगता है कि यह PHP 7.3.15 पर काम नहीं करता है)
यदि आप preg_match()
को एक मान्य बहुत बड़े इनपुट को भेज सकते हैं, तो यह इसे प्रोसेस करने में सक्षम नहीं होगा और आपको चेक को बायपास करने की अनुमति होगी। उदाहरण के लिए, यदि यह एक JSON को ब्लैकलिस्ट कर रहा है तो आप भेज सकते हैं:
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 है जो स्टैक में फिट नहीं होता है।
इस पोस्ट में इस समस्या के बारे में अधिक विस्तार से बात की गई है। हमारा काम अब स्पष्ट था:
एक इनपुट भेजें जो रीजेक्स को 100,000+ पुनरावृत्तियाँ करने के लिए बनाए, SIGSEGV को उत्पन्न करें, preg_match()
फ़ंक्शन को false
लौटाएं जिससे एप्लिकेशन सोचे कि हमारा इनपुट हानिकारक नहीं है, और पेलोड के अंत में कुछ ऐसा चौंकाने वाला फ़ंक्शन डालें {system(<verybadcommand>)}
ताकि SSTI --> RCE --> ध्वज मिले :)।
ठीक है, रीजेक्स शब्दों में, हम वास्तव में 100k "पुनरावृत्तियाँ" नहीं कर रहे हैं, बल्कि हम "पीछे हटने के कदम" गिन रहे हैं, जैसा कि PHP दस्तावेज़ीकरण यह बताता है कि यह डिफ़ॉल्ट रूप से 1,000,000 (1M) है pcre.backtrack_limit
चर में।
इसे पहुंचने के लिए, 'X'*500_001
1 मिलियन पीछे हटने के कदम देगा (500k आगे और 500k पीछे):
PHP obfuscation के लिए टाइप जग्लिंग
रीडायरेक्ट के बाद एक्सीक्यूट (EAR)
अगर PHP किसी अन्य पेज पर रीडायरेक्ट कर रहा है लेकिन die
या exit
फंक्शन को Location
हेडर सेट होने के बाद कॉल नहीं किया गया है, तो PHP एक्सीक्यूट करना जारी रखता है और डेटा को बॉडी में जोड़ता रहता है:
पथ ट्रावर्सल और फ़ाइल समावेश शोषण
जांच करें:
और ट्रिक्स
register_globals: PHP < 4.1.1.1 में या अगर गलत रूप से कॉन्फ़िगर किया गया है, तो register_globals सक्रिय हो सकता है (या उनका व्यवहार अनुकरण किया जा रहा है)। इसका अर्थ है कि ग्लोबल वेरिएबल्स में जैसे $_GET जैसे यदि एक मान है उदाहरण के लिए $_GET["param"]="1234", तो आप इसे $param के माध्यम से एक्सेस कर सकते हैं। इसलिए, HTTP पैरामीटर भेजकर आप उन वेरिएबल्स को ओवरराइट कर सकते हैं जो कोड के भीतर उपयोग किए जाते हैं।
एक ही डोमेन के PHPSESSION कुकीज एक ही स्थान पर संग्रहित होती हैं, इसलिए यदि एक डोमेन के भीतर विभिन्न पथों में विभिन्न कुकीज का उपयोग किया जाता है तो आप उसे एक पथ कुकी का उपयोग करने के लिए सेट कर सकते हैं दूसरे पथ की मान को। इस तरह अगर दोनों पथ एक ही नाम के वेरिएबल का उपयोग करते हैं तो आप पथ1 में उस वेरिएबल की मान लागू कर सकते हैं पथ2 पर। और फिर पथ2 पथ1 के वेरिएबल्स को मान्य मान लेगा (कुकी को उस नाम का नाम देकर जो पथ2 में उसके लिए संबंधित है)।
जब आपके पास मशीन के उपयोगकर्ताओं के उपयोगकर्ता नाम होते हैं। पता करें: /~<USERNAME> कि क्या php निर्देशिकाएँ सक्रिय हैं।
password_hash/password_verify
यह फ़ंक्शन आम तौर पर PHP में पासवर्ड से हैश उत्पन्न करने और यह जांचने के लिए उपयोग किया जाता है कि क्या एक पासवर्ड सही है या नहीं एक हैश के साथ तुलना की जाती है।
समर्थित एल्गोरिदम हैं: PASSWORD_DEFAULT
और PASSWORD_BCRYPT
(शुरू होता है $2y$
)। ध्यान दें कि PASSWORD_DEFAULT अक्सर PASSWORD_BCRYPT के समान होता है। और वर्तमान में, PASSWORD_BCRYPT में 72 बाइट की इनपुट में आकार सीमा है। इसलिए, जब आप इस एल्गोरिदम के साथ 72 बाइट से अधिक कुछ हैश करने का प्रयास करते हैं तो केवल पहले 72B का ही उपयोग किया जाएगा:
HTTP headers बायपास करना PHP त्रुटियों का दुरुपयोग करके
यदि एक PHP पेज त्रुटियाँ प्रिंट कर रहा है और उपयोगकर्ता द्वारा प्रदान किए गए कुछ इनपुट को ईको कर रहा है, तो उपयोगकर्ता PHP सर्वर को कुछ सामग्री इतनी लंबी प्रिंट करने के लिए कर सकता है ताकि जब यह प्रतिक्रिया में हेडर्स जोड़ने का प्रयास करेगा तो सर्वर त्रुटि फेंकेगा। निम्नलिखित परिदृश्य में हमलावार ने सर्वर को कुछ बड़ी त्रुटियाँ फेंकने के लिए किया, और जैसा कि आप स्क्रीन में देख सकते हैं कि जब php ने हेडर जानकारी को संशोधित करने का प्रयास किया, यह नहीं कर सका (इसलिए उदाहरण के लिए सीएसपी हेडर उपयोगकर्ता को नहीं भेजा गया था):
कोड निष्पादन
system("ls"); `ls`; shell_exec("ls");
अधिक उपयोगी PHP फ़ंक्शन के लिए यह जांचें
preg_replace() के माध्यम से RCE
कोड को निष्पादित करने के लिए "बदलें" तर्क कम से कम एक मिलान की आवश्यकता है। यह preg_replace का विकल्प PHP 5.5.0 के रूप में विचारात्मक हो गया है।
Eval() के माध्यम से RCE
RCE के माध्यम से Assert()
यह फ़ंक्शन php के भीतर आपको एक स्ट्रिंग में लिखे गए कोड को निष्पादित करने की अनुमति देता है ताकि सच या झूठ लौटाया जा सके (और इस पर निर्भर करके क्रियान्वयन में परिवर्तन किया जा सके)। सामान्यत: उपयोगकर्ता चर एक स्ट्रिंग के बीच में डाला जाएगा। उदाहरण के लिए:
assert("strpos($_GET['page']),'..') === false")
--> इस मामले में RCE प्राप्त करने के लिए आप कर सकते हैं:
आपको कोड की सिंटेक्स को टूटना होगा, अपने पेलोड को जोड़ना होगा, और फिर से ठीक करना होगा। आप तार्किक ऑपरेशन जैसे कि "और" या "%26%26" या "|" का उपयोग कर सकते हैं। ध्यान दें कि "या", "||" काम नहीं करेगा क्योंकि अगर पहला स्थिति सत्य है तो हमारा पेलोड नहीं चलेगा। उसी तरह ";" काम नहीं करेगा क्योंकि हमारा पेलोड नहीं चलेगा।
दूसरा विकल्प है कि स्ट्रिंग में कमांड के निष्पादन को जोड़ें: '.highlight_file('.passwd').'
दूसरा विकल्प (अगर आपके पास आंतरिक कोड है) यह है कि कुछ चर को संशोधित करें ताकि निष्पादन में परिवर्तन हो: $file = "hola"
RCE के माध्यम से usort()
यह फ़ंक्शन एक विशिष्ट फ़ंक्शन का उपयोग करके आइटम के एक अर्रेय को क्रमबद्ध करने के लिए उपयोग किया जाता है। इस फ़ंक्शन का दुरुपयोग करने के लिए:
आप // का उपयोग करके कोड के बाकी हिस्से की टिप्पणी कर सकते हैं।
बंद करने के लिए आपको जितने भी ब्रैकेट बंद करने हैं, उनकी संख्या पता करने के लिए:
?order=id;}//
: हमें एक त्रुटि संदेश मिलता है (Parse error: syntax error, unexpected ';'
). हम संभावित रूप से एक या एक से अधिक ब्रैकेट छूट रहे हैं।?order=id);}//
: हमें एक चेतावनी मिलती है। वह सही लगता है।?order=id));}//
: हमें एक त्रुटि संदेश मिलता है (Parse error: syntax error, unexpected ')' i
). हम संभावित रूप से बहुत सारे बंद करने वाले ब्रैकेट हैं।
.httaccess के माध्यम से RCE
यदि आप .htaccess अपलोड कर सकते हैं, तो आप कई चीजें कॉन्फ़िगर कर सकते हैं और कोड भी चला सकते हैं (फ़ाइलों को ऐसे कॉन्फ़िगर करना जो .htaccess एक्सीक्यूट किया जा सकता है).
विभिन्न .htaccess शैल्स यहाँ पाए जा सकते हैं यहाँ
Env Variables के माध्यम से RCE
यदि आपको PHP में env variables को संशोधित करने की अनुमति देने वाली एक दुरुपयोगिता मिलती है (और एक और फ़ाइल अपलोड करने की अनुमति है, हालांकि अधिक अनुसंधान के साथ शायद इसे बाईपास किया जा सकता है), तो आप इस व्यवहार का दुरुपयोग करके RCE प्राप्त कर सकते हैं।
LD_PRELOAD
: यह env variable अन्य बाइनरी को निष्पादित करते समय विचारात्मक पुस्तकालयों को लोड करने की अनुमति देता है (हालांकि इस मामले में यह काम नहीं कर सकता है)।PHPRC
: PHP को इसकी कॉन्फ़िगरेशन फ़ाइल को ढूंढने के लिए निर्देशित करता है, जिसे सामान्यत:php.ini
कहा जाता है। यदि आप अपनी खुद की कॉन्फ़िग फ़ाइल अपलोड कर सकते हैं, तोPHPRC
का उपयोग करके PHP को इस पर इशारा करें। एकauto_prepend_file
प्रविष्टि जो दूसरी अपलोड की गई फ़ाइल को निष्पादित करने के लिए PHP पूर्वसंस्करण को निर्देशित करती है।
अपने शैलकोड से भरी एक PHP फ़ाइल अपलोड करें
एक दूसरी फ़ाइल अपलोड करें, जिसमें PHP पूर्वसंस्करण को निर्देशित करने वाली
auto_prepend_file
निर्देशिका हो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=="'
तकनीक इस रिपोर्ट से.
PHP स्थिर विश्लेषण
देखें कि आप इन फ़ंक्शन के कॉल में कोड डाल सकते हैं (यहाँ से यहाँ):
यदि आप एक PHP एप्लिकेशन को डीबग कर रहे हैं तो आप /etc/php5/apache2/php.ini
में display_errors = On
जोड़कर एरर प्रिंटिंग को ग्लोबली सक्षम कर सकते हैं और अपाचे को पुनः आरंभ करें: sudo systemctl restart apache2
PHP कोड को डीओबफस्केट करना
आप वेब www.unphp.net का उपयोग करके PHP कोड को डीओबफस्केट कर सकते हैं।
PHP रैपर्स और प्रोटोकॉल
PHP रैपर्स और प्रोटोकॉल आपको सिस्टम में लेखन और पठन सुरक्षा को छलकर उसे कमर्म करने की अनुमति दे सकते हैं। अधिक जानकारी के लिए इस पेज की जाँच करें.
Xdebug अनअथेंटिकेटेड RCE
यदि आप देखते हैं कि Xdebug phpconfig()
आउटपुट में सक्षम है तो आपको https://github.com/nqxcode/xdebug-exploit के माध्यम से RCE प्राप्त करने का प्रयास करना चाहिए।
चरवर्ती चर्वर्ती
RCE नए $_GET["a"]($_GET["b"]) का दुरुपयोग
यदि किसी पृष्ठ में किसी भी वर्ग के एक नया ऑब्जेक्ट बना सकते हैं तो आप RCE प्राप्त कर सकते हैं, निम्नलिखित पृष्ठ की जाँच करें और जानें कैसे:
अक्षरों के बिना PHP को निष्पादित करें
https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/
ऑक्टल का उपयोग
XOR
XOR आसान शैल कोड
इस व्रिटअप के अनुसार निम्नलिखित तरीके से एक आसान शैलकोड उत्पन्न किया जा सकता है:
इसलिए, अगर आप संख्याओं और अक्षरों के बिना विचारशील PHP को क्रियान्वित कर सकते हैं तो आप निम्नलिखित तरह का अनुरोध भेज सकते हैं जिसमें उस पेलोड का दुरुपयोग करके विचारशील PHP को क्रियान्वित किया जा सकता है:
और विस्तृत व्याख्या के लिए देखें https://ctf-wiki.org/web/php/php/#preg_match
XOR शेलकोड (इन्साइड ईवैल)
पर्ल जैसा
Last updated