Web cache deception
SkillSecurityTrick a CDN/cache into storing a victim's authenticated response at a public URL, then read it. Load on "web cache deception", when a CDN/cache sits in front of an app that serves per-user content, or to test whether private pages can be cached. Signals: `X-Cache`/`CF-Cache-Status` headers, caching by file extension, static-looking suffixes on dynamic endpoints.
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Web cache deception skill
What this skill tells your AI
The instructions your AI receives, as published by noorqureshi/sploitagent in skills/web/web-cache-deception/SKILL.md and read by ahel’s review.
When it applies
A caching layer (CDN, reverse proxy) fronts an app that returns per-user content, and the cache decides what to store by URL pattern/extension. If you can make an authenticated response look cacheable, the cache stores it — and anyone can then fetch that victim's data.
Why it works
The cache and the origin disagree about the URL. The cache sees /account.css and thinks "static,
cache it"; the origin ignores the .css suffix (or a delimiter) and serves the dynamic
/account page. The victim's private response gets stored under a public key you can request.
Method
- Confirm the mismatch: request an authenticated page with a static suffix —
/account/foo.css,/account%0a.css,/account;foo.js,/account%2ffoo.css. If the origin still returns the account page (not 404), the origin is ignoring the suffix. - Confirm caching: repeat and watch
X-Cache/CF-Cache-Statusflip toHIT, or aAgeheader appear. A cached, authenticated response is the vulnerability. - Prove cross-user impact: as the victim, visit the crafted URL once (or have them); then as an unauthenticated attacker request the same URL and receive the victim's private data.
- Explore delimiters/normalisation: caches and origins normalise
;,%2f,//,.., trailing dots differently — Param Miner's rules or manual fuzzing find the pair that splits them. - Report with least data: prove one private field leaked; don't hoard victim data.
Gotchas
- This is not cache poisoning: deception caches a victim's real response; poisoning injects a
malicious response via unkeyed input. Different bug, different report (
web-cache-poisoning). - Needs a genuinely cacheable-looking key and an origin that ignores it — confirm both.
- Some CDNs cache by content-type, not extension — test path-based tricks too.
Verify success
An unauthenticated request retrieves another user's authenticated content from the cache
(HIT/Age present), reproducibly.
References
Omer Gil "Web Cache Deception"; PortSwigger web cache deception labs; CDN caching-rule docs.
Signals
- GitHub stars
- 20
- Forks
- 7
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
web-cache-deception-noorqureshi- Source
- github.com/noorqureshi/sploitagent
github.com/noorqureshi/sploitagent
Related picks
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScriptowasp-security
Skill · davila7
The pick for Web (OWASP)owasp-web
Skill · nahid-sparktales
The pick for Web (OWASP)gws-shared
Skill · googleworkspace
More in Securitybrandkit
Skill · leonxlnx
More in Security