Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
poc-graphql — Recherche sur GraphQL d'un point de vue AppSec. | Kitploit
Outils/GitHubGitHub/righettod/poc-graphql
Analyse des VulnérabilitésExploitation d'Applications WebTests de Sécurité des APITests d'IntrusionApprentissage et ÉducationLabs et PratiqueArchived
GitHubrighettod/poc-graphql

poc-graphql

Recherche sur GraphQL d'un point de vue AppSec.

Voir le dépôt
4185915il y a 3 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Build and deploy the image

Table des matières

  • Table des matières
  • Recherche sur GraphQL
    • Objectif
    • Laboratoires
    • Déploiement sur Docker
    • Faiblesses de sécurité
      • Autorisation
        • Problème
        • Recommandation
      • Injection
        • Problème
        • Recommandation
      • Épuisement des ressources
        • Problème
        • Recommandation
      • Exposition de données privées
        • Problème
        • Recommandation
      • Exposition d'informations techniques en cas d'erreur inattendue
        • Problème
        • Recommandation
      • Insecure Direct Object Reference
        • Problème
      • Exposition de l'API à la mauvaise sphère de clients
        • Problème
          • Activation par défaut du point de terminaison WebSocket Subscriptions
          • Activation par défaut du partage des ressources entre origines multiples
        • Recommandation
    • Requêtes de découverte
    • Références utilisées
      • GraphQL
      • Laboratoires

Recherche sur GraphQL

Objectif

  1. Étudier ce qu'est GraphQL.
  2. Analyser l'utilisation de GraphQL d'un point de vue AppSec (attaques et défenses).
  3. Identifier les faiblesses potentielles exploitables pour des attaques.

Laboratoires

Un laboratoire a été créé afin d'étudier les différentes problématiques, celui-ci prend le contexte d'un vétérinaire gérant les soins de santé de chiens.

Le laboratoire a été développé avec IntelliJ IDEA Community Edition.

Les domaines utilisés sont les suivants :```text

Define in host file

127.0.0.1 localhost 127.0.0.1 domain1.local 127.0.0.1 domain2.local

Voici les conditions et hypothèses du laboratoire :

* Un vétérinaire peut être associé à 0 ou N chiens.
* Un chien peut être associé à 0 ou 1 vétérinaire.
* Un vétérinaire possède une propriété nommée **Popularity** présente dans le système de stockage (base de données) mais elle ne doit pas être accessible par un client GraphQL car c'est une information sensible.
* Du point de vue de la consommation de données GraphQL, c'est le vétérinaire. Les informations sur les chiens sont publiques.
* Le laboratoire est explicitement une application vulnérable dans laquelle plusieurs vulnérabilités ont été implémentées et sont identifiées à l'aide du marqueur `[VULN]` dans les commentaires.
* Concernant l'authentification, un faux service tiers a été implémenté (via une servlet) et retourne un jeton JWT contenant le nom du vétérinaire dans le jeton.

Une fois démarré via la configuration de lancement présente dans le projet ou la ligne de commande `mvn spring-boot:run`, le laboratoire est disponible sur ces points de terminaison :

* [GraphiQL](http://localhost:8080/graphiql)
* [GraphQL](http://localhost:8080/graphql)

Pour empaqueter l'application sous forme de fichier jar portable, utilisez la commande `mvn package` (un fichier jar pré-construit est disponible [ici](https://github.com/righettod/poc-graphql/releases)) :
* Le fichier jar sera créé dans le dossier *target* et sera nommé *graphql-poc.jar*.
* Utilisez la commande `java -jar graphql-poc.jar` pour exécuter l'application.

## Déploiement sur Docker

> L'image est publiée chaque jour sur [DockerHub](https://hub.docker.com/r/righettod/poc-graphql)

Pour déployer l'application dans un conteneur Docker, suivez les étapes :

1. Assurez-vous d'avoir `docker` installé.
2. Clonez le dépôt avec `git clone`.
3. Placez-vous dans le répertoire cloné.
4. Construisez l'image Docker en utilisant `docker build -t poc-graphql .`
5. Une image nommée **poc-graphql:latest** a maintenant été créée sur votre machine.
6. Exécutez le conteneur avec `docker run -p 8080:8080 poc-graphql:latest`
7. Accédez au laboratoire via les points de terminaison suivants :
   * [GraphiQL](http://localhost:8080/graphiql)
   * [GraphQL](http://localhost:8080/graphql)

## Faiblesses de sécurité

### Autorisation

*contrôle d'accès défaillant*

[CWE-285](https://cwe.mitre.org/data/definitions/285.html)

#### Problème

Étant donné que GraphQL repose sur un point de terminaison unique vers lequel toutes les requêtes sont envoyées et que l'autorisation ne fait pas partie du périmètre de la spécification (pas de fonctionnalités intégrées).

Il revient à l'application de mettre en œuvre une logique d'autorisation.

Dans mon laboratoire, j'ai une vulnérabilité sur ce point car la vérification du jeton d'accès ne vérifie pas que le jeton appartient au vétérinaire passé dans **veterinaryId**.

**Exemple :**

Je demande un jeton d'accès pour **Dr Julien** qui a l'identifiant **3** dans le stockage en envoyant cette requête GraphQL :```javascript
query getAccessToken {
  auth(veterinaryName: "Julien")
}

Je reçois le jeton d'accès dans la réponse GraphQL suivante :```javascript { "data": { "auth": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJwb2MiLCJzdWIiOiJKdWxpZW4iLCJpc3MiOiJBdXRoU3lzdGVtIiwiZXhwIjoxNTQ2NDQyOTAyfQ.H9A-vXRsiivFGShtdhiR3N2lSDDx-sNqbbJxMRNnExI" } }

J'envoie une requête GraphQL à la requête `myInfo(...)` en utilisant le jeton d'accès obtenu, MAIS je spécifie l'identifiant **2** qui est celui de **Dr Benoit** :```javascript
query brokenAccessControl {
  myInfo(accessToken:"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJwb2MiLCJzdWIiOiJKdWxpZW4iLCJpc3MiOiJBdXRoU3lzdGVtIiwiZXhwIjoxNTQ2NDQyOTAyfQ.H9A-vXRsiivFGShtdhiR3N2lSDDx-sNqbbJxMRNnExI", veterinaryId: 2){
    id, name, dogs {
      name
    }
  }
}

Je reçois dans la réponse GraphQL la liste des Dogs associés à Dr Benoit :```javascript { "data": { "myInfo": { "id": 2, "name": "Benoit", "dogs": [ { "name": "Babou" }, { "name": "Baboune" }, { "name": "Babylon" }, ...

#### Reco

Avec GraphQL, nous sommes passés d'une matrice d'autorisation utilisant `Rôle x Fonctionnalité` à une sécurité au niveau des données utilisant `Rôle x Données` car il y a aussi un seul point d'accès. L'identité et les rôles de l'utilisateur doivent être transmis à la couche supérieure chargée de récupérer les données (ou d'agir sur celles-ci) afin d'appliquer une vérification utilisant l'identité de l'utilisateur avant de récupérer les données.

### Injection

[CWE-20](https://cwe.mitre.org/data/definitions/20.html) / [CWE-116](https://cwe.mitre.org/data/definitions/116.html)

#### Problème

Selon la façon dont les informations de la requête/mutation/souscription GraphQL sont utilisées par le serveur GraphQL pour agir sur les magasins de données, il existe une possibilité d'injection.

Dans mes laboratoires, j'ai une vulnérabilité à ce sujet concernant l'injection SQL dans la requête `dogs(namePrefix: String, limit: Int = 500): [Dog!]` car le paramètre **namePrefix** est utilisé dans une concaténation de chaînes pour construire une requête SQL.

**Exemple :**
Télécharger l’outil