Content discovery is the process of finding files, directories, parameters, and subdomains that exist on a web server but are not linked from its visible navigation. ffuf (Fuzz Faster U Fool) is a fast, open-source Go-based fuzzer that automates this by sending a wordlist of guesses against a target URL and reporting which ones exist, based on HTTP status codes, response size, and word count. For Indian dev and security teams testing their own applications, ffuf-driven content discovery routinely surfaces forgotten admin panels, exposed backup files, and leftover .git directories — all against assets you own or are explicitly authorised to test.
Before anything else: only run ffuf against domains and applications you own, or hold explicit written authorisation to test. Brute-forcing paths on a third-party asset without permission is unauthorised access under India's IT Act, Section 43/66, regardless of intent.
Why Content Discovery Matters in a VAPT Engagement
A web application's visible menu is not its full attack surface. Developers routinely leave behind staging endpoints, old API versions, debug pages, backup archives, and configuration files that were never meant to reach production but were also never removed. None of these show up in a manual click-through of the site — they only surface through systematic guessing against a wordlist.
Content discovery sits early in most VAPT (Vulnerability Assessment and Penetration Testing) workflows, right after passive recon and before deeper exploitation. What it finds directly shapes the rest of the assessment: an exposed .git folder can leak source code and secrets, an unlinked /admin panel becomes a priority authentication target, and a stray backup.zip can hand over a full database dump without a single exploit being run.
How ffuf Works: The Core Loop
ffuf replaces a placeholder — the FUZZ keyword — in a URL, header, or POST body with each word from a wordlist, sends the request, and records the response. A basic directory fuzzing run looks like this:
ffuf -u https://target.example/FUZZ -w wordlist.txtBecause FUZZ can go anywhere in the request, the same tool handles several distinct discovery tasks:
- Path fuzzing —
https://target.example/FUZZto find directories and files. - Parameter fuzzing —
https://target.example/api?FUZZ=1to find hidden query parameters. - Virtual host fuzzing —
-H "Host: FUZZ.target.example"against a fixed IP to find subdomains that share infrastructure but aren't in DNS. - Extension fuzzing — combining a base wordlist with
-e .php,.bak,.oldto catch forgotten file variants.
Choosing the Right Wordlist
ffuf's output quality is entirely dependent on the wordlist behind it. The most widely used source is SecLists, a community-maintained collection of wordlists for discovery, fuzzing, and payload testing, organised under Discovery/Web-Content/.
Common starting points from SecLists:
| Wordlist | Best for | Approx size |
|---|---|---|
common.txt | Fast first pass on any target | ~4,700 entries |
raft-medium-directories.txt | Deeper directory enumeration | ~30,000 entries |
raft-large-files.txt | Backup, config, and leftover files | ~100,000+ entries |
quickhits.txt | Known high-value paths (admin, .git, .env) | Small, curated |
common.txt or quickhits.txt before running a large raft list. A first pass tells you the application's response patterns — custom 404 pages, redirects, WAF behaviour — so you can tune filters before committing to a run that sends tens of thousands of requests.Know your vulnerabilities before attackers do
Run a free VAPT scan — takes 5 minutes, no signup required.
Book Your Free ScanFiltering Results: Status, Size, and Words
A raw ffuf run against a real application often returns hundreds of "hits" that are actually noise — usually because a custom error page returns HTTP 200 for every path instead of a proper 404. ffuf handles this through match and filter flags:
-mc 200,301,302,403— match only specific status codes.-fc 404— filter out a known "not found" status.-fs 4242— filter out responses of an exact size (the custom-404 page size, once you've identified it).-fw 150— filter out responses with an exact word count.
ffuf -u https://target.example/FUZZ -w common.txt -mc 200,301,302,403 -fs 4242Rate limiting is controlled with -rate (requests per second) and -p (delay between requests), and both should be set conservatively — starting around 10–20 requests per second — on anything resembling shared or production infrastructure.
Recursion: Fuzzing Discovered Directories Automatically
Directory structures are rarely flat. ffuf's -recursion flag automatically re-runs the fuzz job against any directory it discovers, up to a configurable depth (-recursion-depth):
ffuf -u https://target.example/FUZZ -w common.txt -recursion -recursion-depth 2This is how a single /api hit expands into /api/v1, /api/v1/users, and further nested endpoints without manually re-running the tool at each level. Recursion multiplies request volume quickly, so it should always be paired with a tight wordlist and conservative rate limiting rather than the largest raft list available.
These figures, from Verizon's 2024 Data Breach Investigations Report, underline why unmanaged internet-facing assets matter. Old staging paths, forgotten backup files, and unlinked admin panels are a recurring theme in CERT-In's advisories on web application hygiene, and exactly the kind of exposure a fuzz run surfaces before an attacker finds it first.
What Hidden Endpoints Actually Reveal
Content discovery consistently turns up the same categories of exposure across Indian web applications:
- Admin and management panels (
/admin,/manage,/wp-admin,/dashboard-internal) left reachable without IP restriction or additional authentication. - Version control artifacts — an exposed
.gitdirectory allows an attacker to reconstruct full source code history, including commits that once contained hardcoded secrets even if later removed. - Backup and archive files (
.zip,.bak,.sql,.tar.gz) left in the webroot after a deployment or migration, often containing full database dumps. - Configuration and environment files (
.env,config.php.bak,web.config) that leak API keys, database credentials, or internal hostnames. - Staging and debug endpoints (
/debug,/test,/phpinfo.php) that expose stack traces, server versions, or internal IP addressing.
.git directory found via content discovery is one of the highest-value findings in a VAPT engagement. It requires no authentication bypass and no exploit — just downloading the repository objects — yet it can hand over source code, historical secrets, and application logic in one step. Treat any .git, .svn, or .hg exposure as a critical finding.Validating Findings Before Reporting
A raw ffuf hit is a lead, not a confirmed finding. Every result worth reporting should be manually validated:
- Load the path directly in a browser or via
curlto confirm it actually serves content (not a redirect masking a 404). - Check whether the endpoint requires authentication, and if so, whether that authentication is enforced server-side or only hidden from navigation.
- For files (backups, configs), confirm they contain live, current data rather than stale artifacts from years ago.
- Cross-reference against the rest of the recon — does this endpoint match a known framework's default admin path, or is it custom to this application?
Defensive Response: Closing What ffuf Finds
Running ffuf against your own application is only half the value — the response matters more:
- Remove or restrict exposed files immediately. Delete backup archives and
.gitdirectories from the webroot; they should never have been deployed there in the first place. Move genuinely needed admin panels behind IP allow-listing or VPN access, not obscurity. - Monitor for 404 bursts. A sudden spike in 404 responses from a single source IP in a short window is a strong signal of directory brute-forcing in progress, whether from an authorised scan or a real attacker. Web server logs, a WAF, or a basic rate-based alert rule can catch this pattern.
- Add a custom 404 with a consistent size and status code. This removes the ambiguity that lets attackers (or noisy scans) mistake soft-404 pages for real content, and makes your own filtering cleaner on the next authorised run.
- Re-run discovery after every deployment. Staging debug routes and stray backup files tend to reappear with new releases, not just at initial launch.
.git folders, and backup files before an attacker does, and closing them with removal, access restriction, and 404-burst monitoring.Content discovery is one layer of a full assessment. Bachao.AI, built by Dhisattva AI Pvt Ltd, helps Indian teams run this kind of testing continuously against their own assets as part of a broader, audit-ready VAPT process, including cases that need a report delivered with a CERT-In empanelled partner. If you want an outside baseline on what's actually reachable on your domain, start with a free VAPT scan. For obligations around personal data exposed through misconfigured endpoints, see our guide on DPDP compliance, and browse more testing write-ups on the Bachao.AI blog.
Frequently Asked Questions
Is it legal to run ffuf against any website?
What is the difference between ffuf and a tool like dirb or gobuster?
How do I avoid false positives from custom 404 pages?
-fs, -fw, or -fc flags to filter out that exact pattern before running the full wordlist.Why does an exposed .git directory matter so much?
What wordlist should I start with for a new target?
common.txt or quickhits.txt to understand the application's response behaviour, then move to a larger list like raft-medium-directories.txt once your status/size filters are tuned.How do I stop content discovery scans from impacting a live application?
-rate flag (start around 10-20 requests per second on shared infrastructure), test during a maintenance window where possible, and monitor server load throughout the run.