Web cache deception
Cache deception stores a private response at a URL the cache thinks is static. It is not cache poisoning. Poisoning changes what other users receive. Deception discloses your own authenticated page to a second client that never logged in.
Tags: cache-deception, cdn, session
Level: advanced
Method
Name the cache
Read Age, X-Cache, CF-Cache-Status, or the vendor header on the host you are testing. No cache header means you do not yet know a shared cache is involved.
Tools: Burp Suite
Record the cache key
See whether path, query, cookie, and Authorization change the stored object. A private URL that ignores the session cookie is the lead.
Tools: Burp Suite
Compare a static-looking path
Request an authenticated page you own, then the same path when the suffix looks like a static file. Different cache status on the same account data is the signal.
Tools: browser, Burp Suite
Second client
Load that URL in a clean session that never authenticated. Your own replay is not proof that someone else receives the body.
Tools: browser
Say what was stored
Use an account you own. Email, object ids, or tokens in the cached body are the impact. Stop if the body is not yours.
Tools: browser
Clean up
Do not leave a private response in a shared cache. Purge if you can, wait out the stated lifetime, or use a path only your test user can request.
Tools: browser
Field notes
- The existing cache-poisoning playbook is a different bug. Do not file them as one report.
- A HIT that still carries a private Set-Cookie is part of the evidence.
- Normalization differences between the cache and the origin are the usual cause. Describe the two URLs, not a wordlist.