graphw00f: fingerprinting de endpoints GraphQL
graphw00f · BSD-3-Clause
O graphw00f faz fingerprinting de servidores GraphQL. Ele envia um punhado de queries específicas de engine e, pelo comportamento de erro e resposta, identifica qual implementação GraphQL está rodando — Apollo, Hasura, graphql-ruby, e dezenas mais. Saber a engine te diz quais fraquezas procurar, porque padrões de introspection, comportamento de batching e verbosidade de erro variam por implementação.
Instalação
git clone https://github.com/dolevf/graphw00f.git
cd graphw00f && pip install -r requirements.txt
python main.py -h Comandos principais
# detecta um endpoint GraphQL, depois faz fingerprint
python main.py -d -f -t https://example.com/graphql
# fornece o endpoint diretamente
python main.py -f -t https://example.com/api/graphql
# com headers
python main.py -f -t https://example.com/graphql
-H "Authorization: Bearer TOKEN"
# lista o que ele consegue identificar
python main.py -l O -d roda detecção (achar o endpoint), o -f roda fingerprinting (identificar a engine).
Saída
[*] Found GraphQL at https://example.com/graphql
[*] Discovered GraphQL Engine: (Apollo)
[!] Attack Surface Matrix: https://github.com/nicholasaleks/graphql-threat-matrix Onde ele entra no Tandera
O graphw00f roda na fase de analyze do recon_web_lite. É seguro para o fluxo NonIntrusive porque o fingerprinting é um pequeno número de queries benignas. Quando identifica uma engine, estabelece o contexto que o resto da avaliação usa — um endpoint GraphQL é uma superfície de ataque diferente de REST, e a engine determina quais partes dela ficam expostas por padrão.
Usando em um pentest
A engine mapeia para um conjunto conhecido de fraquezas. Uma vez que você sabe que é Apollo versus Hasura, a GraphQL Threat Matrix te diz os comportamentos padrão a verificar — introspection, field suggestions, batching, limite de profundidade. O fingerprinting transforma um genérico “teste o GraphQL” num checklist específico.
Introspection é a primeira coisa a verificar. Se estiver habilitada, você tem o schema completo — todo tipo, query e mutation, incluindo as administrativas que a UI nunca chama. Esse é seu mapa para tudo depois.
Batching habilita ataques que o rate limiter não vê. Algumas engines permitem enviar muitas operações numa requisição. Se o login é uma mutation, o batching de queries pode transformar uma requisição HTTP em centenas de tentativas de senha sob uma única contagem de rate-limit. Verifique se a engine identificada permite isso.