tools-ffuf
Fuzz web targets with ffuf for content, parameter, and vhost discovery — FUZZ keyword placement in paths, query strings, POST bodies and Host headers, matcher/filter calibration (-mc/-fs/-ac), recursi
Files1
View on GitHubSKILL.mdskills/tools/tools-ffuf/SKILL.md
GitHubffuf & web content fuzzing
When it applies
You have an in-scope web target (tradecraft-scope-roe) and need what the site map doesn't show:
hidden directories and files, undocumented GET/POST parameters, or name-based virtual hosts. This is
the active half of recon-content-discovery — wordlist-driven, noisy, and governed by roe.md rate
limits.
Why it works
ffuf replaces the FUZZ keyword anywhere in a request — path, query, body, header — with each
wordlist entry, then classifies responses by status/size/word-count. Discovery is a filtering
problem: a wildcard or SPA route answers 200 to everything, so the skill is teaching ffuf what
"nothing found" looks like, then listing only the deviations.
Method
- Directory/file brute force with an extension set matched to the stack:
ffuf -u http://target.com/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt ffuf -u http://target.com/FUZZ -w wordlist.txt -e .php,.html,.txt ffuf -u http://target.com/FUZZ -w wordlist.txt -recursion -recursion-depth 2 - Calibrate the noise floor — run once, note the junk response's status/size/words, then filter:
-mc 200,301,302(match codes),-fs 1234(hide size),-fc 403, or just-acto auto-calibrate against random canary words. Without this step every wildcarded app "finds" thousands of pages. - Parameter discovery:
ffuf -u "http://target.com/api?FUZZ=test" -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 0 ffuf -u http://target.com -X POST -d "user=FUZZ&pass=test" -w wordlist.txt - Virtual hosts — whole apps hide behind one IP, answering only to the right
Host:name:
The default vhost answers everything with the same 200 — filter by the different size/words.ffuf -u http://target.com -H "Host: FUZZ.target.com" -w subdomains.txt -fs 0 - Carry auth when testing behind login — replicate the session:
-H "Cookie: session=abc"/-H "Authorization: Bearer token". - Switch tools when the fit is better:
feroxbuster = recursion by default; gobuster = simple and steady (+ DNS mode); dirsearch = sane defaults; wfuzz = multi-wordlist combos (feroxbuster -u https://target.com -w raft-medium-directories.txt -d 3 -C 403,404 -x php,asp,html --rate-limit 50 feroxbuster -u https://target.com --auto-tune --smart # self-tuning filters/rate gobuster dir -u http://target.com -w common.txt -x php,txt -b 404,403 gobuster dns -d target.com -w subdomains.txt # DNS-mode subdomain brute dirsearch -u https://target.com -e php,asp,aspx,jsp -r -R 3 --exclude-status=403,404 wfuzz -c -z file,big.txt --hc 404 https://target.com/FUZZ # FUZZ/FUZ2Z multi-payload-z file,a -z file,b). - Feed results back — discovered paths go to the Burp/
web-*testing loop; discovered params go to arjun for confirmation and then to the relevant injection skills.
Gotchas
- Unfiltered output is fiction — a "1000 hits" run against a wildcard app is 1000 copies of the
same 200. Calibrate first (
-acor manual-fs/-fc/-fw), then trust the short list. - SPA catch-alls — any-path-200 with identical body size means a frontend router, not real endpoints; filter by size and move on.
- Rate limits and WAFs — default ffuf speed trips Cloudflare/ModSecurity and breaches many
bug-bounty RoEs; use
-rate/-p(delay) and checkroe.mdbefore launching. - Recursion explodes — depth 3 on a big wordlist × every found dir can run for hours; cap with
-recursion-depthand scope recursion to interesting dirs. - Windows/curl quirk — when verifying hits with curl,
[]in URLs (e.g.__proto__[test]) needs--globoffor curl misparses them as ranges. - Match the wordlist to the stack — raft/directory-list for general, CMS-specific lists after
fingerprinting (
recon-techstack-fingerprinting),burp-parameter-namesfor params,subdomains-top1million-5000for vhosts.
Verify success
Every reported path/param/vhost is manually re-requested (curl/Burp) and returns content that differs from the calibrated baseline — a page of unverified scanner hits is a lead list, not a result.
References
ffuf GitHub; SecLists wordlists; feroxbuster/gobuster/dirsearch/wfuzz docs. Discovery methodology:
recon-content-discovery; full web toolbelt: web-arsenal; pipeline: automation-recon-pipeline.
Portions adapted from reverse-skill by zhaoxuya520, MIT License.