Forged JWT → cross-user order read
-
Hop 1Forge a customer session via RS256→HS256 algorithm confusion
-
Hop 2Replay the forged identity against the order API
-
Hop 3Read the victim's order history
Security Assessment Report
Defenses were breached and data extraction was demonstrated: one or more confirmed vulnerabilities were actively exploited to the point of provable, read-only data extraction. Treat this as a confirmed compromise — immediate remediation and incident response are required.
| Severity | Count |
|---|---|
| CRITICAL | 2 |
| HIGH | 2 |
| MEDIUM | 1 |
| LOW | 2 |
| INFO | 1 |
| TOTAL | 7 + 1 informational |
since last scan: 3 new, 5 persisting, 1 fixed
| Check | Outcome | Detail | Surface | Requests |
|---|---|---|---|---|
| crawl | RAN | 54 pages, 17 forms, 14 API endpoints mapped | — | 420 |
| tls | RAN | TLS 1.3, valid certificate | — | 2 |
| cookies | RAN | 4 cookie(s) across 55 URL(s) — 0 finding(s) | — | 84 |
| headers | RAN | 2 finding(s) | — | 3 |
| js-cve | RAN | 0 finding(s) — 19 script(s) assessed | — | 320 |
| js-secret | RAN | 0 finding(s) — 19 bundle(s) scanned offline | — | 0 |
| exposed-files | RAN | baseline 404/18 chars, 44 probes → 0 finding(s) | — | 180 |
| tech-cve | RAN | 1 finding(s) | — | 41 |
| dir-probe | RAN | baseline 404/18 chars, 52 paths → 0 finding(s) | — | 220 |
| authz-boundary | RAN | 0 finding(s) — 18 protected route(s) x read-only bypass matrix | — | 300 |
| reflected-xss | RAN | 1 finding(s) | — | 128 |
| dom-xss | RAN | 0 finding(s) — 6 page(s) browser-probed | — | 560 |
| sqli | RAN | 1 finding(s) | — | 760 |
| jwt | RAN | 1 finding(s) | — | 46 |
| idor | RAN | 1 finding(s) | — | 132 |
| api-fuzz | RAN | 0 finding(s) — 14 endpoint(s) fuzzed | — | 1680 |
| cmdi | NOTHING_TO_TEST | 0 injection points inside scope | — | 0 |
| escalation | RAN | 4 confirmed findings escalatable — extraction demonstrated, 1 chain composed | — | 120 |
| Severity | Finding | Urgency |
|---|---|---|
| HIGH | Cross-user order receipt access | Fix within 24–48 hours |
| CRITICAL | Forged JWT → cross-user order read | Fix immediately — active exploitation likely |
| HIGH | JWT algorithm confusion accepts forged tokens | Fix within 24–48 hours |
| CRITICAL | SQL injection in product search | Fix immediately — active exploitation likely |
| MEDIUM | Reflected XSS in search results page | Fix before next release |
| LOW | Missing Cross-Origin-Resource-Policy header on static assets | Address in next sprint |
| INFO | Technology detected: Next.js 15.1.2 | Informational |
| LOW | X-Powered-By header discloses framework | Address in next sprint |
| Time | Phase | Event |
|---|---|---|
| 2026-08-14 09:31:12 UTC | SYSTEM | strike accepted — target acme-store.example.com (AT_YOUR_RISK tier, budget 6000) |
| 2026-08-14 09:33:40 UTC | RECON | crawl complete: 54 pages, 17 forms, 14 API endpoints mapped |
| 2026-08-14 09:34:02 UTC | RECON | tech-cve: GET https://acme-store.example.com/ → 200 — Next.js 15.1.2 fingerprinted |
| 2026-08-14 09:36:05 UTC | AUTH | credential login succeeded — session acquired for authenticated checks |
| 2026-08-14 09:38:15 UTC | PROBE | sqli: error differential on /search?q= — 1 injectable candidate |
| 2026-08-14 09:41:27 UTC | BREACH | sqli: UNION context confirmed, 7 columns — banner extracted read-only |
| 2026-08-14 09:43:10 UTC | BREACH | jwt: RS256→HS256 confusion accepted — forged token replayed against an anonymous-rejecting route |
| 2026-08-14 09:44:51 UTC | BREACH | idor: /api/orders/1042 returned a foreign owner reference — BOLA confirmed |
| 2026-08-14 09:52:41 UTC | ESCALATE | sqli: read-only extraction demonstrated — banner + 1 masked row from customers (SELECT-only ceiling) |
| 2026-08-14 09:54:02 UTC | ESCALATE | attack graph: demonstrated chain — forged JWT → cross-user order read (3 hops, goal data-exfiltration) |
| 2026-08-14 09:56:03 UTC | VERDICT | INSIDE_THE_WIRE — 8 finding(s): 2 critical, 2 high, 1 medium, 2 low, 1 info |
| 2026-08-14 09:56:03 UTC | VERDICT | coverage GOOD — 17 ran, 1 nothing-to-test, 0 skipped; 5214/6000 requests |
| 2026-08-14 09:56:03 UTC | VERDICT | since last scan: 3 new, 5 persisting, 1 fixed |
GET /search?q=gift' UNION SELECT NULL,version()-- -
curl -H 'Accept: text/html' 'https://acme-store.example.com/search?q=gift%27%20UNION%20SELECT%20NULL%2Cversion%28%29--%20-'const rows = await db.query(`SELECT * FROM products WHERE name ILIKE '%${q}%'`);const rows = await db.query('SELECT * FROM products WHERE name ILIKE $1', [`%${q}%`]);curl -H 'Accept: application/json' 'https://acme-store.example.com/api/orders/1042'curl -H 'Accept: text/html' 'https://acme-store.example.com/search?q=ts9f3k2%22%3E%3Csvg%20id%3Dts9f3k2%3E'// next.config.ts
const securityHeaders = [
{ key: "Strict-Transport-Security", value: "max-age=31536000; includeSubDomains" },
{ key: "Content-Security-Policy", value: "default-src 'self'; object-src 'none'; frame-ancestors 'none'" },
{ key: "X-Content-Type-Options", value: "nosniff" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];
export default {
async headers() {
return [{ source: "/:path*", headers: securityHeaders }];
},
};// next.config.ts
const securityHeaders = [
{ key: "Strict-Transport-Security", value: "max-age=31536000; includeSubDomains" },
{ key: "Content-Security-Policy", value: "default-src 'self'; object-src 'none'; frame-ancestors 'none'" },
{ key: "X-Content-Type-Options", value: "nosniff" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];
export default {
async headers() {
return [{ source: "/:path*", headers: securityHeaders }];
},
};