Content Discovery: Finding the Endpoints Nobody Meant to Publish
Crawling a website finds what it links to. Content discovery — also called forced browsing or directory brute forcing — finds what it does not: administrative paths, old versions, backup files, staging endpoints, and APIs that exist but appear in no menu. These are frequently the most interesting parts of an application precisely because nobody expected anyone to look.
How it works
The tool requests a long list of candidate paths and records which ones return something other than "not found." That is the entire technique. Its effectiveness comes almost entirely from three choices.
The wordlist. A generic list of common directory names finds common things. A list built from the target — words scraped from the site, the organization's terminology, developer and project names, framework-specific paths once the stack is identified — finds the things specific to that application. This is where skill shows.
Extensions. Requesting each word with a set of suffixes multiplies coverage. Beyond the obvious application extensions, the productive ones are backup and editor artefacts — a configuration file saved with a backup suffix is served as plain text rather than executed, and it contains credentials.
Recursion. Discovering a directory and then scanning inside it finds nested structure that a flat scan misses, at the cost of a large increase in requests.
Reading the responses
Interpretation is the part people get wrong, because "not found" is not always 404.
A response of 200 is found, 301 or 302 may indicate a real resource redirecting to a login, 401 or 403 confirms the path exists but is protected — which is itself a finding, since it tells you an administrative interface is there — and 500 often means the path exists and something broke when it was called without expected parameters.
The complication is applications that return 200 with a friendly "page not found" body for everything. Filtering by response size or by matching the error text is what makes results usable, and failing to configure it produces a list of thousands of false positives. The status code meanings are covered under 4xx HTTP status codes.
What it turns up
Administrative and management interfaces at predictable paths. Old application versions left in place after an upgrade, still functional and still vulnerable. Backup files and archives in the web root. Configuration files, environment files and credentials. Version control directories. API endpoints and documentation. Staging or test instances with weaker protections and production data.
The unifying theme is that these were never intended to be public, so they frequently lack authentication entirely — whoever deployed them assumed obscurity was sufficient.
It is loud
Thousands of requests, most for paths that do not exist, from one source in a short window. That is the enumeration signature and it is trivially detectable, so it requires authorization and an agreed window.
It can also cause harm. High request rates degrade small applications, and requesting arbitrary paths can trigger destructive endpoints — a discovered path that deletes something does not ask for confirmation. Rate limit, exclude known-dangerous paths, and prefer staging over production.
Defensively, the same pattern is an easy detection: a burst of 404s from one source, alerted from web server logs in your SIEM, catches both automated scanning and the manual version.
Reducing what is discoverable
Remove what should not be there. Old versions, backup files, test endpoints and sample content should be deleted rather than left unlinked, and a deployment process that publishes only intended artefacts prevents most of it recurring — the same hygiene discussed under web server hardening.
Authenticate everything, including paths you believe nobody knows about. Unlinked is not protected, and this is the single most important point: obscurity delays discovery and does not prevent it.
Put administrative interfaces behind a VPN or restrict them by source address so discovering the path achieves nothing. Disable directory listing. Do not rely on robots.txt to hide anything — it is a public list of paths you would prefer people not visit, which is an invitation rather than a control.
Rate limiting and bot management slow bulk discovery and give you a log of who is looking, which is worth having even though a patient attacker works around it.
Where it fits in a test
Content discovery belongs in the mapping phase, before anything else, because the rest of the test is scoped by what you found. An authorization flaw in an endpoint nobody discovered is a flaw nobody tested — which is why the structured approach under web application testing methodology puts enumeration first and treats its thoroughness as determining overall coverage.
Exam angles
Know forced browsing or content discovery as requesting candidate paths to find unlinked resources, distinct from crawling which follows links. Recognize wordlist quality and extension selection as the factors determining results, and response filtering as necessary where applications return 200 for missing pages. Know that it is noisy and detectable, requires authorization, and that the defence is removing unnecessary content and authenticating every path rather than relying on obscurity.
Comments
Post a Comment