Skip to content

ffuf -- Web Fuzzer

ffuf (Fuzz Faster U Fool) is a flexible, high-speed web fuzzer written in Go. It replaces the keyword FUZZ in URLs, headers, POST data, or any part of an HTTP request with entries from a wordlist. Unlike gobuster which focuses on directory enumeration, ffuf can fuzz any part of an HTTP request — making it the go-to tool for parameter discovery, POST data brute-forcing, virtual host enumeration, and more.

Key capabilities:

  • Directory fuzzing — discover hidden paths and files
  • Parameter discovery — find hidden GET/POST parameters
  • Value fuzzing — brute-force parameter values (passwords, IDs)
  • Header fuzzing — discover virtual hosts via Host header
  • Multi-position fuzzing — use FUZZ and FUZ2 for combined attacks
Terminal window
# Requires a target argument (URL)
bash scripts/ffuf/examples.sh <url>
# Or via Makefile
make ffuf TARGET=<url>
# Examples
bash scripts/ffuf/examples.sh http://localhost:8080
bash scripts/ffuf/examples.sh http://example.com

The script prints 10 example commands covering directory fuzzing, parameter discovery, POST data attacks, header fuzzing, and output options, then offers to run a basic directory fuzz interactively.

FlagWhat It Does
-u URLTarget URL (must contain the FUZZ keyword)
-w FILEPath to wordlist (use :KEYWORD for named keywords)
-t NNumber of concurrent threads (default: 40 — use 10 for labs)
-mc CODESMatch HTTP status codes (e.g., 200,301)
-fc CODESFilter (hide) HTTP status codes (e.g., 404,403)
-fs SIZEFilter by response size (bytes)
-fw COUNTFilter by word count in response
-fl COUNTFilter by line count in response
-acAuto-calibration — automatically filter common responses
-X METHODHTTP method (default: GET)
-d DATAPOST data (use FUZZ in the data string)
-H HEADERAdd custom header (e.g., Host: FUZZ.example.com)
-o FILEOutput file path
-of FORMATOutput format: json, ejson, html, md, csv, all
-rate NMaximum requests per second
-recursionEnable recursive fuzzing
-e EXTSComma-separated list of extensions (e.g., .php,.html)
Terminal window
brew install ffuf

fuzz-parameters.sh — Parameter discovery and value fuzzing

Section titled “fuzz-parameters.sh — Parameter discovery and value fuzzing”

Discovers hidden GET and POST parameters on web applications and fuzzes their values. Finds debug flags, admin toggles, IDOR vulnerabilities, and undocumented API parameters that are not visible in the UI.

When to use: After directory enumeration, when you want to explore what parameters each discovered page accepts. Especially useful for finding privilege escalation paths and hidden functionality on lab targets like DVWA.

Key commands:

Terminal window
# Discover hidden GET parameters
ffuf -u "http://localhost:8080/page.php?FUZZ=test" -w wordlists/common.txt -fs 0 -t 10
# Brute-force a known parameter's value
ffuf -u "http://localhost:8080/page.php?id=FUZZ" -w wordlists/common.txt -fs 0 -t 10
# Discover hidden POST parameters
ffuf -u http://localhost:8080/login.php -X POST -d "FUZZ=test" -w wordlists/common.txt -fs 0 -t 10
# JSON API parameter discovery
ffuf -u http://localhost:8080/api/endpoint -X POST -H "Content-Type: application/json" -d '{"FUZZ":"test"}' -w wordlists/common.txt -fs 0 -t 10

Make target: make fuzz-params TARGET=<url>

The FUZZ keyword is what makes ffuf flexible. Place it anywhere in the request to control what gets fuzzed:

PositionEffectExample
URL pathDirectory/file fuzzing-u http://target/FUZZ
Query parameter nameParameter discovery-u "http://target/page?FUZZ=test"
Query parameter valueValue brute-forcing-u "http://target/page?id=FUZZ"
POST dataForm field fuzzing-d "FUZZ=test" or -d "password=FUZZ"
Header valueVirtual host discovery-H "Host: FUZZ.example.com"

For two-position fuzzing, use FUZZ and FUZ2 with named wordlists:

Terminal window
ffuf -u "http://target/page?FUZZ=FUZ2" -w params.txt:FUZZ -w values.txt:FUZ2

ffuf requires a wordlist (-w) for every scan. This project includes a download helper:

Terminal window
make wordlists

This downloads SecLists wordlists to the wordlists/ directory:

WordlistEntriesUse For
common.txt~4,700Quick directory scans, parameter discovery
directory-list-2.3-small.txt~87,000Thorough directory scans
subdomains-top1million-5000.txt~5,000Virtual host and subdomain fuzzing

If you see “Wordlist not found” errors, run make wordlists first.

  • ffuf defaults to 40 concurrent threads. Use -t 10 for lab targets to avoid overwhelming Docker containers.
  • The -ac (auto-calibration) flag is very useful for filtering noise — it automatically detects and filters the most common response size/word count.
  • Use -fs 0 to filter empty responses, which are common when fuzzing parameters that do not exist.
  • Unlike gobuster, ffuf does not have separate modes — the FUZZ keyword position determines what you are testing.
  • The -rate flag limits requests per second and is useful for avoiding WAF detection or rate limiting.
  • Output format -of json is recommended for machine-readable results that can be piped to other tools.
  • gobuster — directory enumeration and DNS subdomain discovery (simpler but focused)
  • nikto — web server vulnerability scanner (checks known vulnerabilities, not brute-force)
  • sqlmap — after finding parameters with ffuf, test them for SQL injection