graphw00f
graphw00f is a GraphQL fingerprinting tool (inspired by wafw00f) that sends benign and malformed GET/POST queries to identify which GraphQL engine (Graphene, Apollo, Hasura, WPGraphQL, graphql-java, AWS AppSync, and dozens more) is running behind an endpoint. It cross-references detections against the GraphQL Threat Matrix project to report each engine's built-in security defenses and known CVEs, helping pentesters and security engineers assess GraphQL API attack surface (CWE-200 information disclosure via engine fingerprinting).
What it is
graphw00f is a command-line GraphQL fingerprinting tool (main.py) by Dolev Farhi. The summary covers what it detects; what it doesn't cover is how you actually operate it — the two-mode workflow, the endpoint-discovery step, and header/cookie configuration for authenticated targets.
How it works
Two modes that are meant to be combined. Detect mode (-d) locates where GraphQL lives on a host (optionally guided by a wordlist of candidate endpoint paths via -w); fingerprint mode (-f) then sends the benign/malformed queries against a known endpoint to identify the engine. It handles both GET- and POST-based querying. The underlying weakness it exploits is that implementations respond distinguishably to crafted queries, mutations, and subscriptions — classified as CWE-200 (information exposure). On a successful fingerprint it prints the matching GraphQL Threat Matrix doc plus a direct "Attack Surface Matrix" URL for that engine.
What to do
If you already know the endpoint path, fingerprint it directly:
python3 main.py -f -t https://demo.hypergraphql.org:8484/graphqlIf you don't know where GraphQL lives, chain detect + fingerprint:
python3 main.py -f -d -t http://localhost:5000Install requires only python3 and requests:
git clone https://github.com/dolevf/graphw00f.gitUseful flags: -p for an HTTP(S) proxy (http://user:pass@host:port), -T request timeout, -o CSV output, -r to suppress following 3xx redirects, -l to list all detectable engines.
For authenticated or cookie-gated endpoints, set headers/cookies in conf.py:
# Custom Headers
HEADERS = {'User-Agent':'graphw00f'}
# Custom Cookies
COOKIES = {"PHPSESS":"DEADBEEF"}Or pass them at the command line with -H "Authorization: Bearer ..." and -u for the user-agent. Note the precedence: a command-line --user-agent overrides any User-Agent set in conf.py.
Caveats
graphw00f only identifies the engine and surfaces its documented default defenses/CVEs via the Threat Matrix — it does not itself exploit anything or confirm a given CVE is present in the target's specific version. The engine list is a moving target (the README shows tool versions v1.0.7 through v1.1.2 in its examples); run -l against your installed copy for the authoritative set rather than trusting a cached list.
Organisations named here
- CWE-200
Technologies named here
- graphw00f
- Graphene
- wafw00f
- Ariadne
- Apollo
- GraphQL Threat Matrix
- graphql-go
- Damn Vulnerable GraphQL Application
- gqlgen
- WPGraphQL
- GraphQL API for Wordpress
- Gato GraphQL
- graphql-ruby
- graphql-php
- Hasura
- HyperGraphQL
- graphql-java
- Juniper
- Sangria
- Flutter
- Diana.jl
- Strawberry
- Tartiflette
- Dgraph
- Directus
- AWS AppSync
- GraphQL Yoga
- Lighthouse
- Agoo
- Mercurius
- morpheus-graphql
- Lacinia
- Caliban
- jaal
- absinthe-graphql
- GraphQL.NET
- pg_graphql
- tailcall
- Hot Chocolate
- Inigo
- ballerina-graphql
- GraphQL
- Python
- WordPress
- AWS
Techniques named here
- GraphQL endpoint detection
Related in AppSec
Flowise MCP Security Bypass Enables RCE
Inside an Oracle Database SQL Injection Attack | Huntress
OASIS
