The report your engineers and auditors will both use.
A complete, interactive example of a CYBEROCO web application and API penetration test report. The client is fictional; the scoring, weakness classes and compliance mappings are real.
Penetration Test Report
Acme Pay (fictional client)
Web application & API
Acme Pay and all hosts shown are fictional (reserved .example domains). Evidence is redacted and attack payloads are withheld. CVSS scores are computed from each vector using the FIRST CVSS v3.1 formula.
Executive summary
Acme Pay's platform had one critical and two high-risk weaknesses that, combined, allowed an unauthenticated attacker to reach every customer's billing data.
Findings by severity
- 1Critical
- 2High
- 3Medium
- 2Low
- 1Info
- 9findings
- The most serious issue was an internal user-management API exposed to the internet without authentication (F-01).
- Access-control and input-handling flaws in the customer API (F-02, F-03) allowed one customer to read other customers' data.
- Authentication hardening, outdated components and configuration issues made up the remaining findings.
- At retest, all critical and high findings were fixed. Overall risk fell from High to Low.
Top priorities
Scope & methodology
In-scope assets
| Asset | Type | Access provided |
|---|---|---|
| app.acme-pay.example | Customer web application | 2 accounts per role (customer, customer admin) |
| api.acme-pay.example | REST API v2 | OpenAPI specification, API tokens |
| admin.acme-pay.example | Staff support dashboard | 1 support-agent account |
| legacy-api.acme-pay.example | Partner API (legacy) | Network access only |
Engagement details
- Approach
- Grey box, authenticated
- Testing window
- 1–12 June 2026 (10 working days)
- Team
- 2 senior consultants
- Retest
- 21 July 2026
Standards followed
- OWASP Web Security Testing Guide (WSTG) v4.2
- OWASP API Security Top 10 (2023)
- OWASP ASVS 4.0.3, Level 2
- PTES and NIST SP 800-115
- CVSS v3.1 for severity scoring
Methodology
- 01Reconnaissance
Map hosts, routes, roles and data flows from the OpenAPI spec and live traffic.
- 02Automated discovery
Targeted scanning to widen coverage; every result is manually validated.
- 03Manual testing
Authentication, authorisation, business logic, injection and session handling by hand.
- 04Exploitation & chaining
Safely prove impact and combine weaknesses into realistic attack paths.
- 05Reporting & retest
Evidence-backed findings, a debrief call, then a retest of every fix.
Findings
This public preview shows full details for 4 of 9 findings. The complete report includes every finding in full.
Description
The /internal/api/ routes, intended only for the support dashboard, are published on the public API gateway and do not require a token. Any internet user can list, create and modify user accounts, including administrator roles.
Evidence (redacted)
GET /internal/api/users?page=1 HTTP/1.1 Host: api.acme-pay.example (no Authorization header) HTTP/1.1 200 OK {"total": 4812, "users": [{"id": "usr_•••", "email": "j•••@•••.example", "role": "admin"}, …]}Impact
Full compromise of the platform's user base: an attacker can create an administrator account, take over customer accounts and access every tenant's data.
Remediation
- Remove /internal/api/ routes from the public gateway; expose them only on the private network or behind the VPN.
- Require authentication and an administrator role on every internal route, enforced centrally in middleware.
- Add an automated test that fails the build if any route is reachable without a token.
Retest: Fixed. Internal routes now return 404 from the public gateway and 401 without a valid administrator token on the private network.Full details in the complete report
Evidence, remediation steps, compliance mapping, references and retest notes for this finding are included in the full report.
Request the full reportDescription
GET and PATCH /api/v2/invoices/{id} verify that the caller is logged in but not that the invoice belongs to the caller's organisation. Invoice IDs are sequential, so they can be enumerated.
Evidence (redacted)
GET /api/v2/invoices/100482 HTTP/1.1 Host: api.acme-pay.example Authorization: Bearer <token for a user in tenant A> HTTP/1.1 200 OK {"id": 100482, "tenant_id": "tnt_B•••", "customer": "R•••• Ltd", "amount": "•••", "notes": "•••"}Impact
Any customer can read every other customer's invoices (billing and contact details) and alter invoice notes.
Remediation
- Scope every invoice query by the caller's tenant ID on the server, never by client input alone.
- Return 404 for objects outside the caller's tenant so their existence isn't revealed.
- Replace sequential IDs with random identifiers (UUIDs) as defence in depth.
Retest: Fixed. Requests for another tenant's invoice now return 404; the object-ownership check is covered by automated tests.Full details in the complete report
Evidence, remediation steps, compliance mapping, references and retest notes for this finding are included in the full report.
Request the full reportDescription
Forty consecutive failed logins and two hundred one-time-password attempts within five minutes were all processed. No lockout, delay or challenge was triggered.
Impact
Passwords and one-time codes can be guessed at scale, enabling account takeover.
Remediation
- Limit failed attempts per account and per IP, with progressive delays (PCI DSS 8.3.4 allows at most 10 attempts before lockout).
- Invalidate a one-time code after 3–5 wrong attempts and issue a new one.
- Alert on credential-stuffing patterns.
Retest: Partially fixed. Login is now rate limited; one-time-password verification still accepts unlimited attempts.Full details in the complete report
Evidence, remediation steps, compliance mapping, references and retest notes for this finding are included in the full report.
Request the full reportDescription
The session cookie is set without the Secure and SameSite attributes, so browsers may send it over plain HTTP and on cross-site requests.
Evidence (redacted)
HTTP/1.1 200 OK Set-Cookie: session=•••; Path=/; HttpOnlyImpact
Increases the risk of session theft on untrusted networks and of cross-site request forgery.
Remediation
- Set Secure, HttpOnly and SameSite=Lax (or Strict) on all session cookies.
Retest: Fixed. The cookie now carries Secure, HttpOnly and SameSite=Lax.Full details in the complete report
Evidence, remediation steps, compliance mapping, references and retest notes for this finding are included in the full report.
Request the full reportFull details in the complete report
Evidence, remediation steps, compliance mapping, references and retest notes for this finding are included in the full report.
Request the full report
Attack chain
Individually, some findings look minor. Combined, they gave an unauthenticated attacker a path to every customer's billing data.
- F-09InfoStack traces leak internal paths
Error responses reveal the internal user-management service and its routes.
Open - F-01CriticalUnauthenticated internal API
The internal API is reachable from the internet; the attacker creates an administrator account.
Fixed - F-03HighCross-tenant invoice access
With any account, sequential invoice IDs expose every tenant's invoices.
Fixed - ImpactBulk exposure of billing data
Customer names, contact details and invoice amounts across all tenants.
Broken at retest by fixing F-01 and F-03.
Remediation roadmap
Fixes are ordered by risk and effort, so the team closes the most dangerous paths first.
Immediate
0–7 days
Short term
within 30 days
Compliance mapping
Every finding is mapped to the controls your auditors will ask about.
| Finding | PCI DSS v4.0 | ISO/IEC 27001:2022 | SOC 2 (TSC) | OWASP |
|---|---|---|---|---|
| F-01 Critical | 7.2.1, 8.3.1 | A.5.15, A.8.5 | CC6.1 | API2:2023 |
| F-03 High | 6.2.4, 7.2.2 | A.8.3 | CC6.1 | API1:2023 |
| F-05 Medium | 8.3.4 | A.8.5 | CC6.1 | A07:2021 |
| F-07 Low | 2.2.6 | A.8.9 | CC6.6 | A05:2021 |
| + 5 more findings mapped in the full report Request the full report | ||||
Retest results
We retest every finding once fixes are deployed, at no extra cost, and update the report.
- 6Fixed
- 1Partially fixed
- 1Risk accepted
- 1Open
| F-01 | Internal user-management API reachable without authentication | Fixed | Fixed. Internal routes now return 404 from the public gateway and 401 without a valid administrator token on the private network. |
|---|---|---|---|
| F-03 | Cross-tenant access to invoices by changing the invoice ID | Fixed | Fixed. Requests for another tenant's invoice now return 404; the object-ownership check is covered by automated tests. |
| F-05 | No rate limiting on login and one-time-password verification | Partially fixed | Partially fixed. Login is now rate limited; one-time-password verification still accepts unlimited attempts. |
| F-07 | Session cookie missing Secure and SameSite attributes | Fixed | Fixed. The cookie now carries Secure, HttpOnly and SameSite=Lax. |
| + 5 more findings mapped in the full report Request the full report | |||
CVSS calculator
Every score in this report comes from a CVSS v3.1 vector. Change the metrics to see how severity is calculated.
Base score
9.1
CriticalVector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N