GraphQL
Graph Query Language
Derniรจre mise ร jour
Cet article vous a-t-il รฉtรฉ utile ?
Graph Query Language
Derniรจre mise ร jour
Cet article vous a-t-il รฉtรฉ utile ?
https://ivangoncharov.github.io/graphql-voyager/: Transforme les donnรฉes graphql en graphique
https://lucasconstantino.github.io/graphiql-online/: Permet une interaction facilitรฉ avec les endpoints graphql.
https://altair-gql.sirmuel.design/: Mรชme principe que graphiql.
https://github.com/nicholasaleks/graphql-threat-matrix: matrice des surfaces d'attaque de chaque implรฉmentations de graphQL.
GraphQL fonctionne en un seul endpoint qui ne renvoie que les informations exactement demandรฉes.
Cette technologie fonctionne avec deux types de requรชtes:
Les queries sont utilisรฉes afin de recupรฉrer des donnรฉes ร l'aide d'opรฉrations spรฉcifiquement dรฉfinies. Ils s'agit grossiรจrement de l'รฉquivalent de la mรฉthode GET du protocole HTTP pour l'API.
Pour que les queries renvoient les donnรฉes voulues, il faut que les donnรฉes demandรฉes correspondent exactement ร celles souhaitรฉs dans la rรฉponse du serveur. Les requรชtes peuvent demander des arguments et sur la base de ces arguments, des donnรฉes spรฉcifiques peuvent รชtre interrogรฉs.
Exemple:
Les mutations quant ร elles sont utilisรฉes pour ajouter, modifier ou supprimer des donnรฉes dans le systรจme. Il s'agit grossiรจrement de l'รฉquivalent des mรฉthodes PUT, DELETE et POST du protocole HTTP dans l'API. L'avantage de ce type de requรชtes est qu'il est alors possible de demander ร mettre ร jour une donnรฉe dans la mรชme requรชte en changeant simplement le type de requรชte (query -> mutation).
Exemple:
L'introspection est une fonctionnalitรฉ du systรจme pouvant permettre si il est activรฉ d'interroger les ressources disponibles dans le schรฉma de l'API. De ce fait, il est possible de dumper entiรจrement le schรฉma de l'API en envoyant postant ces donnรฉes depuis l'endpoint de l'API:
{"query": "query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}" }
La taille de la rรฉponse obtenue peut alors รชtre trรจs important rendant difficile le travail d'analyse mais heureusement il existe le site https://ivangoncharov.github.io/graphql-voyager/ permettant de convertir les donnรฉes brutes obtenues en graphique plus lisible.
Dans le cas ou l'introspection serait dรฉsactivรฉ, il est nรฉcessaire de fuzz l'endpoint pour trouver des endpoints.
Les API graphql nรฉcessites de procรฉder aux mรชmes tests que pour une API REST par exemple ร savoir le Top 10 OWASP et autres vulnรฉrabilitรฉs WEB.
La Batching attack est une attaque spรฉcifique aux API graphql, elle permet d'envoyer plusieurs demandes ร un seul endpoint et en une seule requรชte et ceux sans risque d'รชtre bloquรฉ.
Il s'agit donc d'une attaque parfaite dans les scรฉnarios de brute-force et de bypass de 2FA (elle permet principalement de bypass les mรฉchanismes de rate-limit).
Trouver des cycles dans une introspection graphql:
$ inql -t https://chat-api.swapcard.com/graphql --generate-cycles -o cycles
la technique est simple, il s'agit de trouver un champs envoyant une trรจs grande rรฉponse et de dupliquer la demande plusieurs fois puis analyser le temps de rรฉponse.
Exemple:
Il est possible d'utiliser l'overloading d'alias dans un but de dรฉnis de service de la mรชme maniรจre que pour l'attaque prรฉcรฉdente en trouvant un champs utilisant beaucoup de ressources et en la dupliquant avec des alias diffรฉrents pour les considรฉrรฉs comme des requรชtes diffรฉrentes.
Exemple:
Il s'agit de la mรชme chose qu'une duplication attack mais avec des directives de cette maniรจre:
Les serveurs graphQL peuvent implรฉmenter des limites sur la quantitรฉ de donnรฉes qu'ils renvoient par dรฉfaut. Ceci est particuliรจrement important pour les champs qui renvoient des tableaux.
Si une requรชte peut utiliser un argument permettant de limiter le nombre de retours dans la rรฉponse, (limit, offset, max...) on peut essayer d'entrer une trรจs grande afin de forcer la base de donnรฉe ร renvoyer une quantitรฉ de donnรฉes qui pourrait entraรฎner un DoS.
Via erreurs verbeuses / stack traces
Via entrรฉes de contenu sensibles dans une requรชte GET
Via debug mode activรฉ (/graphql?debug=1, /graphql?XDEBUG_SESSION_START=PHPSTORM)
Via fuites d'infos dans la console du navigateur
Privilรฉgier les argument prenant des strings.
Automatisation avec sqlmap:
Dans la requรชte burp suite:
placer un asterisk (*) au point d'injection souhaitรฉ
Clic droit > "Copy to file"
$ sqlmap -r request.txt โdbms=sqlite โtables
Exmple avec Commix:
$ commix --url="https://target.com/graphql" --data='{"query":"query{exemple(arg:"test ")}"}' -p arg
CrackQL est un outil de brute-forcing et fuzzing de GraphQL.
Exemple d'utilisation:
$ python3 CrackQL.py -t http://target.com/graphql -q sample-queries/login.graphql -i sample-inputs/usernames_and_passwords.csv --verbose [-b pour utiliser du batching]
ressource: https://github.com/nicholasaleks/CrackQL
graphql-cop est un scanner de vulnรฉrabilitรฉ dรฉdiรฉ aux APIs GraphQL.
Utilisation:
ressource: https://github.com/dolevf/graphql-cop
BatchQL est un script d'audit de sรฉcuritรฉ GraphQL axรฉ sur l'exรฉcution de requรชtes et de mutations GraphQL par lots.
Utilisation:
ressource: https://github.com/assetnote/batchql
graphw00f est un scanner d'endpoint graphQL permettant de dรฉtecter le moteur graphql utilisรฉ.
Utilisation:
ressource: https://github.com/dolevf/graphw00f
InQL est une extension de burp suite permettant d'arriver ร un resultat semblable au site web "graphiql".
GraphQLmap est un outil permettant d'interagir avec les endpoints graphql.
ressource: https://github.com/swisskyrepo/GraphQLmap
Permet d'obtenir le schรฉma de l'API GraphQL mรชme si l'introspection est dรฉsactivรฉe.
ressource: https://github.com/nikitastupin/clairvoyance