
Outil de test d'intrusion GraphQL qui exploite des limites de taux faibles et l'analyse des coûts pour forcer les identifiants par brute-force, contourner l'A2F, énumérer les utilisateurs, et fuzzer les opérations via des requêtes alias groupées.
CrackQL est un utilitaire de brute-force et de fuzzing de mots de passe pour GraphQL.
CrackQL est un outil de test d'intrusion GraphQL polyvalent qui exploite des contrôles de limite de débit et d'analyse de coûts inefficaces pour forcer brutalement les identifiants et fuzzer les opérations.
CrackQL fonctionne en regroupant automatiquement une seule requête ou mutation GraphQL en plusieurs opérations d'alias. Il détermine le nombre d'alias à utiliser en fonction des variables d'entrée CSV. Après avoir généré de manière programmatique le document GraphQL regroupé, CrackQL envoie ensuite les charges utiles à l'API GraphQL cible et analyse les résultats et les erreurs.
CrackQL peut être utilisé pour un large éventail d'attaques GraphQL car il génère de manière programmatique des charges utiles à partir d'une liste d'entrées dynamiques.
Contrairement à Burp Intruder qui envoie une requête pour chaque charge utile unique, CrackQL contourne les défenses traditionnelles de surveillance des limites de débit HTTP des API en utilisant plusieurs requêtes d'alias pour entasser de grands ensembles d'identifiants dans des requêtes HTTP uniques. Pour contourner les défenses d'analyse des coûts des requêtes, CrackQL peut être optimisé en utilisant une série d'opérations regroupées plus petites (-b) ainsi qu'un délai (-D).
CrackQL est parfait contre les déploiements GraphQL qui exploitent des opérations d'authentification GraphQL intégrées (comme le module d'authentification GraphQL). L'exemple de pulvérisation de mots de passe ci-dessous fonctionne contre DVGA avec le dictionnaire sample-inputs/users-and-passwords.csv.
mutation {
login(username: {{username|str}}, password: {{password|str}}) {
accessToken
}
}
Il est possible d'utiliser CrackQL pour contourner l'authentification à deux facteurs en envoyant tous les jetons OTP (mot de passe à usage unique).
sample-queries/otp-bypass.graphql
mutation {
twoFactor(otp: {{otp|int}}) {
accessToken
}
}
CrackQL peut également être utilisé pour des attaques d'énumération afin de découvrir des identifiants, noms d'utilisateur et adresses e-mail valides.
sample-queries/enumeration.graphql
query {
signup(email: {{email|str}}, password: {{password|str}}) {
user {
email
}
}
}
CrackQL pourrait être utilisé pour itérer sur un grand nombre d'identifiants uniques potentiels afin de divulguer des informations sur les objets.
query {
profile(uuid: {{uuid|int}}) {
name
email
picture
}
}
CrackQL peut être utilisé pour des opérations de fuzzing d'entrée générales, comme l'envoi de charges utiles potentielles SQLi et XSS.
CrackQL génère des charges utiles basées sur les variables d'entrée définies par un fichier CSV. CrackQL nécessite que l'en-tête CSV corresponde au nom de l'entrée.
sample-inputs/usernames_and_passwords.csv
username, password admin, admin admin, password admin, pass admin, pass123 admin, password123 operator, operator operator, password operator, pass operator, pass123 operator, password123
strintfloatgit clone [email protected]:nicholasaleks/CrackQL.git
pip install -r requirements.txt
python3 CrackQL.py -h
Usage: python3 CrackQL.py -t http://example.com/graphql -q sample-queries/login.graphql -i sample-inputs/usernames_and_passwords.csv
Options:
-h, --help show this help message and exit
-t URL, --target=URL Target url with a path to the GraphQL endpoint
-q QUERY, --query=QUERY
Input query or mutation operation with variable
payload markers
-i INPUT_CSV, --input-csv=INPUT_CSV
Path to a csv list of arguments (i.e. usernames,
emails, ids, passwords, otp_tokens, etc.)
-d DELIMITER, --delimiter=DELIMITER
CSV input delimiter (default: ",")
-o OUTPUT_DIRECTORY, --output-directory=OUTPUT_DIRECTORY
Output directory to store results (default:
./results/[domain]_[uuid]/
-b BATCH_SIZE, --batch-size=BATCH_SIZE
Number of batch operations per GraphQL document
request (default: 100)
-D DELAY, --delay=DELAY
Time delay in seconds between batch requests (default:
0)
--verbose Prints out verbose messaging
-v, --version Print out the current version and exit.
Utilisez config.py pour définir les cookies HTTP, les en-têtes ou les proxys si le point de terminaison nécessite une authentification.