ffuf

Directory Fuzzing

# Basic directory brute force
ffuf -u <url>/FUZZ -w <wordlist>

# With extensions
ffuf -u <url>/FUZZ -w <wordlist> -e .php,.html,.txt,.bak,.old,.zip,.tar.gz

# Specific extensions
ffuf -u <url>/FUZZ.php -w <wordlist>

# Output to file
ffuf -u <url>/FUZZ -w <wordlist> -o results.json -of json

# Rate limited
ffuf -u <url>/FUZZ -w <wordlist> -rate 50

# With threads
ffuf -u <url>/FUZZ -w <wordlist> -t 50

# With proxy (Burp)
ffuf -u <url>/FUZZ -w <wordlist> -x http://127.0.0.1:8080

# Ignore SSL errors
ffuf -u <url>/FUZZ -w <wordlist> -k

# Follow redirects
ffuf -u <url>/FUZZ -w <wordlist> -r

# Custom timeout
ffuf -u <url>/FUZZ -w <wordlist> -timeout 10

Filter Options

# Filter by HTTP status code (hide 404)
ffuf -u <url>/FUZZ -w <wordlist> -fc 404

# Filter multiple codes
ffuf -u <url>/FUZZ -w <wordlist> -fc 404,403,500

# Match only specific codes
ffuf -u <url>/FUZZ -w <wordlist> -mc 200,301,302

# Filter by response size (bytes)
ffuf -u <url>/FUZZ -w <wordlist> -fs 1234

# Filter by number of words
ffuf -u <url>/FUZZ -w <wordlist> -fw 10

# Filter by number of lines
ffuf -u <url>/FUZZ -w <wordlist> -fl 42

# Filter by response time (ms)
ffuf -u <url>/FUZZ -w <wordlist> -ft 100

# Match by size
ffuf -u <url>/FUZZ -w <wordlist> -ms 1234

# Match by words
ffuf -u <url>/FUZZ -w <wordlist> -mw 50

# Match by regex
ffuf -u <url>/FUZZ -w <wordlist> -mr "admin|panel|dashboard"

VHost Fuzzing

# VHost enumeration
ffuf -u <url> -H "Host: FUZZ.<domain>" -w <wordlist> -fc 200 -fs 1234

# With different base response size (filter known size)
ffuf -u http://<ip> -H "Host: FUZZ.<domain>" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -fs 0

# HTTPS vhost
ffuf -u https://<ip> -H "Host: FUZZ.<domain>" -w <wordlist> -k -fc 404

# VHost with specific match
ffuf -u http://<ip> -H "Host: FUZZ.<domain>" -w <wordlist> -mc 200,301,302,400

# Find first valid vhost size then filter
ffuf -u http://<ip> -H "Host: test.<domain>" -w /dev/null  # get baseline size
ffuf -u http://<ip> -H "Host: FUZZ.<domain>" -w <wordlist> -fs <baseline_size>

Subdomain Fuzzing

# DNS subdomain fuzzing
ffuf -u http://FUZZ.<domain> -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt

# Filter by size
ffuf -u http://FUZZ.<domain> -w <wordlist> -fs 0 -fc 404

# With SSL
ffuf -u https://FUZZ.<domain> -w <wordlist> -k

# Custom resolver
ffuf -u http://FUZZ.<domain> -w <wordlist> -H "Host: FUZZ.<domain>"

GET Parameter Fuzzing

# Fuzz GET parameter value
ffuf -u "<url>?id=FUZZ" -w <wordlist>

# Fuzz parameter name
ffuf -u "<url>?FUZZ=test" -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt

# Multiple GET params
ffuf -u "<url>?page=FUZZ&id=1" -w <wordlist>

# Filter default response
ffuf -u "<url>?id=FUZZ" -w <wordlist> -fs 1234

# LFI fuzzing
ffuf -u "<url>?file=FUZZ" -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt -fs 0

# SQLi parameter
ffuf -u "<url>?id=FUZZ" -w /usr/share/seclists/Fuzzing/SQLi/Generic-SQLi.txt

POST Parameter Fuzzing

# POST body fuzzing
ffuf -u <url> -X POST -d "username=FUZZ&password=test" -w <wordlist>

# POST with JSON body
ffuf -u <url> -X POST -H "Content-Type: application/json" -d '{"username":"FUZZ","password":"test"}' -w <wordlist>

# Fuzz POST parameter name
ffuf -u <url> -X POST -d "FUZZ=test" -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt

# Password spray
ffuf -u <url> -X POST -d "username=<username>&password=FUZZ" -w <wordlist> -fc 200 -mc 302

# JSON API fuzzing
ffuf -u <url>/api/FUZZ -X POST -H "Content-Type: application/json" -d '{}' -w <wordlist>

Recursive Fuzzing

# Recursive directory fuzzing
ffuf -u <url>/FUZZ -w <wordlist> -recursion

# Recursive with depth limit
ffuf -u <url>/FUZZ -w <wordlist> -recursion -recursion-depth 3

# Recursive with extensions
ffuf -u <url>/FUZZ -w <wordlist> -recursion -recursion-depth 2 -e .php,.html,.txt

# Recursive with filter
ffuf -u <url>/FUZZ -w <wordlist> -recursion -recursion-depth 2 -fc 404,403

Authentication

# Basic authentication
ffuf -u <url>/FUZZ -w <wordlist> -u <username>:<password>

# Bearer token
ffuf -u <url>/FUZZ -w <wordlist> -H "Authorization: Bearer <password>"

# Cookie authentication
ffuf -u <url>/FUZZ -w <wordlist> -H "Cookie: session=<password>"

# Multiple headers
ffuf -u <url>/FUZZ -w <wordlist> \
  -H "Authorization: Bearer <password>" \
  -H "X-Api-Key: abc123" \
  -H "Accept: application/json"

# API key in parameter
ffuf -u "<url>/FUZZ?api_key=<password>" -w <wordlist>

Multiple Injection Points (Multiple Wordlists)

# Two FUZZ points with two wordlists
ffuf -u <url>/FUZZ1/FUZ2Z -w users.txt:FUZZ1 -w <wordlist>:FUZ2Z

# Username + password brute force
ffuf -u <url>/login -X POST -d "user=FUZZ&pass=FUZ2Z" \
  -w /usr/share/seclists/Usernames/top-usernames-shortlist.txt:FUZZ \
  -w /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:FUZ2Z \
  -fc 200

# Credential stuffing from colon-delimited list
ffuf -u <url>/login -X POST -d "user=FUZZ&pass=FUZ2Z" \
  -w creds.txt:FUZZ:FUZ2Z -ic

API Fuzzing

# REST API endpoint discovery
ffuf -u <url>/api/v1/FUZZ -w /usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt -mc 200,201,204,400,401,403

# API version fuzzing
ffuf -u <url>/api/FUZZ/users -w <wordlist> -mc 200,201

# GraphQL introspection endpoint
ffuf -u <url>/FUZZ -w <wordlist> -mr "graphql|__schema"

# API parameter fuzzing with JSON
ffuf -u <url>/api/users -X POST -H "Content-Type: application/json" \
  -d '{"FUZZ":"test"}' \
  -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
  -mr '"id":|"user":|"success"'

# IDOR enumeration
ffuf -u <url>/api/users/FUZZ -w <(seq 1 1000) -mc 200

# Method fuzzing
ffuf -u <url>/api/users -X FUZZ -d '{}' \
  -w <(echo -e "GET\nPOST\nPUT\nPATCH\nDELETE\nOPTIONS\nHEAD") -mc 200,201,204

Output Formats

# JSON output
ffuf -u <url>/FUZZ -w <wordlist> -o output.json -of json

# CSV output
ffuf -u <url>/FUZZ -w <wordlist> -o output.csv -of csv

# HTML report
ffuf -u <url>/FUZZ -w <wordlist> -o report.html -of html

# eJSONLines format
ffuf -u <url>/FUZZ -w <wordlist> -o output.ejson -of ejson

# Markdown
ffuf -u <url>/FUZZ -w <wordlist> -o output.md -of md

# All formats (use multiple -o)
ffuf -u <url>/FUZZ -w <wordlist> -o output.json -of json -of md -o output.md

Common Wordlists

# SecLists paths
/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
/usr/share/seclists/Discovery/Web-Content/raft-large-files.txt
/usr/share/seclists/Discovery/Web-Content/common.txt
/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
/usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
/usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt
/usr/share/seclists/Fuzzing/SQLi/Generic-SQLi.txt

# Dirbuster wordlists (sometimes better for specific apps)
/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

Practical One-Liners

# Fast initial recon
ffuf -u <url>/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -fc 404 -t 100 -c

# PHP app
ffuf -u <url>/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -e .php,.html,.txt -fc 404

# API discovery
ffuf -u <url>/api/FUZZ -w /usr/share/seclists/Discovery/Web-Content/common.txt -mc 200,201,204,400,401,403,405

# Backup file hunt
ffuf -u <url>/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt -e .bak,.old,.orig,.swp,.~ -mc 200

# Auto-calibrate filter (send request with random path first)
ffuf -u <url>/FUZZ -w <wordlist> -ac

# Silent mode (no banner, only results)
ffuf -u <url>/FUZZ -w <wordlist> -s -fc 404