HackproofHacks
Bug Bounty 14 min read

How Hackers Use waybackurls to Find Vulnerabilities in Old Pages

How hackers use waybackurls to find vulnerabilities in forgotten pages — pull a site's old URLs from web archives and turn that history into real findings.

Hassan Ansari

Hassan Ansari

A code card showing waybackurls pulling historical URLs with query parameters

How Hackers Use waybackurls to Find Vulnerabilities

The internet does not forget. That page a company quietly took down last year, the API endpoint they replaced in a redesign, the debug file someone swore they deleted: an archive recorded it, and it is still sitting there in the record. To a security researcher, that record is a map to the parts of a target nobody is looking after anymore.

waybackurls is the tool that reads that map. It’s a tiny command-line program that does one clever thing: it asks web archives, chiefly the Internet Archive’s Wayback Machine, for every URL they have ever seen on a domain and hands you the list. It doesn’t crawl the live site or guess at paths. It just shows you the site’s own forgotten history.

This guide explains why that history is so valuable, how to use the tool, and how to turn a wall of old URLs into actual findings. It fits alongside the rest of the recon toolkit: the subdomain enumeration guide maps a target’s breadth, while this one digs into its past.


Why the past is a vulnerability

To understand why archived URLs matter, you have to understand a simple truth about how websites change: things get replaced, but they rarely get properly removed.

A company redesigns its site. The old checkout flow is swapped for a new one, and the old pages are no longer linked from anywhere: the menus point to the new version, the sitemap lists the new version, a normal visitor never sees the old one. But the old code is often still sitting on the server, reachable if you know the exact URL, still running whatever logic it ran two years ago.

And here is the security kicker: old code was usually written to weaker standards. It predates a security fix that was only applied to the new version, uses a deprecated parameter that skips a validation check added later, or exposes a debug feature everyone forgot was there. The neglected page is the one nobody re-tested, patched, or is monitoring.

Live crawling and normal browsing will never find these pages, because nothing links to them. That is the whole point. But the archives remember them, and waybackurls reads the archives.


What the tool actually does

The mechanism is simple. Web archives like the Wayback Machine have spent decades crawling the internet and recording the URLs they encounter. Every time their crawler saw a page on a domain, it noted the URL. Over years, that builds into an enormous list of paths a domain has served.

waybackurls queries that data for a domain you give it and prints every URL the archive has on record. Install it (it is a Go program, like ffuf):

go install github.com/tomnomnom/waybackurls@latest

Then run it:

waybackurls target.com > urls.txt

That single line asks the archives for target.com’s history and saves the result to a file. On an established target with years of history, this can return thousands of URLs, including a great many that do not exist anywhere on the current live site. You now have a historical map of the target’s attack surface that no amount of clicking around the live site would have revealed.

Notice what has not happened here: you have not touched the target’s servers at all. Every request went to the archive. This is passive reconnaissance: quiet, low-risk, and invisible to the target.


Making sense of thousands of URLs

A file with thousands of URLs is not a finding. It is raw material. The skill, exactly as with ffuf’s output, is filtering it down to the handful of URLs actually worth investigating. Here is what I look for.

Look for URLs with parameters first. Anything with a ? and a = in it is a page that takes input, and input is where a huge share of vulnerabilities live. An old URL like search.php?query= or view?id= is a candidate for injection and access-control testing. Pull these out:

grep "=" urls.txt | grep "?"

Old backups and data files are pure gold, so filter for extensions that tend to leak things they should not:

grep -E "\.(bak|old|zip|sql|json|config|txt|log)" urls.txt

A .sql file is a database export. A .bak is a backup of source code. A .config might hold credentials. These are the archived paths that make experienced hunters sit up.

Also check for old API endpoints and admin paths: anything with api, admin, internal, dev, test, or debug in the path. Old API versions are notorious for still being live and lacking the controls added to newer versions. An endpoint like /api/v1/users might have been superseded by v2, but if v1 still answers and skips a permission check, that is a serious finding.

Finally, watch for anything that just looks odd. After a while you develop an eye for the URL that does not fit the pattern: the one-off, the leftover, the thing that looks like it was never meant to be public. Follow those hunches.

The grep and filtering skills from the command-line tools guide are exactly what you use here to carve the signal out of the noise.


From an old URL to a real finding

Filtering gets you a shortlist. Now comes the part that turns recon into an actual vulnerability, and the part where authorisation starts to matter, because you are about to touch the live target.

The first question for any promising archived URL is simply: does it still work? Request it against the live site and see. Many will be genuinely gone, returning a 404. But some, often more than you would expect, still respond: a page the company thinks was removed years ago, quietly answering requests. That alone is worth noting.

For the ones that are still live, you test them like any other endpoint, now armed with the knowledge that this is old, likely under-maintained code:

  • An old URL with a parameter goes into Burp Suite for injection and access-control testing.
  • An exposed backup or data file gets downloaded and read carefully, since it may contain real data.
  • An old API endpoint gets checked for whether it still enforces authentication and authorisation.

The recurring story in bug bounty write-ups is some version of this: a hunter pulls a target’s history with waybackurls, spots a forgotten endpoint, checks whether it is still live, and finds it exposing data or missing a control the current site has. The tool did not find the vulnerability. It found the forgotten page, and the forgotten page had the vulnerability. That is the whole play.


The JavaScript goldmine

If you take one advanced idea from this guide, make it this: old JavaScript files are among the richest things in the archive.

Modern web apps put a lot of logic in JavaScript that runs in the browser, and those files are full of references: API endpoints the app calls, parameter names, internal paths, occasionally even keys or tokens a developer left in by mistake. When a site is redesigned, the old JavaScript files are frequently left on the server, and each one describes an entire version of the application that no longer officially exists but may still partly work.

Pull the JavaScript files out of your archived URLs:

grep -E "\.js" urls.txt

Then read them. Search each one for anything that looks like a path or an endpoint: strings starting with /api, /admin, or /internal, and parameter names being assigned values. An old script often hands you a list of endpoints to test that you would never have found any other way, because they were only ever referenced from code, never from a link a crawler could follow. This single technique sits behind a surprising number of published bug bounty findings.

Widen the net, then automate

waybackurls reads one main source, but it is not the only archive, and other tools pull from others. gau (short for “get all URLs”) queries several archive providers at once, and katana actively crawls the live site to complement the historical view. Running two or three of these and merging the results gives noticeably fuller coverage than any one alone. The sorting and de-duplicating skills from the command-line guide are exactly what you use to fold them into a single clean list:

waybackurls target.com | sort -u > all-urls.txt

Once you are doing this across several targets, you will want to package the whole flow (gather, filter for parameters and interesting extensions, de-duplicate) into a small script, so one command turns a domain into a shortlist. That is the natural payoff of the automation habit, and it is where recon stops being a chore and becomes a repeatable process.

A worked example

To make it concrete, here is the shape of how this plays out on a real, authorised target. You run waybackurls and get four thousand URLs. You filter for parameters and spot /legacy/report.php?id=1044, a path that appears nowhere in the current site’s navigation. You request it live, half expecting a 404, and it still responds. You send it to Burp Suite, change the id to a different number, and someone else’s report loads on the screen. You have just found a broken access control flaw on a page the company believed it had retired years ago.

Nothing in that chain was clever. The archive remembered a forgotten page, and the forgotten page carried a flaw the current site had long since fixed. That story repeats across real targets, which is why archived-URL recon belongs in a serious hunter’s routine.


Where it sits in a recon workflow

waybackurls is one instrument, and it plays best in a small ensemble. A sensible recon flow layers it with the others:

  1. Map the breadth first: find the target’s subdomains (see the enumeration guide and the Subdomain Finder tool), because you will want to run waybackurls against the interesting ones, not just the main domain.
  2. Pull the history with waybackurls on each promising host to surface forgotten paths.
  3. Brute-force the gaps with ffuf to find paths the archives never recorded. waybackurls gives you known-real old URLs; brute-forcing guesses new ones. Together they cover far more than either alone.
  4. Test what survives through Burp and manual analysis.

Each tool finds what the others miss. waybackurls’ unique contribution is time: it is the only one that looks into the target’s past instead of its present.


Passive to gather, authorised to test

One clear line runs through all of this. Gathering archived URLs is passive and low-risk, because you are only ever querying public archives; you never touch the target. That part you can do freely.

But the moment you take those URLs and start testing them, requesting them against the live site, probing their parameters, downloading their files, you are doing active testing, and that requires authorisation. A bug bounty programme’s scope or a signed penetration testing agreement is what makes it lawful. Finding an old endpoint in an archive is not permission to attack it; the scope is.

So the rule is the familiar one: gather freely and quietly, but only act against targets you are authorised to test. Discovering a forgotten page does not change whose it is.


The takeaway

Websites are living things that shed old skin constantly, and that discarded skin (the replaced endpoints, the deprecated parameters, the “deleted” files) piles up in the archives, still reachable, still running old and weaker code. waybackurls is how you read that pile. It is one small command that hands you a target’s forgotten history, and history is where neglected vulnerabilities survive.

Once you have the list, httpx will tell you which of those old URLs are still alive, and nuclei can sweep the survivors for known issues. The tool is one of several small, composable recon utilities from the same author that reward being chained together.

Add it to your recon alongside subdomain enumeration, ffuf and Burp Suite, keep your testing strictly inside scope, and you will find the doors everyone else walked straight past. If you want to learn this kind of recon methodology properly, with guided practice, that is exactly what our training is built around.

#waybackurls #recon #bug bounty #wayback machine #content discovery #osint #attack surface
Free newsletter

Liked this? I write one like it every week.

One practical security lesson in your inbox each week, explained the same simple way. Join 10,000+ readers. Unsubscribe anytime.

From the article

Need a security assessment?

HackproofHacks provides web application and API penetration testing — using the same techniques covered in this article, with your explicit authorisation.

Book a free scoping call

More on Bug Bounty.

All articles →
FAQ

Questions about this topic.

What is waybackurls?

waybackurls is a small command-line tool that fetches the list of URLs a web archive has recorded for a given domain over the years. Instead of crawling the live website, it asks archives like the Wayback Machine for every path they have ever seen on that domain, then prints them. The result is a historical map of the site — including old endpoints, parameters and files that no longer appear anywhere on the current version — which is valuable reconnaissance for finding forgotten, vulnerable pages.

Why are old, archived URLs useful for finding vulnerabilities?

Because websites change but their old pages are rarely truly removed. An endpoint that was replaced, a parameter that was deprecated, or a debug file that was 'deleted' may still work on the server even though nothing links to it anymore — and old pages were often written with weaker security. Archived URLs reveal this forgotten attack surface that live crawling and normal browsing completely miss, pointing testers straight at the neglected corners where flaws tend to survive.

Is using waybackurls legal?

Running waybackurls itself is passive and low-risk because it queries public web archives, not the target's own servers — you are reading third-party historical data. However, the moment you take those URLs and start actually testing them against the live target, normal authorisation rules apply: you must have permission through a bug bounty scope or a penetration testing agreement. Gathering the list is passive reconnaissance; acting on it is active testing that requires authorisation.

What is the difference between waybackurls and a directory brute-forcer?

A directory brute-forcer like ffuf guesses paths by trying entries from a wordlist against the live server. waybackurls does not guess at all — it retrieves paths that archives have actually observed on the domain in the past, so it finds real historical URLs including ones no wordlist would contain, like specific parameters and one-off files. They complement each other: waybackurls gives you known-real old paths, and brute-forcing discovers paths that were never archived. Good recon uses both.

What should I look for in waybackurls output?

Focus on a few high-value patterns: URLs with parameters, which are candidates for injection and access-control testing; interesting file extensions like .bak, .old, .zip, .sql, .json and .config that may expose data or source; old API endpoints and admin paths that may still be live but unmaintained; and anything that looks like a debug, test or internal page. The raw list is large, so filtering it down to these patterns is where the real value is.

Does waybackurls work on any website?

It works on any domain that web archives have recorded, which is most established sites — the more history and traffic a site has, the richer the results. Brand-new domains or very obscure sites may have little or no archived data, so the output will be thin. For established targets with years of history, waybackurls often returns thousands of URLs, which is exactly where its value lies.