Updated Jul 14, 2026

Fuzzing

ffuf web fuzzer: directories, params, and vhosts

A fast web fuzzer written in Go.

Agent

overview

What ffuf does

You already have a live host. Put FUZZ in the path for directories and files, in the query string or POST body (-d) for hidden parameters, or in a Host header (-H) for vhosts behind one IP. Each wordlist line fills FUZZ; ffuf records the response.

Speed only helps if you can cut noise. Keep responses with -mc (or -mc all), then drop decoys by size (-fs), words (-fw), lines (-fl), status (-fc), or regex (-fr). -ac can calibrate filter baselines from sample responses; -recursion with -recursion-depth walks into directories it finds; -mode clusterbomb or pitchfork drives several wordlists at once.

On Trickest, feed a target URL and a wordlist into the ffuf node; it writes a folder and a file. Enable -json or -of json so discovered paths, parameters, or hosts become structured output the next node can promote to a live table and probe.

source github.com/ffuf/ffuf

use cases

Where ffuf fits

Discover hidden directories and files

Fuzz a path with a content wordlist to surface admin panels, backups, and endpoints that are not linked anywhere.

Find hidden parameters

Fuzz the query string or POST body to reveal undocumented parameters worth testing for injection and access-control flaws.

Enumerate virtual hosts

Fuzz the Host header against one IP to find vhosts that do not appear in DNS.

Drive multiple injection points

Use clusterbomb or pitchfork mode with several wordlists to fuzz more than one FUZZ keyword in the same request.

reference

ffuf inputs and flags

68 inputs
NameTypeFlagDescription
urlSTRING-uTarget URL, with FUZZ marking where each wordlist entry is injected.
wordlistFILE-wWordlist file path and optional keyword, separated by a colon (path:KEYWORD).
match-status-codesSTRING-mcMatch HTTP status codes, or "all" (default 200,204,301,302,307,401,403).
filter-status-codesSTRING-fcFilter out responses by status code; comma-separated codes and ranges.
filter-response-sizeSTRING-fsFilter out responses by size; comma-separated sizes and ranges.
filter-wordsSTRING-fwFilter out responses by word count; comma-separated counts and ranges.
recursionBOOLEAN-recursionRecurse into discovered directories (the URL must end in FUZZ).
extensionsSTRING-eComma-separated extensions that extend the FUZZ keyword (.php,.bak).
threadsSTRING-tNumber of concurrent threads (default 40).

Showing key inputs. ffuf exposes 68 inputs in total.

Full flag reference (68 inputs)
NameTypeFlagDescription
urlSTRING-uTarget URL, with FUZZ where the wordlist is injected.
wordlistFILE-wWordlist file path and optional keyword, separated by a colon.
modeSTRING-modeMulti-wordlist mode: clusterbomb, pitchfork, sniper (default clusterbomb).
extensionsSTRING-eComma-separated list of extensions that extend the FUZZ keyword.
match-status-codesSTRING-mcMatch HTTP status codes, or "all" (default 200,204,301,302,307,401,403).
match-response-sizeSTRING-msMatch HTTP response size.
match-wordsSTRING-mwMatch a number of words in the response.
match-linesSTRING-mlMatch a number of lines in the response.
match-regexpSTRING-mrMatch a regexp against the response.
match-timeSTRING-mtMatch milliseconds to the first response byte, e.g. >100 or <100.
matcher-modeSTRING-mmodeMatcher set operator: and, or (default or).
filter-status-codesSTRING-fcFilter HTTP status codes; comma-separated list of codes and ranges.
filter-response-sizeSTRING-fsFilter by response size; comma-separated list of sizes and ranges.
filter-wordsSTRING-fwFilter by word count; comma-separated list of counts and ranges.
filter-linesSTRING-flFilter by line count; comma-separated list of counts and ranges.
filter-regexpSTRING-frFilter by a regexp against the response.
filter-timeSTRING-ftFilter by milliseconds to the first response byte, e.g. >100 or <100.
filter-modeSTRING-fmodeFilter set operator: and, or (default or).
autocalibrationBOOLEAN-acAutomatically calibrate filtering options (default false).
host-autocalibrationBOOLEAN-achPer-host autocalibration (default false).
custom-autocalibrationSTRING-accCustom auto-calibration string; can be repeated, implies -ac.
autocalibration-strategySTRING-acsCustom auto-calibration strategy; can be repeated, implies -ac.
autocalibration-keywordSTRING-ackAutocalibration keyword (default FUZZ).
recursionBOOLEAN-recursionScan recursively; only FUZZ is supported and the URL must end in it (default false).
recursion-depthSTRING-recursion-depthMaximum recursion depth (default 0, unlimited).
recursion-strategySTRING-recursion-strategyRecursion strategy: default (redirect-based) or greedy (default default).
threadsSTRING-tNumber of concurrent threads (default 40).
rateSTRING-rateRate of requests per second (default 0, unlimited).
delaySTRING-pSeconds of delay between requests, or a range, e.g. 0.1 or 0.1-2.0.
timeoutSTRING-timeoutHTTP request timeout in seconds (default 10).
maxtimeSTRING-maxtimeMaximum running time in seconds for the entire process (default 0).
maxtime-jobSTRING-maxtime-jobMaximum running time in seconds per job (default 0).
headerSTRING-HHeader "Name: Value", separated by a colon.
header-fileFILE-header-fileHeaders "Name: Value", one per newline.
http-methodSTRING-XHTTP method to use (default GET).
post-dataSTRING-dPOST data.
cookie-dataSTRING-bCookie data.
requestFILE-requestFile containing the raw HTTP request to fuzz.
request-protoSTRING-request-protoProtocol to use with a raw request (default https).
rawBOOLEAN-rawDo not encode the URI (default false).
http2BOOLEAN-http2Use the HTTP/2 protocol (default false).
sniSTRING-sniTarget TLS SNI; does not support the FUZZ keyword.
follow-redirectsBOOLEAN-rFollow redirects (default false).
http-proxy-urlSTRING-xProxy URL (SOCKS5 or HTTP), e.g. http://127.0.0.1:8080.
replay-proxySTRING-replay-proxyReplay matched requests through this proxy.
client-certFILE-ccClient cert for authentication; requires a client key.
client-keyFILE-ckClient key for authentication; requires a client certificate.
encodersSTRING-encEncoders for keywords, e.g. FUZZ:urlencode b64encode.
input-cmdSTRING-input-cmdCommand producing the input; requires -input-num and overrides -w.
input-numSTRING-input-numNumber of inputs to test, used with -input-cmd (default 100).
input-shellSTRING-input-shellShell used for running the input command.
ignore-wordlist-commentsBOOLEAN-icIgnore wordlist comments (default false).
dirsearch-wordlist-compatibility-modeBOOLEAN-DDirSearch wordlist compatibility mode; used with -e (default false).
jsonBOOLEAN-jsonJSON output, printing newline-delimited JSON records (default false).
output-formatSTRING-ofOutput file format: json, ejson, html, md, csv, ecsv (default json).
output-skip-empty-fileBOOLEAN-orDo not create the output file when there are no results (default false).
silentBOOLEAN-sSilent mode; do not print additional information (default false).
verboseBOOLEAN-vVerbose output, printing the full URL and any redirect location (default false).
color-outputBOOLEAN-cColorize the output.
ignore-bodyBOOLEAN-ignore-bodyDo not fetch the response content (default false).
dont-fetch-response-bodyBOOLEAN-ignore-bodyDo not fetch the response content (default false).
stop-on-forbiddenBOOLEAN-sfStop when over 95% of responses return 403 Forbidden (default false).
stop-on-spurious-errorsBOOLEAN-seStop on spurious errors (default false).
stop-on-all-errorsBOOLEAN-saStop on all error cases; implies -sf and -se (default false).
scrapersSTRING-scrapersActive scraper groups (default all).
scraperfileFILE-scraperfileCustom scraper file path.
searchSTRING-searchSearch for a FFUFHASH payload from ffuf history.
configFILE-configLoad configuration from a file.

example

Run ffuf

ffuf · command
# fuzz for hidden paths, match every code, drop 4242-byte decoy responsesffuf -u https://example.com/FUZZ \  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \  -mc all -fs 4242 -e .php,.html \  -recursion -recursion-depth 2 -t 40 \  -o results.json -of json
sample output
 :: Method           : GET :: URL              : https://example.com/FUZZ :: Wordlist         : FUZZ: raft-medium-directories.txt :: Matcher          : Response status: all :: Filter           : Response size: 4242________________________________________________ admin                   [Status: 301, Size: 178, Words: 6, Lines: 8, Duration: 44ms]login                   [Status: 200, Size: 2011, Words: 213, Lines: 61, Duration: 91ms].git/HEAD               [Status: 200, Size: 23, Words: 2, Lines: 1, Duration: 63ms]backup                  [Status: 403, Size: 279, Words: 20, Lines: 10, Duration: 38ms]:: Progress: [30000/30000] :: Job [1/1] :: 980 req/sec :: Duration: [0:00:31] :: Errors: 0 ::

guidance

Choosing ffuf

Use ffuf to discover content, parameters, or vhosts on a host you already know is live. Filter responses by status, size, or words to cut noise. To run one wordlist across many URLs, use ffuf-multi; for recursive defaults, feroxbuster.

feroxbuster

Recursive content discovery with opinionated defaults. ffuf gives you one engine and full matcher/filter control.

gobuster

Classic directory and DNS brute force. ffuf adds parameter fuzzing and richer filtering.

ffuf-multi

Same ffuf engine across many URLs in one run. Use plain ffuf for a single target and wordlist.

faq

ffuf questions

`-mc` sets which HTTP status codes count as a match; default is 200,204,301,302,307,401,403. Pass `-mc all` to match every response, then remove noise with size or word filters like `-fs` and `-fw`. On Trickest, set the match-status-codes input.

Run ffuf yourself

A target and a wordlist feed ffuf, which fuzzes the request and writes the discovered paths as a queryable output.

Facts on this page come from the live Trickest tool library.