Penetration Test Report Template (PTES, OWASP WSTG)
Pentest report: executive summary, scope and rules of engagement, PTES phases, WSTG coverage, CVSS ratings, findings, retest
Як використовувати: Use it to report authorised security testing to both management and engineers. Record scope, rules of engagement and authorisation first, then each finding with evidence, CVSS vector and remediation. The main pitfall is unredacted secrets or personal data in evidence.
Перегляд
Penetration Test Report: [Client or system name]
Penetration test report. The engagement phases follow the Penetration Testing Execution Standard (PTES), and web application test coverage is organised by the test categories of the OWASP Web Security Testing Guide (WSTG). Replace every
[bracketed]value and every finding marked Example. For authorised testing only: never test a system without written permission from its owner.
Document control
| Field | Value |
|---|---|
| Document ID | [PT-CLIENT-2026-001] |
| Client / system owner | [Organisation name] |
| Target | [Application or environment name and version] |
| Testing organisation | [Internal red team / external testing firm] |
| Engagement dates | YYYY-MM-DD to YYYY-MM-DD |
| Report version | [0.1] |
| Status | [Draft / Final / Retest update] |
| Classification | [Confidential: restricted distribution] |
| Authorisation reference | [Signed authorisation letter or contract ID, date] |
| Last updated | YYYY-MM-DD |
Approvals
| Role | Name | Decision | Date |
|---|---|---|---|
| Lead tester | [@name] | [Issued] | YYYY-MM-DD |
| Quality reviewer (testing side) | [@name] | [Reviewed] | YYYY-MM-DD |
| Client security owner | [@name] | [Accepted / Accepted with comments] | YYYY-MM-DD |
Distribution
| Name | Organisation | Version received | Date |
|---|---|---|---|
| [@name] | [Client] | [1.0] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | Draft for technical review |
| 1.0 | YYYY-MM-DD | [@name] | Example: Final report issued |
| 1.1 | YYYY-MM-DD | [@name] | Example: Retest results added; F-01 and F-03 closed |
Contents
1. Executive summary
1.1 Overall assessment
Example: Testing of the customer portal between YYYY-MM-DD and YYYY-MM-DD found 1 high, 2 medium and 1 low severity issue. The most serious allows a logged-in customer to view and alter other customers' invoices by changing a number in the address bar, which would expose billing data of all [n] customers. No issue allowed access without an account. Authentication, transport security and session handling were well implemented.
Overall risk rating: [Critical / High / Medium / Low]
1.2 Findings by severity
| Severity | Count | Fixed at retest |
|---|---|---|
| Critical | 0 | |
| High | 1 | [1] |
| Medium | 2 | [1] |
| Low | 1 | [0] |
| Informational | 2 | Not applicable |
1.3 Key recommendations
- Example: Enforce object-level authorisation on every invoice and order endpoint (F-01) before the next release.
- Example: Encode user content on output across the portal and add a Content Security Policy (F-02).
- Example: Add rate limiting and lockout monitoring to login (F-03).
1.4 Strengths observed
- [Example: TLS configuration rated strong; HSTS enabled with preload.]
- [Example: Session cookies set with Secure, HttpOnly and SameSite attributes.]
2. Scope and rules of engagement
2.1 Targets in scope
| Target | Type | Environment | Notes |
|---|---|---|---|
Example: https://portal.example.com | Web application | Production | Read-only on payment flows |
Example: https://api.example.com/v2 | REST API | Production | OpenAPI file supplied |
Example: 203.0.113.10-203.0.113.20 | External hosts | Production | Network services only |
| [Target] | [Type] | [Environment] | [Notes] |
2.2 Out of scope
- [Example: third-party payment provider pages and domains.]
- [Example: denial-of-service and load testing.]
- [Example: social engineering of staff.]
2.3 Rules of engagement
| Item | Agreement |
|---|---|
| Test type | [Grey box: two customer accounts and one support account provided] |
| Testing windows | [Weekdays 09:00-18:00 client time zone] |
| Source IP addresses of testers | [198.51.100.25, 198.51.100.26] |
| Data handling | No exfiltration of real customer data beyond the minimum needed as proof; proofs redacted |
| Destructive actions | Not permitted without prior written approval per action |
| Emergency contact | [Name, phone] for critical findings and incidents |
| Critical finding notification | Within [4 hours] of discovery, by phone and encrypted email |
| Authorisation | [Letter reference, signed by system owner on YYYY-MM-DD] |
2.4 Limitations
[Example: MFA enrolment flow could not be tested because test accounts
were pre-enrolled; API rate limits slowed automated scanning, so coverage
of /v2/reports is partial.]
3. Methodology
3.1 Engagement phases (PTES)
| Phase | Activities performed | Output |
|---|---|---|
| Pre-engagement interactions | Scope, rules of engagement, authorisation, contacts | Section 2 |
| Intelligence gathering | DNS and certificate enumeration, public code and document search, technology fingerprinting | Asset list, technology stack (Appendix A) |
| Threat modelling | Identified assets (billing data, accounts), threat actors (external attacker, malicious customer), likely attack paths | Prioritised test focus |
| Vulnerability analysis | Automated scanning plus manual testing by WSTG category (3.2) | Candidate vulnerabilities |
| Exploitation | Controlled proof of concept for confirmed issues within rules of engagement | Evidence for findings |
| Post-exploitation | Assessed reach and value of access gained (data exposed, privilege gained, lateral movement potential) without persistence | Impact statements |
| Reporting | This report; debrief meeting | Report, debrief |
3.2 Web application coverage (OWASP WSTG categories)
| WSTG category | Tested | Coverage notes | Findings |
|---|---|---|---|
| Information Gathering | Yes | Fingerprinting, entry point mapping | INFO-1 |
| Configuration and Deployment Management Testing | Yes | Headers, HTTP methods, file extensions, admin interfaces | F-04 |
| Identity Management Testing | Yes | Registration, account provisioning, enumeration | None |
| Authentication Testing | Yes | Lockout, password policy, reset flow | F-03 |
| Authorization Testing | Yes | Horizontal and vertical access, IDOR | F-01 |
| Session Management Testing | Yes | Cookie attributes, fixation, timeout, logout | None |
| Input Validation Testing | Yes | XSS, injection, SSRF on file import | F-02 |
| Testing for Error Handling | Yes | Stack traces, error codes | F-04 |
| Testing for Weak Cryptography | Yes | TLS configuration, token randomness | None |
| Business Logic Testing | Partial | Refund and discount logic; limited by test data | INFO-2 |
| Client-side Testing | Yes | DOM XSS, clickjacking, CORS, storage | None |
| API Testing | Partial | REST endpoints from OpenAPI file | F-01 |
3.3 Tools used
| Tool | Purpose |
|---|---|
| [Intercepting proxy] | Manual testing and request manipulation |
| [Web vulnerability scanner] | Automated discovery, verified manually |
| [Network scanner] | Port and service discovery |
| [TLS testing tool] | Transport security assessment |
| [Custom scripts] | Authorisation matrix testing across accounts |
4. Risk rating method
Findings are scored with the Common Vulnerability Scoring System (CVSS) [v3.1 / v4.0] base metrics, published by FIRST. The base score expresses technical severity; the final rating may be adjusted for business context, and any adjustment is explained in the finding.
| Severity | CVSS base score | Expected response |
|---|---|---|
| Critical | 9.0-10.0 | Fix or mitigate immediately; consider emergency change |
| High | 7.0-8.9 | Fix within [14] days |
| Medium | 4.0-6.9 | Fix within [60] days |
| Low | 0.1-3.9 | Fix within [120] days or accept with justification |
| Informational | 0.0 or not scored | Consider as hardening |
Vector formats used:
- CVSS v3.1:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N - CVSS v4.0:
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
Scores are calculated with the official FIRST calculator for the chosen version.
5. Findings summary
| ID | Title | Severity | CVSS | Affected assets | Status |
|---|---|---|---|---|---|
| F-01 | Example: Insecure direct object reference on invoice API | High | 8.1 | api.example.com/v2/invoices/{id} | [Open / Fixed / Risk accepted] |
| F-02 | Example: Stored cross-site scripting in support ticket messages | Medium | 5.4 | portal.example.com/support | [Status] |
| F-03 | Example: No rate limiting on login | Medium | 5.3 | portal.example.com/login | [Status] |
| F-04 | Example: Verbose error messages disclose framework version and stack traces | Low | 3.7 | api.example.com | [Status] |
| INFO-1 | Example: Server banner reveals web server version | Informational | Not scored | portal.example.com | [Status] |
| INFO-2 | Example: Refund logic not fully tested due to test data limits | Informational | Not scored | Refund flow | [Status] |
6. Detailed findings
F-01: Insecure direct object reference on invoice API
| Attribute | Value |
|---|---|
| Severity | High |
| CVSS v3.1 | 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Affected assets | GET and PUT /v2/invoices/{id} |
| WSTG category | Authorization Testing |
| CWE | CWE-639 Authorization Bypass Through User-Controlled Key |
| Status | [Open] |
Description. The invoice endpoints check that the caller is logged in but not that the invoice belongs to the caller. Invoice IDs are sequential integers, so any customer can read or modify any other customer's invoice.
Evidence. Logged in as test customer A (cust-a@test), the tester
requested invoice 10482, which belongs to test customer B:
GET /v2/invoices/10482 HTTP/1.1
Host: api.example.com
Authorization: Bearer [token for customer A, redacted]
HTTP/1.1 200 OK
{"id":10482,"customerId":"[customer B, redacted]","total":"[redacted]", ...}
A PUT with a changed billing address returned 200 OK and the change
was visible to customer B.
Impact. Disclosure and modification of billing names, addresses and amounts for all customers; potential invoice fraud by changing payee references. Exposure affects an estimated [n] records.
Remediation.
- Enforce object-level authorisation in the invoice service: resolve the invoice through the caller's customer ID, and return 404 when it does not match.
- Apply the same check to all endpoints that take an object ID (orders, payments, addresses).
- Add automated tests that call each endpoint with another customer's object ID.
- Consider non-sequential identifiers as defence in depth, not as the fix.
References. OWASP API Security Top 10, API1 Broken Object Level Authorization; OWASP WSTG Authorization Testing; CWE-639.
F-02: Stored cross-site scripting in support ticket messages
| Attribute | Value |
|---|---|
| Severity | Medium |
| CVSS v3.1 | 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N |
| Affected assets | portal.example.com/support/tickets/{id} |
| WSTG category | Input Validation Testing |
| CWE | CWE-79 Improper Neutralization of Input During Web Page Generation |
| Status | [Open] |
Description. Ticket messages are rendered as HTML without output encoding. A customer can submit markup that runs script in the browser of the support agent who opens the ticket.
Evidence. A message containing <img src=x onerror=alert(document.domain)>
triggered an alert showing portal.example.com when opened with the
support account. Screenshot: Appendix B, figure 2.
Impact. Script runs in the support agent's session, which can read other customers' tickets. No Content Security Policy limits the effect.
Remediation. Encode output by context in the ticket view (use the framework's default escaping, remove the raw-HTML rendering), sanitise any rich text with an allow-list sanitiser, and deploy a Content Security Policy that forbids inline script.
References. OWASP WSTG Input Validation Testing; OWASP Cross Site Scripting Prevention Cheat Sheet; CWE-79.
F-03: No rate limiting on login
| Attribute | Value |
|---|---|
| Severity | Medium |
| CVSS v3.1 | 5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Affected assets | POST /login |
| WSTG category | Authentication Testing |
| CWE | CWE-307 Improper Restriction of Excessive Authentication Attempts |
| Status | [Open] |
Description. 500 consecutive failed logins for one test account from one IP address were all processed with no delay, lockout or CAPTCHA.
Evidence. Request log excerpt and timing summary in Appendix B, table 3.
Impact. Enables password guessing and credential stuffing against customer accounts.
Remediation. Add per-account and per-IP rate limiting with progressive delays, alert on credential stuffing patterns, and offer MFA to customers.
References. OWASP WSTG Authentication Testing; OWASP Authentication Cheat Sheet; CWE-307.
F-04: Verbose error messages
| Attribute | Value |
|---|---|
| Severity | Low |
| CVSS v3.1 | 3.7 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Affected assets | api.example.com (malformed JSON bodies) |
| WSTG category | Testing for Error Handling |
| CWE | CWE-209 Generation of Error Message Containing Sensitive Information |
| Status | [Open] |
Description. Malformed request bodies return a stack trace including framework name, version and internal file paths.
Impact. Helps an attacker select exploits for the exact framework version.
Remediation. Return a generic error with a correlation ID; log details server-side only.
References. OWASP WSTG Testing for Error Handling; CWE-209.
7. Remediation roadmap
| Priority | Finding | Action | Owner | Effort | Target date |
|---|---|---|---|---|---|
| 1 | F-01 | Object-level authorisation in invoice and related services | [@api-lead] | Medium | YYYY-MM-DD |
| 2 | F-02 | Output encoding and CSP | [@web-lead] | Low | YYYY-MM-DD |
| 3 | F-03 | Login rate limiting and alerting | [@platform-lead] | Medium | YYYY-MM-DD |
| 4 | F-04, INFO-1 | Generic errors, remove banners | [@platform-lead] | Low | YYYY-MM-DD |
| 5 | Systemic | Add authorisation tests to CI for all ID-based endpoints | [@test-lead] | Medium | YYYY-MM-DD |
8. Retest results
| ID | Original severity | Retest date | Build | Result | Notes |
|---|---|---|---|---|---|
| F-01 | High | YYYY-MM-DD | [build] | Example: Fixed | Requests for other customers' invoices return 404 |
| F-02 | Medium | YYYY-MM-DD | [build] | Example: Partially fixed | Encoding fixed; CSP not yet deployed |
| F-03 | Medium | YYYY-MM-DD | [build] | Example: Fixed | Lockout after 10 attempts; alert confirmed by client |
| F-04 | Low | YYYY-MM-DD | [build] | Example: Not fixed | Scheduled for next release |
9. Appendices
Appendix A: Asset and technology inventory
| Asset | Technology observed | Source |
|---|---|---|
Example: portal.example.com | [Web server], [front-end framework] | Response headers, page source |
| [Asset] | [Technology] | [Source] |
Appendix B: Evidence index
| Ref | Finding | Description | Stored at |
|---|---|---|---|
| Fig. 1 | F-01 | Request and response pair, redacted | [Secure evidence store path] |
| Fig. 2 | F-02 | Screenshot of script execution | [Path] |
| Table 3 | F-03 | Login attempt timings | [Path] |
Appendix C: Test accounts and clean-up
| Account or artefact | Created for | Removed on |
|---|---|---|
cust-a@test, cust-b@test | Authorisation testing | YYYY-MM-DD |
| Test support tickets with payloads | F-02 | YYYY-MM-DD |
Appendix D: Glossary
| Term | Meaning |
|---|---|
| IDOR | Insecure direct object reference |
| CVSS | Common Vulnerability Scoring System |
| CWE | Common Weakness Enumeration |
| CSP | Content Security Policy |
Standard and licence note
Based on the engagement phases of the Penetration Testing Execution Standard (PTES, pentest-standard.org); phase names are used as references only. Test categories are taken from the OWASP Web Security Testing Guide (owasp.org/www-project-web-security-testing-guide), copyright the OWASP Foundation, licensed under Creative Commons Attribution-ShareAlike 4.0 (https://creativecommons.org/licenses/by-sa/4.0/); the adapted category structure in section 3.2 is shared under CC BY-SA 4.0. Severity uses CVSS from FIRST (first.org/cvss). Weakness IDs are from MITRE CWE. All other text is original and written for this collection under the MIT licence. This template is for documenting authorised security testing only.
Схожі шаблони
Test Completion Report Template (ISO/IEC/IEEE 29119-3)
Test completion report: criteria evaluation, deviations, metrics with defect density, outstanding defects, residual risks, sign-off
Тестування та якістьAccessibility Evaluation Report Template (WCAG-EM)
WCAG-EM evaluation report: scope, exploration, page sample, results for all WCAG 2.2 A and AA criteria, issues, conformance claim
Тестування та якістьCode Review Checklist Template
Team code review agreement: roles, checklist from correctness to security and i18n, comment labels, PR size limits, review SLA