From 9b216b4e99230ebc23259c7b2ad50e2cce3e9545 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 5 Feb 2025 10:24:48 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/graphql.md'] --- .../pentesting-web/graphql.md | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 64d34fb73..1faac5cac 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -170,7 +170,7 @@ Si l'introspection est activée, vous pouvez utiliser [**GraphQL Voyager**](http ### Interrogation -Maintenant que nous savons quel type d'information est enregistré dans la base de données, essayons d'**extraire certaines valeurs**. +Maintenant que nous savons quel type d'information est enregistré dans la base de données, essayons d'**extraire quelques valeurs**. Dans l'introspection, vous pouvez trouver **quel objet vous pouvez interroger directement** (car vous ne pouvez pas interroger un objet juste parce qu'il existe). Dans l'image suivante, vous pouvez voir que le "_queryType_" s'appelle "_Query_" et qu'un des champs de l'objet "_Query_" est "_flags_", qui est également un type d'objet. Par conséquent, vous pouvez interroger l'objet flag. @@ -193,7 +193,7 @@ Vous pouvez simplement l'interroger avec : query = { hiddenFlags } ``` Dans un autre exemple où il y avait 2 objets à l'intérieur de l'objet de type "_Query_": "_user_" et "_users_".\ -Si ces objets n'ont pas besoin d'argument pour rechercher, vous pourriez **récupérer toutes les informations les concernant** simplement en **demandant** les données que vous voulez. Dans cet exemple d'Internet, vous pourriez extraire les noms d'utilisateur et mots de passe sauvegardés : +Si ces objets n'ont pas besoin d'argument pour rechercher, vous pourriez **récupérer toutes les informations les concernant** juste en **demandant** les données que vous voulez. Dans cet exemple d'Internet, vous pourriez extraire les noms d'utilisateur et mots de passe sauvegardés : ![](<../../images/image (880).png>) @@ -219,7 +219,7 @@ Et pendant la **phase d'énumération**, j'ai découvert que l'objet "_**dbuser* **Truc de dump de chaîne de requête (merci à @BinaryShadow\_)** -Si vous pouvez rechercher par un type de chaîne, comme : `query={theusers(description: ""){username,password}}` et que vous **cherchez une chaîne vide**, cela va **dump toutes les données**. (_Notez que cet exemple n'est pas lié à l'exemple des tutoriels, pour cet exemple, supposons que vous pouvez rechercher en utilisant "**theusers**" par un champ de chaîne appelé "**description**"_). +Si vous pouvez rechercher par un type de chaîne, comme : `query={theusers(description: ""){username,password}}` et que vous **cherchez une chaîne vide**, cela va **dump toutes les données**. (_Notez que cet exemple n'est pas lié à l'exemple des tutoriels, pour cet exemple, supposez que vous pouvez rechercher en utilisant "**theusers**" par un champ de chaîne appelé "**description**"_). ### Recherche @@ -291,7 +291,7 @@ Dans l'**introspection**, vous pouvez trouver les **mutations** **déclarées**. Dans cette configuration, une **base de données** contient des **personnes** et des **films**. Les **personnes** sont identifiées par leur **email** et **nom** ; les **films** par leur **nom** et **note**. Les **personnes** peuvent être amies entre elles et avoir également des films, indiquant des relations au sein de la base de données. -Une mutation pour **créer de nouveaux** films dans la base de données peut ressembler à la suivante (dans cet exemple, la mutation s'appelle `addMovie`) : +Une mutation pour **créer de nouveaux** films dans la base de données peut ressembler à la suivante (dans cet exemple, la mutation est appelée `addMovie`) : ```javascript mutation { addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) { @@ -304,7 +304,7 @@ rating ``` **Notez comment à la fois les valeurs et le type de données sont indiqués dans la requête.** -De plus, la base de données prend en charge une opération de **mutation**, nommée `addPerson`, qui permet la création de **personnes** ainsi que leurs associations à des **amis** et des **films** existants. Il est crucial de noter que les amis et les films doivent préexister dans la base de données avant de les lier à la personne nouvellement créée. +De plus, la base de données prend en charge une opération de **mutation**, nommée `addPerson`, qui permet la création de **personnes** ainsi que leurs associations avec des **amis** et des **films** existants. Il est crucial de noter que les amis et les films doivent préexister dans la base de données avant de les lier à la personne nouvellement créée. ```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"}]) { @@ -359,7 +359,7 @@ Une belle **liste de mots** pour découvrir [**les entités GraphQL peut être t ### Contournement des défenses d'introspection GraphQL -Pour contourner les restrictions sur les requêtes d'introspection dans les API, l'insertion d'un **caractère spécial après le mot-clé `__schema`** s'avère efficace. Cette méthode exploite les erreurs courantes des développeurs dans les motifs regex qui visent à bloquer l'introspection en se concentrant sur le mot-clé `__schema`. En ajoutant des caractères comme **espaces, nouvelles lignes et virgules**, que GraphQL ignore mais qui pourraient ne pas être pris en compte dans les regex, les restrictions peuvent être contournées. Par exemple, une requête d'introspection avec une nouvelle ligne après `__schema` peut contourner de telles défenses : +Pour contourner les restrictions sur les requêtes d'introspection dans les API, l'insertion d'un **caractère spécial après le mot-clé `__schema`** s'avère efficace. Cette méthode exploite les erreurs courantes des développeurs dans les motifs regex qui visent à bloquer l'introspection en se concentrant sur le mot-clé `__schema`. En ajoutant des caractères comme **espaces, nouvelles lignes et virgules**, que GraphQL ignore mais qui pourraient ne pas être pris en compte dans le regex, les restrictions peuvent être contournées. Par exemple, une requête d'introspection avec une nouvelle ligne après `__schema` peut contourner de telles défenses : ```bash # Example with newline to bypass { @@ -411,9 +411,9 @@ Si vous ne savez pas ce qu'est le CSRF, lisez la page suivante : ../../pentesting-web/csrf-cross-site-request-forgery.md {{#endref}} -Vous pourrez trouver plusieurs points de terminaison GraphQL **configurés sans tokens CSRF.** +Là-bas, vous pourrez trouver plusieurs points de terminaison GraphQL **configurés sans jetons CSRF.** -Notez que les requêtes GraphQL sont généralement envoyées via des requêtes POST en utilisant le Content-Type **`application/json`**. +Notez que les requêtes GraphQL sont généralement envoyées via des requêtes POST utilisant le type de contenu **`application/json`**. ```javascript {"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"} ``` @@ -501,7 +501,7 @@ Pour atténuer cela, mettez en œuvre des limites de compte d'alias, une analyse ### **Batching de Requêtes Basé sur des Tableaux** -**Batching de Requêtes Basé sur des Tableaux** est une vulnérabilité où une API GraphQL permet de regrouper plusieurs requêtes dans une seule demande, permettant à un attaquant d'envoyer un grand nombre de requêtes simultanément. Cela peut submerger le backend en exécutant toutes les requêtes groupées en parallèle, consommant des ressources excessives (CPU, mémoire, connexions à la base de données) et pouvant potentiellement conduire à un **Denial of Service (DoS)**. S'il n'existe aucune limite sur le nombre de requêtes dans un lot, un attaquant peut exploiter cela pour dégrader la disponibilité du service. +Le **Batching de Requêtes Basé sur des Tableaux** est une vulnérabilité où une API GraphQL permet de regrouper plusieurs requêtes dans une seule demande, permettant à un attaquant d'envoyer un grand nombre de requêtes simultanément. Cela peut submerger le backend en exécutant toutes les requêtes groupées en parallèle, consommant des ressources excessives (CPU, mémoire, connexions à la base de données) et pouvant potentiellement conduire à un **Denial of Service (DoS)**. S'il n'existe aucune limite sur le nombre de requêtes dans un lot, un attaquant peut exploiter cela pour dégrader la disponibilité du service. ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -513,7 +513,7 @@ Dans cet exemple, 10 requêtes différentes sont regroupées en une seule demand ### **Vulnérabilité de Surcharge de Directive** -**Surcharge de Directive** se produit lorsqu'un serveur GraphQL permet des requêtes avec des directives excessives et dupliquées. Cela peut submerger le parseur et l'exécuteur du serveur, surtout si le serveur traite de manière répétée la même logique de directive. Sans validation ou limites appropriées, un attaquant peut exploiter cela en créant une requête avec de nombreuses directives dupliquées pour déclencher une utilisation élevée des ressources de calcul ou de mémoire, entraînant un **Denial of Service (DoS)**. +**Surcharge de Directive** se produit lorsqu'un serveur GraphQL permet des requêtes avec des directives excessives et dupliquées. Cela peut submerger le parseur et l'exécuteur du serveur, surtout si le serveur traite de manière répétée la même logique de directive. Sans validation ou limites appropriées, un attaquant peut exploiter cela en créant une requête avec de nombreuses directives dupliquées pour déclencher une utilisation élevée des ressources de calcul ou de mémoire, entraînant une **Déni de Service (DoS)**. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -558,9 +558,13 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap) : Peut également être utilisé comme client CLI pour automatiser les attaques : `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) : Outil qui liste les différentes manières de **atteindre un type donné dans un schéma GraphQL**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection) : Le successeur des modes autonome et CLI d'InQL -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql) : Extension Burp ou script python pour des tests GraphQL avancés. Le _**Scanner**_ est le cœur d'InQL v5.0, où vous pouvez analyser un point de terminaison GraphQL ou un fichier de schéma d'introspection local. Il génère automatiquement toutes les requêtes et mutations possibles, les organisant dans une vue structurée pour votre analyse. Le composant _**Attacker**_ vous permet d'exécuter des attaques GraphQL en lot, ce qui peut être utile pour contourner des limites de taux mal implémentées : `python3 inql.py -t http://example.com/graphql -o output.json` +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql) : Extension Burp ou script python pour des tests avancés de GraphQL. Le _**Scanner**_ est le cœur d'InQL v5.0, où vous pouvez analyser un point de terminaison GraphQL ou un fichier de schéma d'introspection local. Il génère automatiquement toutes les requêtes et mutations possibles, les organisant dans une vue structurée pour votre analyse. Le composant _**Attacker**_ vous permet d'exécuter des attaques GraphQL en lot, ce qui peut être utile pour contourner des limites de taux mal implémentées : `python3 inql.py -t http://example.com/graphql -o output.json` - [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance) : Essayer d'obtenir le schéma même avec l'introspection désactivée en utilisant l'aide de certaines bases de données Graphql qui suggéreront les noms des mutations et des paramètres. +### Scripts pour exploiter des vulnérabilités courantes + +- [https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS](https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS) : Collection de scripts pour exploiter les vulnérabilités de déni de service dans des environnements graphql vulnérables. + ### Clients - [https://github.com/graphql/graphiql](https://github.com/graphql/graphiql) : Client GUI