Skip to content

Back to the catalog

graphw00f
github.comrepo

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).

TL;DR CLI tool that fingerprints the backend GraphQL engine of an API endpoint and reports its known security posture via the GraphQL Threat Matrix.
Document

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/graphql

If you don't know where GraphQL lives, chain detect + fingerprint:

python3 main.py -f -d -t http://localhost:5000

Install requires only python3 and requests:

git clone https://github.com/dolevf/graphw00f.git

Useful 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