FFUF
The FFUF Masterclass: Professional Web Fuzzing at Scale
FFUF (Fuzz Faster U Fool) is a high‑performance web fuzzer built in Go for discovering hidden directories, files, parameters, vhosts, and API endpoints. This guide fixes formatting so commands are clean and copy‑pasteable.[1]
I. Export environment variables
Define your dynamic fuzzing environment:
export URL="<http://target.com>"
export WORDLIST="/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt"
export PARAM_WORDLIST="/usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt"
export OUTPUT_DIR="ffuf-results"
export THREADS=100
export USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
export COOKIE="PHPSESSID=abcd1234; token=xyz"
export PROXY="<http://127.0.0.1:8080>"
export POST_DATA='{"username":"admin","password":"FUZZ"}'
export EXTENSIONS="php,html,js,txt,bak"
export TIMEOUT=10
export RATE=0 # requests per second (0 = unlimited)
export DELAY=0 # delay between requests in seconds
export RECURSION_DEPTH=2
export VHOST_DOMAIN="[target.com](<http://target.com>)"
mkdir -p "$OUTPUT_DIR"II. Basic usage
Directory discovery:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/directories.json" -of json -c -H "User-Agent: $USER_AGENT"File discovery with extensions:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -e "$EXTENSIONS" -t "$THREADS" -o "$OUTPUT_DIR/files.json" -of json -c -H "User-Agent: $USER_AGENT"GET parameter fuzzing:
ffuf -w "$PARAM_WORDLIST" -u "$URL/page.php?FUZZ=test" -t "$THREADS" -o "$OUTPUT_DIR/params.json" -of json -cIII. Advanced techniques
Recursive directory discovery:[2]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -recursion -recursion-depth "$RECURSION_DEPTH" -o "$OUTPUT_DIR/recursive.json" -of json -cMultiple wordlists with multiple FUZZ keywords:[3]
ffuf -w "$WORDLIST:FUZZ" -w "$PARAM_WORDLIST:FUZZ2" -u "$URL/FUZZ?param=FUZZ2" -t "$THREADS" -o "$OUTPUT_DIR/multi.json" -of json -cPOST data fuzzing (JSON API):
ffuf -w "$WORDLIST" -u "$URL/api/login" -X POST -H "Content-Type: application/json" -d "$POST_DATA" -t "$THREADS" -o "$OUTPUT_DIR/post-json.json" -of json -cVirtual host (vhost) discovery:
ffuf -w "$WORDLIST" -u "$URL" -H "Host: FUZZ.$VHOST_DOMAIN" -t "$THREADS" -o "$OUTPUT_DIR/vhost.json" -of json -c -acFuzzing headers:
ffuf -w "$WORDLIST" -u "$URL" -H "X-Forwarded-For: FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/headers.json" -of json -cIV. Filtering and matching
Match HTTP status codes:[4]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -mc 200,301,302,403 -t "$THREADS" -cFilter HTTP status codes:[5]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -fc 404,403 -t "$THREADS" -cFilter by response size:[6]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -fs 1234 -t "$THREADS" -cFilter by word count:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -fw 42 -t "$THREADS" -cFilter by line count:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -fl 10 -t "$THREADS" -cMatch regular expression:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -mr "admin|root|config" -t "$THREADS" -cFilter regular expression:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -fr "404|not found" -t "$THREADS" -cV. Auto‑calibration and error handling
Auto‑calibration:[7]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -ac -cCustom auto‑calibration baseline:[8]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -acc "nonexistent123" -cStop on all errors:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -sa -cStop on spurious errors:[9]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -se -cVI. Rate limiting and timing
Set request rate (requests per second):
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -rate 50 -t "$THREADS" -cAdd delay between requests (seconds):
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -p "$DELAY" -t "$THREADS" -cSet timeout per request:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -timeout "$TIMEOUT" -t "$THREADS" -cSet maximum time for entire job:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -maxtime 3600 -t "$THREADS" -cSet maximum time per target:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -maxtime-job 300 -t "$THREADS" -cVII. Output and reporting
JSON output:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/scan.json" -of jsonHTML output:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/scan.html" -of htmlCSV output:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/scan.csv" -of csvSave all formats simultaneously:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/scan" -of allVIII. Proxy and inspection
Route traffic through Burp Suite:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -x "$PROXY" -t "$THREADS" -cReplay‑proxy for manual inspection:[10]
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -replay-proxy "$PROXY" -cIX. Mutators for dynamic payloads
Use external mutators (e.g., Radamsa) to generate variations:[11]
ffuf --input-cmd 'echo "[[email protected]](<mailto:[email protected]>)" | radamsa --seed $FFUF_NUM' \\
-input-num 100 -u "$URL/FUZZ" -H "Content-Type: application/json" \\
-X POST -d '{"email":"FUZZ"}' -t "$THREADS" -cX. Real‑world workflow example
Export variables:
export URL="<http://10.10.10.50>"
export WORDLIST="/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt"
export OUTPUT_DIR="ffuf_scans"
export THREADS=100
mkdir -p "$OUTPUT_DIR"Initial directory discovery:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -o "$OUTPUT_DIR/dir.json" -of json -c -acRecursive fuzzing on discovered paths:
ffuf -w "$WORDLIST" -u "$URL/FUZZ" -t "$THREADS" -recursion -recursion-depth 2 -o "$OUTPUT_DIR/recursive.json" -of json -cParameter fuzzing on login endpoint:
export POST_DATA='{"username":"admin","password":"FUZZ"}'
ffuf -w "/usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt" \\
-u "$URL/api/login" -X POST -H "Content-Type: application/json" -d "$POST_DATA" \\
-t "$THREADS" -o "$OUTPUT_DIR/login-fuzz.json" -of json -c -fc 401VHOST discovery:
export VHOST_DOMAIN="[target.com](<http://target.com>)"
ffuf -w "/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt" -u "$URL" \\
-H "Host: FUZZ.$VHOST_DOMAIN" -t "$THREADS" -o "$OUTPUT_DIR/vhost.json" -of json -c -acXI. Pro tips
Use
-acauto‑calibration to reduce false positives.[12]Combine multiple wordlists for coverage.[13]
Leverage recursion for deeper structures.[14]
Tune matchers and filters to isolate signal.[15]
Apply rate limiting and delays thoughtfully.[16]
Save output in multiple formats for reports.[17]
Integrate with Burp via proxy flags for manual review.[18]
Use mutators for API fuzzing scenarios.[19]
References
Last updated
Was this helpful?