ENUM^:Enumeration

ffuf

ffuf web fuzzing: directory/vhost/parameter discovery, matchers/filters, recursion and wordlists.

intermediateupdated 2026-08-09ffuf

ffuf

ffuf — Fast web fuzzer written in Go (v2.1.0+).

Installation

# macOS (Homebrew)
brew install ffuf

# Linux (from source)
go install github.com/ffuf/ffuf/v2@latest

# Kali Linux
sudo apt install ffuf

# Docker
docker pull ffuf/ffuf
docker run --rm ffuf/ffuf -u https://example.com/FUZZ -w /path/to/wordlist

Basic Syntax

ffuf [options] -u URL -w WORDLIST

Essential Options

-u URL              # Target URL (use FUZZ keyword)
-w WORDLIST         # Wordlist file path
-H "Header: value"  # Add custom headers
-X METHOD           # HTTP method (GET, POST, PUT, DELETE, etc.)
-d "data"           # POST data
-t THREADS          # Number of concurrent threads (default: 40)
-p DELAY            # Delay between requests (e.g., 0.1-2.0 seconds)
-rate RATE          # Rate of requests per second
-timeout SECONDS    # HTTP request timeout (default: 10)
-v                  # Verbose output
-s                  # Silent mode (no banner)
-c                  # Colorize output
-o FILE             # Output file
-of FORMAT          # Output format (json, ejson, html, md, csv, ecsv)
-recursion          # Enable recursive scanning
-recursion-depth N  # Maximum recursion depth (default: 0)
-e EXTENSIONS       # Comma-separated list of extensions to fuzz

Fuzzing Keywords

ffuf supports multiple fuzzing positions in the same request:

FUZZ     # Primary fuzzing keyword
FUZ2Z    # Secondary fuzzing keyword
FUZ3Z    # Tertiary fuzzing keyword
# ... up to FUZ99Z

Examples

# Single keyword
ffuf -u https://example.com/FUZZ -w wordlist.txt

# Multiple keywords
ffuf -u https://example.com/FUZZ/FUZ2Z -w wordlist1.txt:FUZZ -w wordlist2.txt:FUZ2Z

# Extension fuzzing
ffuf -u https://example.com/file.FUZZ -w extensions.txt

FUZZ Keyword Placement Guide

This section shows where to place the FUZZ keyword to fuzz different parts of requests.

1. DNS/Subdomain Fuzzing

# Subdomain enumeration (DNS FUZZ.website.com)
ffuf -u https://FUZZ.example.com -w subdomains.txt

# Multi-level subdomain fuzzing
ffuf -u https://FUZZ.FUZ2Z.example.com \
     -w sub1.txt:FUZZ -w sub2.txt:FUZ2Z

# Real example with common wordlist
ffuf -u https://FUZZ.google.com \
     -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt

# With filtering to remove false positives
ffuf -u https://FUZZ.example.com -w subdomains.txt -fs 1234

# With custom DNS server
ffuf -u https://FUZZ.example.com -w subdomains.txt -dns-server 8.8.8.8

2. URL Path/Directory Fuzzing

# Single directory level
ffuf -u https://example.com/FUZZ -w directories.txt

# Nested directory paths
ffuf -u https://example.com/api/FUZZ/users -w endpoints.txt

# Two-level directory fuzzing
ffuf -u https://example.com/FUZZ/FUZ2Z \
     -w dirs.txt:FUZZ -w subdirs.txt:FUZ2Z

# Deep path fuzzing
ffuf -u https://example.com/app/v1/FUZZ/config -w paths.txt

# Fuzz entire path
ffuf -u https://example.com/FUZZ -w full-paths.txt
# Where full-paths.txt contains: admin/login, api/v1/users, etc.

3. Filename Fuzzing

# Fuzz filename only
ffuf -u https://example.com/admin/FUZZ.php -w filenames.txt

# Fuzz filename and extension separately
ffuf -u https://example.com/FUZZ.FUZ2Z \
     -w filenames.txt:FUZZ -w extensions.txt:FUZ2Z

# Examples with filenames and extensions
ffuf -u https://example.com/FUZZ.FUZ2Z \
     -w <(echo -e "index\nadmin\nconfig") \
     -w <(echo -e "php\nhtml\nbak\nold")

4. File Extension Fuzzing

# Extension discovery
ffuf -u https://example.com/config.FUZZ -w extensions.txt

# With -e flag for automatic extension appending
ffuf -u https://example.com/FUZZ -w files.txt -e .php,.html,.txt,.bak

# Testing backup file extensions
ffuf -u https://example.com/index.php.FUZZ \
     -w <(echo -e "bak\nold\n~\nswp\ntmp\nbackup")

5. GET Parameter Fuzzing

# Fuzz parameter NAME
ffuf -u "https://example.com/search?FUZZ=value" -w parameters.txt

# Fuzz parameter VALUE
ffuf -u "https://example.com/search?id=FUZZ" -w values.txt

# Fuzz multiple parameters
ffuf -u "https://example.com/api?FUZZ=1&FUZ2Z=2" \
     -w params1.txt:FUZZ -w params2.txt:FUZ2Z

# Fuzz both parameter name AND value
ffuf -u "https://example.com?FUZZ=FUZ2Z" \
     -w param-names.txt:FUZZ -w param-values.txt:FUZ2Z

# Multiple existing parameters with one fuzzed
ffuf -u "https://example.com/search?user=admin&id=FUZZ&page=1" \
     -w ids.txt

# Testing for hidden parameters
ffuf -u "https://example.com/profile?user=john&FUZZ=test" \
     -w param-names.txt -fw 100

6. Virtual Host (VHOST) Header Fuzzing

# Basic VHOST fuzzing (subdomain in Host header)
ffuf -u http://10.10.10.10 -H "Host: FUZZ.example.com" -w vhosts.txt

# Fuzz entire hostname
ffuf -u http://192.168.1.100 -H "Host: FUZZ" -w hostnames.txt

# VHOST with port
ffuf -u http://example.com -H "Host: FUZZ.example.com:8080" -w vhosts.txt

# Filter false positives by response size
ffuf -u http://10.10.10.10 -H "Host: FUZZ.local" -w vhosts.txt -fs 1234

7. HTTP Header Fuzzing

# Fuzz header VALUE
ffuf -u https://example.com -H "X-Custom-Header: FUZZ" -w values.txt

# Fuzz header NAME
ffuf -u https://example.com -H "FUZZ: testvalue" -w header-names.txt

# Fuzz User-Agent
ffuf -u https://example.com -H "User-Agent: FUZZ" -w user-agents.txt

# Fuzz X-Forwarded-For (IP spoofing)
ffuf -u https://example.com -H "X-Forwarded-For: FUZZ" -w ips.txt

# Multiple header fuzzing
ffuf -u https://example.com \
     -H "X-Forwarded-For: FUZZ" \
     -H "X-Real-IP: FUZ2Z" \
     -w ips.txt:FUZZ -w ips.txt:FUZ2Z

# Authorization header fuzzing
ffuf -u https://example.com/admin -H "Authorization: Bearer FUZZ" \
     -w tokens.txt

# Custom API key header
ffuf -u https://api.example.com -H "X-API-Key: FUZZ" -w api-keys.txt

8. POST Data Fuzzing

# Fuzz POST parameter VALUE (form data)
ffuf -u https://example.com/login -X POST \
     -d "username=admin&password=FUZZ" \
     -w passwords.txt \
     -H "Content-Type: application/x-www-form-urlencoded"

# Fuzz POST parameter NAME
ffuf -u https://example.com/api -X POST \
     -d "FUZZ=testvalue" \
     -w param-names.txt \
     -H "Content-Type: application/x-www-form-urlencoded"

# Fuzz both username AND password
ffuf -u https://example.com/login -X POST \
     -d "username=FUZZ&password=FUZ2Z" \
     -w usernames.txt:FUZZ -w passwords.txt:FUZ2Z

# Fuzz multiple POST fields
ffuf -u https://example.com/register -X POST \
     -d "email=FUZZ@example.com&username=FUZ2Z&role=FUZ3Z" \
     -w emails.txt:FUZZ -w users.txt:FUZ2Z -w roles.txt:FUZ3Z

9. JSON Data Fuzzing

# Fuzz JSON field VALUE
ffuf -u https://api.example.com/auth -X POST \
     -d '{"username":"admin","password":"FUZZ"}' \
     -w passwords.txt \
     -H "Content-Type: application/json"

# Fuzz JSON field NAME
ffuf -u https://api.example.com/data -X POST \
     -d '{"FUZZ":"value"}' \
     -w field-names.txt \
     -H "Content-Type: application/json"

# Fuzz nested JSON values
ffuf -u https://api.example.com/user -X POST \
     -d '{"user":{"name":"admin","role":"FUZZ"}}' \
     -w roles.txt \
     -H "Content-Type: application/json"

# Fuzz array elements in JSON
ffuf -u https://api.example.com/permissions -X POST \
     -d '{"permissions":["read","FUZZ"]}' \
     -w permissions.txt \
     -H "Content-Type: application/json"
# Fuzz cookie VALUE
ffuf -u https://example.com -b "session=FUZZ" -w sessions.txt

# Fuzz cookie NAME
ffuf -u https://example.com -b "FUZZ=value123" -w cookie-names.txt

# Multiple cookies with one fuzzed
ffuf -u https://example.com -b "session=abc123; token=FUZZ; user=john" \
     -w tokens.txt

# Fuzz multiple cookies simultaneously
ffuf -u https://example.com -b "session=FUZZ; userid=FUZ2Z" \
     -w sessions.txt:FUZZ -w userids.txt:FUZ2Z

# Using -H header instead of -b
ffuf -u https://example.com \
     -H "Cookie: session=FUZZ; token=xyz" \
     -w sessions.txt

11. Protocol & Port Fuzzing

# Fuzz protocol (http vs https)
ffuf -u FUZZ://api.example.com -w <(echo -e "http\nhttps")

# Fuzz port numbers
ffuf -u https://example.com:FUZZ -w ports.txt
# Where ports.txt: 80, 443, 8080, 8443, 3000, 8000, etc.

# Fuzz subdomain and port together
ffuf -u https://FUZZ.example.com:FUZ2Z \
     -w subdomains.txt:FUZZ -w ports.txt:FUZ2Z

12. Username in URL Path

# Fuzz username/userid in path
ffuf -u https://example.com/users/FUZZ -w usernames.txt

# Fuzz numeric user IDs
seq 1 1000 | ffuf -u https://example.com/profile/FUZZ -w -

# Fuzz UUID format IDs
ffuf -u https://api.example.com/document/FUZZ -w uuids.txt

13. Fragment/Anchor Fuzzing

# Fuzz URL fragment (after #)
ffuf -u https://example.com/page#FUZZ -w fragments.txt
# Note: Fragments are typically client-side, but can reveal info

14. File Upload Parameter Fuzzing

# Fuzz file upload field name
ffuf -u https://example.com/upload -X POST \
     -F "FUZZ=@/path/to/file.txt" \
     -w field-names.txt

# Fuzz file content type
ffuf -u https://example.com/upload -X POST \
     -F "file=@test.txt;type=FUZZ" \
     -w content-types.txt

15. Authentication Fuzzing

# Basic Auth username fuzzing
echo -n "FUZZ:password" | base64 | \
    ffuf -u https://example.com -H "Authorization: Basic $(cat -)" -w usernames.txt

# Bearer token fuzzing
ffuf -u https://api.example.com/admin \
     -H "Authorization: Bearer FUZZ" \
     -w tokens.txt

# API key in URL parameter
ffuf -u "https://api.example.com/data?apikey=FUZZ" -w keys.txt

16. Query String Injection Points

# Fuzz inside existing query value (SQL injection testing)
ffuf -u "https://example.com/search?id=1FUZZ" -w sqli-payloads.txt

# Fuzz before parameter (path confusion)
ffuf -u "https://example.com/FUZZ?id=123" -w paths.txt

# Multiple injection points in same URL
ffuf -u "https://example.com/FUZZ?param=FUZ2Z&data=FUZ3Z" \
     -w paths.txt:FUZZ -w values.txt:FUZ2Z -w data.txt:FUZ3Z

17. GraphQL Fuzzing

# Fuzz GraphQL query
ffuf -u https://api.example.com/graphql -X POST \
     -d '{"query":"{ FUZZ { id name } }"}' \
     -w graphql-types.txt \
     -H "Content-Type: application/json"

# Fuzz GraphQL field
ffuf -u https://api.example.com/graphql -X POST \
     -d '{"query":"{ users { FUZZ } }"}' \
     -w field-names.txt \
     -H "Content-Type: application/json"

18. REST API Resource Fuzzing

# Fuzz API version
ffuf -u https://api.example.com/FUZZ/users -w api-versions.txt
# Where api-versions.txt: v1, v2, v3, api/v1, etc.

# Fuzz API resource type
ffuf -u https://api.example.com/api/v1/FUZZ -w resources.txt
# Where resources.txt: users, posts, comments, products, etc.

# Fuzz resource ID
ffuf -u https://api.example.com/api/v1/users/FUZZ -w ids.txt

19. Advanced Multi-Position Fuzzing

# Clusterbomb mode - ALL combinations (file.ext)
ffuf -mode clusterbomb \
     -u https://example.com/FUZZ.FUZ2Z \
     -w filenames.txt:FUZZ \
     -w extensions.txt:FUZ2Z

# Pitchfork mode - Parallel iteration (line by line)
ffuf -mode pitchfork \
     -u https://example.com/FUZZ \
     -w urls.txt:FUZZ \
     -w specific-values.txt:FUZ2Z

# Three fuzzing positions
ffuf -u https://FUZZ.example.com/FUZ2Z/FUZ3Z \
     -w subdomains.txt:FUZZ \
     -w dirs.txt:FUZ2Z \
     -w files.txt:FUZ3Z

20. Special Characters & Encoding

# URL-encoded fuzzing
ffuf -u "https://example.com/search?q=FUZZ" -w encoded-payloads.txt

# Double URL encoding
ffuf -u "https://example.com/path/FUZZ" -w double-encoded.txt

# Base64 encoded values
ffuf -u https://example.com/data/FUZZ -w base64-values.txt

# Fuzz with special characters (testing WAF bypass)
ffuf -u "https://example.com/FUZZ" -w special-chars.txt

FUZZ Placement Quick Reference Table

TargetExampleWordlist Type
Subdomainhttps://FUZZ.example.comsubdomains.txt
Directoryhttps://example.com/FUZZdirectories.txt
Filehttps://example.com/admin/FUZZ.phpfilenames.txt
Extensionhttps://example.com/config.FUZZextensions.txt
GET Param Namehttps://example.com?FUZZ=valueparameters.txt
GET Param Valuehttps://example.com?id=FUZZvalues.txt
POST Data-d "user=admin&pass=FUZZ"passwords.txt
JSON Value-d '{"user":"FUZZ"}'usernames.txt
Header Value-H "X-Auth: FUZZ"tokens.txt
Cookie Value-b "session=FUZZ"sessions.txt
VHOST-H "Host: FUZZ.local"vhosts.txt
Porthttps://example.com:FUZZports.txt
User IDhttps://site.com/user/FUZZuserids.txt

Common Use Cases

1. Directory & File Fuzzing

# Basic directory enumeration
ffuf -u https://example.com/FUZZ -w /usr/share/wordlists/dirb/common.txt

# Directory fuzzing with extensions
ffuf -u https://example.com/FUZZ -w wordlist.txt -e .php,.html,.txt,.bak

# File extension enumeration
ffuf -u https://example.com/admin.FUZZ -w extensions.txt

# Recursive directory scanning
ffuf -u https://example.com/FUZZ -w wordlist.txt -recursion -recursion-depth 2

# Only show 200 responses
ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200

2. Subdomain Enumeration

# Basic subdomain fuzzing
ffuf -u https://FUZZ.example.com -w subdomains.txt

# With custom DNS server
ffuf -u https://FUZZ.example.com -w subdomains.txt -dns-server 8.8.8.8

# Filtering by response size
ffuf -u https://FUZZ.example.com -w subdomains.txt -fs 4242

3. Virtual Host Discovery

# VHOST enumeration
ffuf -u https://example.com -H "Host: FUZZ.example.com" -w wordlist.txt

# Filter false positives by size
ffuf -u https://10.10.10.10 -H "Host: FUZZ.example.local" -w wordlist.txt -fs 1234

# Multiple header fuzzing
ffuf -u https://example.com -H "Host: FUZZ" -H "X-Forwarded-For: FUZ2Z" \
     -w vhosts.txt:FUZZ -w ips.txt:FUZ2Z

4. Parameter Fuzzing (GET)

# GET parameter discovery
ffuf -u https://example.com?FUZZ=test -w params.txt

# Multiple parameters
ffuf -u https://example.com?FUZZ=FUZ2Z -w params.txt:FUZZ -w values.txt:FUZ2Z

# Parameter value fuzzing
ffuf -u https://example.com?id=FUZZ -w numbers.txt

# Filter by response size
ffuf -u https://example.com?page=FUZZ -w wordlist.txt -fs 0

5. POST Data Fuzzing

# POST parameter fuzzing
ffuf -u https://example.com/login -X POST -d "username=admin&password=FUZZ" \
     -w passwords.txt -H "Content-Type: application/x-www-form-urlencoded"

# JSON POST fuzzing
ffuf -u https://example.com/api -X POST \
     -d '{"username":"admin","password":"FUZZ"}' \
     -w passwords.txt -H "Content-Type: application/json"

# Username and password fuzzing
ffuf -u https://example.com/login -X POST \
     -d "username=FUZZ&password=FUZ2Z" \
     -w usernames.txt:FUZZ -w passwords.txt:FUZ2Z

6. API Endpoint Fuzzing

# API endpoint discovery
ffuf -u https://api.example.com/v1/FUZZ -w api-endpoints.txt

# API version fuzzing
ffuf -u https://api.example.com/FUZZ/users -w versions.txt

# RESTful API fuzzing
ffuf -u https://api.example.com/api/FUZZ -w wordlist.txt \
     -H "Authorization: Bearer TOKEN"

7. Username Enumeration

# Login form username enumeration
ffuf -u https://example.com/login -X POST \
     -d "username=FUZZ&password=invalid" \
     -w usernames.txt -mr "Invalid password"

# User profile enumeration
ffuf -u https://example.com/users/FUZZ -w usernames.txt -mc 200

# Email enumeration
ffuf -u https://example.com/forgot-password -X POST \
     -d "email=FUZZ@example.com" -w wordlist.txt -mr "sent"

8. File Backup Enumeration

# Common backup extensions
ffuf -u https://example.com/admin.FUZZ -w backup-extensions.txt

# Backup file patterns
ffuf -u https://example.com/FUZZ -w backup-patterns.txt
# Where backup-patterns.txt contains: index.php.bak, index.php~, index.php.old, etc.

# Combined filename and extension fuzzing
ffuf -u https://example.com/FUZZ.FUZ2Z \
     -w filenames.txt:FUZZ -w extensions.txt:FUZ2Z

Filter Options

Filters HIDE matching responses (exclude from results):

-fc CODE1,CODE2     # Filter HTTP status codes
-fs SIZE1,SIZE2     # Filter response size (bytes)
-fw WORDS1,WORDS2   # Filter word count
-fl LINES1,LINES2   # Filter line count
-fr REGEX           # Filter responses matching regex
-ft TIME            # Filter response time (milliseconds)

Filter Examples

# Hide 404 and 403 responses
ffuf -u https://example.com/FUZZ -w wordlist.txt -fc 404,403

# Hide responses of specific size
ffuf -u https://example.com/FUZZ -w wordlist.txt -fs 4242

# Hide responses with specific word count
ffuf -u https://FUZZ.example.com -w subdomains.txt -fw 1337

# Hide responses matching "Not Found"
ffuf -u https://example.com/FUZZ -w wordlist.txt -fr "Not Found"

# Combine multiple filters
ffuf -u https://example.com/FUZZ -w wordlist.txt -fc 404,403 -fs 0 -fw 1

Matcher Options

Matchers SHOW matching responses (include in results):

-mc CODE1,CODE2     # Match HTTP status codes
-ms SIZE1,SIZE2     # Match response size (bytes)
-mw WORDS1,WORDS2   # Match word count
-ml LINES1,LINES2   # Match line count
-mr REGEX           # Match responses containing regex
-mt TIME            # Match response time (milliseconds)

Matcher Examples

# Only show 200 and 301 responses
ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200,301

# Match specific response size
ffuf -u https://example.com/FUZZ -w wordlist.txt -ms 1337

# Match responses containing "success"
ffuf -u https://example.com/login -X POST -d "user=admin&pass=FUZZ" \
     -w passwords.txt -mr "success"

# Match slow responses (potential SQL injection)
ffuf -u https://example.com/search?q=FUZZ -w sqli-payloads.txt -mt ">3000"

# Combine matchers
ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200 -ms 1000-5000

Rate Limiting & Performance

# Set number of threads (default: 40)
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 100

# Rate limiting (requests per second)
ffuf -u https://example.com/FUZZ -w wordlist.txt -rate 10

# Add delay between requests (seconds)
ffuf -u https://example.com/FUZZ -w wordlist.txt -p 0.5

# Set timeout (default: 10s)
ffuf -u https://example.com/FUZZ -w wordlist.txt -timeout 30

# Max execution time (seconds)
ffuf -u https://example.com/FUZZ -w wordlist.txt -maxtime 600

# Stop after errors
ffuf -u https://example.com/FUZZ -w wordlist.txt -se

Performance Tips

# Fast scan (more threads, higher rate)
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 200 -rate 100

# Stealth scan (slower, less noise)
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 5 -rate 2 -p 1

# Balanced scan
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 40 -rate 50

Output Formats

# Save output to file
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.txt

# JSON output
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.json -of json

# HTML report
ffuf -u https://example.com/FUZZ -w wordlist.txt -o report.html -of html

# Markdown output
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.md -of md

# CSV output
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.csv -of csv

# eJSON (one JSON per line - easy to parse)
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.ejson -of ejson

# CSV with base64 (includes response body)
ffuf -u https://example.com/FUZZ -w wordlist.txt -o results.csv -of ecsv

Output Parsing Examples

# Parse JSON output with jq
cat results.json | jq '.results[] | select(.status == 200) | .url'

# Extract URLs from eJSON
cat results.ejson | jq -r '.url'

# Filter by status code
cat results.ejson | jq -r 'select(.status == 200) | .url'

Authentication

Basic Authentication

# Basic auth
ffuf -u https://example.com/FUZZ -w wordlist.txt -H "Authorization: Basic dXNlcjpwYXNz"

# Or use base64 directly
echo -n "username:password" | base64
ffuf -u https://example.com/FUZZ -w wordlist.txt -H "Authorization: Basic BASE64_HERE"

Bearer Token

# JWT/Bearer token
ffuf -u https://api.example.com/FUZZ -w wordlist.txt \
     -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# Using cookies
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -b "session=abc123; token=xyz789"

# Or with header
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -H "Cookie: session=abc123; token=xyz789"

Custom Authentication Header

# API key
ffuf -u https://api.example.com/FUZZ -w wordlist.txt \
     -H "X-API-Key: your-api-key-here"

# Multiple auth headers
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -H "X-API-Key: key123" \
     -H "X-Auth-Token: token456"

HTTP Methods

# GET (default)
ffuf -u https://example.com/FUZZ -w wordlist.txt

# POST
ffuf -u https://example.com/api/FUZZ -X POST -w wordlist.txt

# PUT
ffuf -u https://example.com/api/users/FUZZ -X PUT \
     -d '{"data":"value"}' -w wordlist.txt

# DELETE
ffuf -u https://example.com/api/users/FUZZ -X DELETE -w wordlist.txt

# HEAD (faster for discovery)
ffuf -u https://example.com/FUZZ -X HEAD -w wordlist.txt

# OPTIONS (enumerate HTTP methods)
ffuf -u https://example.com/FUZZ -X OPTIONS -w wordlist.txt

# PATCH
ffuf -u https://example.com/api/users/FUZZ -X PATCH \
     -d '{"field":"value"}' -w wordlist.txt

Advanced Techniques

1. Recursive Scanning

# Enable recursion
ffuf -u https://example.com/FUZZ -w wordlist.txt -recursion

# Set recursion depth
ffuf -u https://example.com/FUZZ -w wordlist.txt -recursion -recursion-depth 3

# Recursion with custom strategy
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -recursion -recursion-depth 2 -recursion-strategy greedy

2. Replay Proxy (for Burp Suite/OWASP ZAP)

# Send requests through proxy
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -replay-proxy http://127.0.0.1:8080

# With proxy authentication
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -replay-proxy http://user:pass@127.0.0.1:8080

3. Client Certificates

# Using client certificate
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -cert /path/to/cert.pem -key /path/to/key.pem

4. Custom SNI

# Server Name Indication
ffuf -u https://10.10.10.10/FUZZ -w wordlist.txt -sni example.com

5. Follow Redirects

# Follow redirects
ffuf -u https://example.com/FUZZ -w wordlist.txt -r

# Max redirect depth
ffuf -u https://example.com/FUZZ -w wordlist.txt -r -maxredirs 5

6. Auto-Calibration

# Auto-calibrate filters (removes false positives)
ffuf -u https://example.com/FUZZ -w wordlist.txt -ac

# Auto-calibration with custom strategy
ffuf -u https://example.com/FUZZ -w wordlist.txt -ac -acc 95

7. Request/Response Inspection

# Show request/response for debugging
ffuf -u https://example.com/FUZZ -w wordlist.txt -v

# Show only specific status codes in verbose
ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200 -v

8. Custom User-Agent

# Custom User-Agent
ffuf -u https://example.com/FUZZ -w wordlist.txt \
     -H "User-Agent: Mozilla/5.0 (custom)"

# Random User-Agent per request (requires UA wordlist)
ffuf -u https://example.com/FUZZ -w dirs.txt:FUZZ -w user-agents.txt:USERAGENT \
     -H "User-Agent: USERAGENT"

9. Input Modes

# Clusterbomb mode (cartesian product)
ffuf -mode clusterbomb -u https://example.com/FUZZ/FUZ2Z \
     -w wordlist1.txt:FUZZ -w wordlist2.txt:FUZ2Z

# Pitchfork mode (parallel iteration)
ffuf -mode pitchfork -u https://example.com/FUZZ \
     -w wordlist1.txt:FUZZ -w wordlist2.txt:FUZ2Z

10. Input from stdin

# Use stdin as wordlist
cat wordlist.txt | ffuf -u https://example.com/FUZZ -w -

# Combine with other tools
cat targets.txt | httpx -silent | ffuf -u FUZZ/admin -w -

Common Wordlists

# Install SecLists
git clone https://github.com/danielmiessler/SecLists.git /opt/SecLists

Directory & File Discovery

/usr/share/wordlists/dirb/common.txt
/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
/opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
/opt/SecLists/Discovery/Web-Content/raft-large-directories.txt
/opt/SecLists/Discovery/Web-Content/big.txt
/opt/SecLists/Discovery/Web-Content/common.txt

Subdomains

/opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
/opt/SecLists/Discovery/DNS/subdomains-top1million-20000.txt
/opt/SecLists/Discovery/DNS/subdomains-top1million-110000.txt
/opt/SecLists/Discovery/DNS/bitquark-subdomains-top100000.txt

Parameters

/opt/SecLists/Discovery/Web-Content/burp-parameter-names.txt
/opt/SecLists/Discovery/Web-Content/api/api-endpoints.txt
/opt/SecLists/Discovery/Web-Content/common-api-endpoints-mazen160.txt

Usernames

/opt/SecLists/Usernames/Names/names.txt
/opt/SecLists/Usernames/top-usernames-shortlist.txt
/opt/SecLists/Usernames/xato-net-10-million-usernames.txt

Passwords

/usr/share/wordlists/rockyou.txt
/opt/SecLists/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt
/opt/SecLists/Passwords/darkweb2017-top10000.txt

Extensions

# Create custom extension list
echo -e ".php\n.html\n.js\n.json\n.xml\n.bak\n.old\n.txt\n.asp\n.aspx\n.jsp" > extensions.txt

Tips & Tricks

1. Finding the Right Filters

# First run without filters to see baseline
ffuf -u https://example.com/FUZZ -w wordlist.txt

# Then add filters based on false positive patterns
ffuf -u https://example.com/FUZZ -w wordlist.txt -fs 4242 -fw 337

# Use auto-calibration
ffuf -u https://example.com/FUZZ -w wordlist.txt -ac

2. Speed Optimization

# Use HEAD method for faster discovery
ffuf -u https://example.com/FUZZ -w wordlist.txt -X HEAD

# Increase threads for faster scanning
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 100

# Use smaller wordlists first
ffuf -u https://example.com/FUZZ -w common.txt -t 50

3. Stealth & Evasion

# Slow and steady
ffuf -u https://example.com/FUZZ -w wordlist.txt -t 5 -p 2 -rate 1

# Randomize User-Agent
ffuf -u https://example.com/FUZZ -w dirs.txt:FUZZ -w ua.txt:UA \
     -H "User-Agent: UA" -mode pitchfork

# Add random delay
ffuf -u https://example.com/FUZZ -w wordlist.txt -p 0.5-2.0

4. Finding Hidden Parameters

# GET parameter discovery with value testing
ffuf -u "https://example.com?FUZZ=test" -w params.txt -fw 100

# POST parameter discovery
ffuf -u https://example.com/search -X POST \
     -d "FUZZ=test" -w params.txt -H "Content-Type: application/x-www-form-urlencoded"

# JSON parameter discovery
ffuf -u https://api.example.com/endpoint -X POST \
     -d '{"FUZZ":"test"}' -w params.txt -H "Content-Type: application/json"

5. Combining with Other Tools

# Chain with subfinder
subfinder -d example.com -silent | ffuf -u https://FUZZ/admin -w -

# Chain with waybackurls
waybackurls example.com | grep -E "\.(js|php|asp)" | ffuf -u FUZZ -w -

# Pipe to httpx for validation
ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200 -o urls.txt -of csv | \
     awk -F, '{print $1}' | httpx -silent

6. Pattern-Based Fuzzing

# Numeric ID fuzzing
seq 1 1000 | ffuf -u https://example.com/user/FUZZ -w -

# Date-based fuzzing
for year in {2020..2024}; do
    for month in {01..12}; do
        echo "$year-$month"
    done
done | ffuf -u https://example.com/archive/FUZZ -w -

# Hex ID fuzzing
for i in {0..255}; do printf "%02x\n" $i; done | ffuf -u https://example.com/id/FUZZ -w -

7. Response Size Ranges

# Match response size ranges
ffuf -u https://example.com/FUZZ -w wordlist.txt -ms 1000-5000

# Filter size ranges
ffuf -u https://example.com/FUZZ -w wordlist.txt -fs 0-100

8. Content-Type Fuzzing

# Fuzz Content-Type header
ffuf -u https://example.com/upload -X POST \
     -d "data" -H "Content-Type: FUZZ" -w content-types.txt
# content-types.txt: application/json, application/xml, text/plain, multipart/form-data

9. Debugging Failed Scans

# Verbose output with request/response
ffuf -u https://example.com/FUZZ -w wordlist.txt -v

# Test with single word first
echo "test" | ffuf -u https://example.com/FUZZ -w - -v

# Check DNS resolution
ffuf -u https://FUZZ.example.com -w subdomain.txt -debug-log debug.log

10. Multiple Wordlist Strategies

# Clusterbomb (all combinations)
ffuf -mode clusterbomb -u https://example.com/FUZZ.FUZ2Z \
     -w files.txt:FUZZ -w extensions.txt:FUZ2Z

# Pitchfork (parallel - line by line)
ffuf -mode pitchfork -u https://example.com/FUZZ \
     -w wordlist1.txt:FUZZ -w wordlist2.txt:FUZ2Z

Real-World Examples

Example 1: Complete Web App Enumeration

# Step 1: Find directories
ffuf -u https://target.com/FUZZ -w common.txt -mc 200,301,302,401,403 -o dirs.json -of json

# Step 2: Find files in discovered directories
ffuf -u https://target.com/admin/FUZZ -w files.txt -e .php,.html,.txt,.bak -mc 200

# Step 3: Parameter discovery
ffuf -u "https://target.com/search?FUZZ=test" -w params.txt -fw 100

# Step 4: Virtual host discovery
ffuf -u https://target.com -H "Host: FUZZ.target.com" -w vhosts.txt -fs 4242

Example 2: API Endpoint Discovery

# Find API endpoints
ffuf -u https://api.target.com/v1/FUZZ -w api-endpoints.txt -mc 200,401,403

# Test different API versions
ffuf -u https://api.target.com/FUZZ/users -w api-versions.txt

# Find API objects
ffuf -u https://api.target.com/api/v1/FUZZ -w api-objects.txt -H "Authorization: Bearer TOKEN"

# Numeric ID enumeration
seq 1 10000 | ffuf -u https://api.target.com/api/v1/users/FUZZ -w - -mc 200

Example 3: Subdomain Takeover Check

# Find subdomains
ffuf -u https://FUZZ.target.com -w subdomains.txt -mc 200,301,302 -o subdomains.txt -of csv

# Check for CNAME records
cat subdomains.txt | awk -F, '{print $1}' | while read sub; do
    dig +short $sub CNAME
done

# Check for common takeover patterns
ffuf -u https://FUZZ.target.com -w discovered-subs.txt -mr "NoSuchBucket|Repository not found|404"

Example 4: IDOR Testing

# Enumerate user IDs
seq 1 1000 | ffuf -u https://target.com/api/user/FUZZ -w - \
     -H "Authorization: Bearer YOUR_TOKEN" -mc 200

# Test UUID format
cat uuids.txt | ffuf -u https://target.com/api/document/FUZZ -w - \
     -H "Cookie: session=xyz" -mc 200 -v

Example 5: SQLi & XSS Parameter Fuzzing

# Find injectable parameters (SQL injection)
ffuf -u "https://target.com/search?id=FUZZ" -w sqli-payloads.txt \
     -mr "SQL syntax|mysql_fetch|error in your SQL" -v

# XSS parameter fuzzing
ffuf -u "https://target.com/search?q=FUZZ" -w xss-payloads.txt \
     -mr "<script>|alert\(1\)" -v

# Slow response detection (time-based SQLi)
ffuf -u "https://target.com/search?id=FUZZ" -w time-sqli.txt -mt ">3000"

Example 6: WordPress Scanning

# Find WordPress plugins
ffuf -u https://target.com/wp-content/plugins/FUZZ/readme.txt -w wp-plugins.txt -mc 200

# Find WordPress themes
ffuf -u https://target.com/wp-content/themes/FUZZ/style.css -w wp-themes.txt -mc 200

# Find WordPress users
seq 1 100 | ffuf -u https://target.com/?author=FUZZ -w - -fc 404

# WordPress xmlrpc brute force
ffuf -u https://target.com/xmlrpc.php -X POST \
     -d '<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>admin</value></param><param><value>FUZZ</value></param></params></methodCall>' \
     -w passwords.txt -mr "isAdmin"

Example 7: Multi-Stage Fuzzing

# Stage 1: Find subdomains
ffuf -u https://FUZZ.target.com -w subdomains.txt -mc 200 -o stage1.json -of json

# Stage 2: Extract live hosts and fuzz paths
cat stage1.json | jq -r '.results[].url' | while read url; do
    ffuf -u $url/FUZZ -w paths.txt -mc 200,301,302
done

# Stage 3: Fuzz parameters on discovered endpoints (manual, based on Stage 2)

Example 8: GraphQL Endpoint Enumeration

# Find GraphQL endpoint
ffuf -u https://target.com/FUZZ -w graphql-paths.txt -mc 200,400 -mr "graphql|query"

# GraphQL introspection query fuzzing
ffuf -u https://target.com/graphql -X POST \
     -d '{"query":"FUZZ"}' -w graphql-queries.txt \
     -H "Content-Type: application/json" -mc 200

Example 9: Cloud Bucket Discovery

# S3 bucket enumeration
ffuf -u https://FUZZ.s3.amazonaws.com -w bucket-names.txt -mc 200,403

# Azure blob storage
ffuf -u https://FUZZ.blob.core.windows.net -w storage-names.txt -mc 200,403

# Google Cloud Storage
ffuf -u https://storage.googleapis.com/FUZZ -w bucket-names.txt -mc 200,403

Example 10: JWT Secret Fuzzing

# Fuzz JWT secrets (generate JWTs with FUZZ as secret using a script)
ffuf -u https://target.com/api/admin -X GET \
     -H "Authorization: Bearer JWT_WITH_FUZZ_SECRET" \
     -w jwt-secrets.txt -mc 200

Quick Reference Card

# Basic directory fuzzing
ffuf -u https://target.com/FUZZ -w wordlist.txt

# With extensions
ffuf -u https://target.com/FUZZ -w wordlist.txt -e .php,.html,.txt

# Subdomain enumeration
ffuf -u https://FUZZ.target.com -w subdomains.txt

# VHOST fuzzing
ffuf -u https://target.com -H "Host: FUZZ" -w vhosts.txt

# POST data fuzzing
ffuf -u https://target.com/login -X POST -d "user=admin&pass=FUZZ" -w passwords.txt

# Filter by status code
ffuf -u https://target.com/FUZZ -w wordlist.txt -fc 404,403

# Match status code
ffuf -u https://target.com/FUZZ -w wordlist.txt -mc 200,301

# Filter by size
ffuf -u https://target.com/FUZZ -w wordlist.txt -fs 4242

# Save output
ffuf -u https://target.com/FUZZ -w wordlist.txt -o results.json -of json

# Recursive scanning
ffuf -u https://target.com/FUZZ -w wordlist.txt -recursion -recursion-depth 2

# Rate limiting
ffuf -u https://target.com/FUZZ -w wordlist.txt -rate 10 -t 5

# Through proxy
ffuf -u https://target.com/FUZZ -w wordlist.txt -replay-proxy http://127.0.0.1:8080

# Auto-calibration
ffuf -u https://target.com/FUZZ -w wordlist.txt -ac

Common Errors & Solutions

  • “no wordlist defined” — Specify a wordlist with -w.
  • “no target url defined” — Specify a URL with -u.
  • “no FUZZ keyword found” — Your URL or data must contain the keyword FUZZ.
  • High false positive rate — Use -ac for auto-calibration; add filters (-fc 404 -fs 0); use matchers (-mc 200).
  • Too slow — Increase threads (-t 100); use smaller wordlist first; use HEAD method (-X HEAD).
  • Getting blocked/rate limited — Reduce threads (-t 5); add delay (-p 1); reduce rate (-rate 5); rotate User-Agent; use a proxy.
  • No results showing — Remove filters temporarily; check if site is up; use -v; check matcher settings.

Comparison: ffuf vs wfuzz vs gobuster

Featureffufwfuzzgobuster
SpeedHighMediumHigh
Ease of UseHighMediumHigh
FeaturesHighHighMedium
RecursionYesNoYes
Multiple KeywordsYesYesNo
Output FormatsManyFewFew
Auto-CalibrationYesNoNo

ffuf is generally the best all-around choice for modern web fuzzing.

Resources

Always ensure you have proper authorization before testing any target.

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.