HelixML

Free tool · Security

Penetration test report template

Fill in scope, methodology and findings; the report builds as you type, with a CVSS v3.1 score for each finding. Export Markdown, PDF or HTML. Nothing leaves your browser.

Filled in with an example. Edit it, or start blank. Drafts are saved in your browser only.

Web Application Penetration Test Report

ClientExample Corp
Prepared byYour security team
AuthorsA. Tester, B. Reviewer
Report date5 November 2026
Version1.0
Test window27–31 October 2026
ApproachGray box
ClassificationConfidential

1. Executive summary

We tested the customer web application and its REST API between 27 and 31 October 2026, with two ordinary customer accounts. The most serious issue lets anyone forge an administrator session token, which exposes every customer record. Fixing token validation (F-01) and the access-control gap on order history (F-02) removes the paths to customer data we found.

Overall risk: Critical

SeverityFindings
Critical1
High0
Medium1
Low0
Informational0

2. Scope and rules of engagement

In scope

  • https://app.example.com
  • https://api.example.com/v2
  • Two customer test accounts supplied by Example Corp

Out of scope

  • Third-party payment provider
  • Denial-of-service testing
  • Social engineering and physical access

Rules of engagement

  • Testing window: 27–31 October 2026, 09:00–18:00 UTC
  • Source IPs: 203.0.113.10, 203.0.113.11
  • No data modification beyond the supplied test accounts
  • Stop and notify the client contact on any sign of a prior compromise

Contacts

  • Client: Jane Doe, Head of Engineering, security@example.com
  • Testing lead: A. Tester, +44 20 0000 0000

3. Methodology

  • OWASP Web Security Testing Guide (WSTG) v4.2
  • OWASP API Security Top 10 (2023)
  • NIST SP 800-115

Unauthenticated and authenticated reconnaissance, then targeted testing of authentication, session management, access control, injection, business logic and client-side issues. Every finding was reproduced a second time from a clean session before it was reported.

Limitations

The external OAuth login flow was outside the test window and was not tested.

4. Findings summary

IDFindingSeverityCVSSStatus
F-01Server accepts unsigned JWTs (alg=none), allowing admin token forgeryCritical9.1Open
F-02Order history readable for any customer by changing the basket IDMedium6.5Fixed (retest passed)

5. Detailed findings

F-01: Server accepts unsigned JWTs (alg=none), allowing admin token forgery

SeverityCritical
CVSS9.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
Affectedhttps://api.example.com/v2 (all authenticated endpoints)
StatusOpen

Description

The API accepts JSON Web Tokens whose header sets "alg": "none" and whose signature is empty. The server reads the claims without verifying a signature, so a client can choose any user ID and role.

Impact

An unauthenticated attacker can act as any user, including administrators, and read or change every customer record.

Steps to reproduce

  1. Log in as a customer and copy the session JWT.
  2. Decode it, set the header to {"alg":"none","typ":"JWT"} and the role claim to "admin".
  3. Re-encode it with an empty signature and send GET /api/v2/users with it.
  4. The server returns 200 and every user record.

Evidence

Request and response captured as F-01-evidence.txt (tokens redacted).

Remediation

Verify every token's signature with a fixed allow-list of algorithms (for example RS256 only) and reject alg=none. Rotate signing keys after the fix.

References

  • https://cwe.mitre.org/data/definitions/347.html
  • https://owasp.org/www-project-web-security-testing-guide/

F-02: Order history readable for any customer by changing the basket ID

SeverityMedium
CVSS6.5 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N)
AffectedGET /api/v2/baskets/{id}
StatusFixed (retest passed)

Description

The endpoint returns a basket for any numeric ID without checking that it belongs to the logged-in user (insecure direct object reference).

Impact

Any logged-in customer can read other customers' orders, delivery addresses and partial payment details.

Steps to reproduce

  1. Log in as customer A and note basket ID 6.
  2. Request GET /api/v2/baskets/7 with customer A's session.
  3. The response contains customer B's basket.

Evidence

Screenshots F-02-a.png and F-02-b.png.

Remediation

Check ownership on the server for every object lookup, and return 404 for objects the user does not own.

References

  • https://cwe.mitre.org/data/definitions/639.html

6. Retest results

IDStatusRetest dateNotes
F-02Fixed (retest passed)4 November 2026The endpoint now returns 404 for other customers' baskets.

Appendix A: Severity ratings

Severities follow the CVSS v3.1 qualitative scale.

SeverityCVSS v3.1 base score
Critical9.0–10.0
High7.0–8.9
Medium4.0–6.9
Low0.1–3.9
Informational0.0

Appendix B: Tools

  • Burp Suite Professional
  • ffuf
  • sqlmap
  • Custom scripts

What a penetration test report contains

Short answer

A penetration test report records what was tested, what was found, how bad it is and how to fix it. The standard sections are an executive summary, scope and rules of engagement, methodology, a findings summary, a detailed write-up of each finding with reproduction steps and remediation, and retest results. Severity is usually a CVSS score.

The template above produces that structure. If you want to see a finished one first, read the full report from our OWASP Juice Shop engagement: 67 findings, each with the request and response that proves it.

What to write in each section

Document control

Client, testing company, authors, version, report date, test window, approach (black, gray or white box) and classification. An auditor checks the test window against the date the change they are auditing went live, so put exact dates.

Executive summary

Two or three short paragraphs for someone who will not read the rest: what was tested, the most serious risk in business terms, and the one or two fixes that remove most of it. "Anyone can read every customer's orders" gets a fix funded. "IDOR on /api/v2/baskets" does not.

Scope and rules of engagement

List every host, URL, IP range, application and test account in scope, and state what was excluded. The rules of engagement record the test window, source IP addresses, techniques that were not allowed (denial of service, social engineering) and when testers had to stop and call. This section is the evidence that the test was authorised.

Methodology and limitations

Name the standards followed, such as the OWASP Web Security Testing Guide or NIST SP 800-115, and say in a few sentences how the test ran. Then list what you could not test and why. Our Juice Shop report listed the parts it could not reach, including the login rate limiter's keying and the external OAuth flow.

Findings

Open with a table of every finding, sorted by severity, with its status. Then give each finding its own write-up: title, severity and CVSS vector, affected assets, description, impact, numbered steps to reproduce, evidence and a specific fix. Another tester should be able to follow the steps and see the same result.

Retest results

After the client fixes the issues, record the retest date and outcome for each finding: fixed, partially fixed or risk accepted. Compliance reviewers often want this evidence as much as the original findings.

Rating severity with CVSS

The Common Vulnerability Scoring System (CVSS), maintained by FIRST, turns eight properties of a vulnerability into a 0 to 10 base score. The template computes it with the CVSS v3.1 specification's equations, including its rounding rule, and maps it to the specification's rating scale:

Scroll for more columns →

RatingCVSS base score
Critical9.0–10.0
High7.0–8.9
Medium4.0–6.9
Low0.1–3.9
None (Informational)0.0

The base score describes the vulnerability, not your business. Exposure, the data at risk and compensating controls decide what to fix first, so say so in the impact section when the score overstates or understates the risk. CVSS 4.0 uses the same bands. Paste a 4.0 vector into a finding and the template keeps it as written; pick the severity yourself.

An example finding, written up

This is the first finding in the template's example. It is based on the forged admin tokens our Juice Shop engagement found, rewritten for a fictional app.

F-01 · Critical · CVSS 9.1

Server accepts unsigned JWTs (alg=none), allowing admin token forgery

Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Affected
https://api.example.com/v2 (all authenticated endpoints)
Description
The API accepts JSON Web Tokens whose header sets "alg": "none" and whose signature is empty. The server reads the claims without verifying a signature, so a client can choose any user ID and role.
Impact
An unauthenticated attacker can act as any user, including administrators, and read or change every customer record.
Reproduce
  1. Log in as a customer and copy the session JWT.
  2. Decode it, set the header to {"alg":"none","typ":"JWT"} and the role claim to "admin".
  3. Re-encode it with an empty signature and send GET /api/v2/users with it.
  4. The server returns 200 and every user record.
Fix
Verify every token's signature with a fixed allow-list of algorithms (for example RS256 only) and reject alg=none. Rotate signing keys after the fix.

Mistakes that make a report hard to act on

  • Pasting scanner output as findings. A scanner reports what might be wrong. A finding shows that it is, with the request and response.
  • Steps that only the original tester can follow. "Intercept the request and change the ID" leaves out which request, which ID and what came back.
  • Severity with no reasoning. Two testers can score the same bug differently. Our two Juice Shop runs disagreed on the severity of five bugs both found, and we settled each one by checking the evidence. Write down why you chose the rating.
  • Remediation that says "validate input". Name the check, where it goes, and how to confirm it worked.
  • No list of what was not tested. Without it, a reader assumes everything in scope was covered.

Frequently asked questions

What should a penetration test report include?

An executive summary, the scope and rules of engagement, the methodology and its limitations, a findings summary table, and a detailed write-up of each finding with severity, affected assets, reproduction steps, evidence and remediation. Add retest results once fixes are checked. The template above has all of these sections.

How is the severity of a pentest finding rated?

Most reports use CVSS. The template computes a CVSS v3.1 base score from the vector you enter. It maps the score to FIRST's scale: Critical 9.0 to 10.0, High 7.0 to 8.9, Medium 4.0 to 6.9, Low 0.1 to 3.9, and None (Informational) at 0.0. CVSS 4.0 vectors are kept as written, and you choose the severity.

Who reads a penetration test report?

Three groups. Leadership reads the executive summary to decide what to fund. Engineers read each finding to reproduce and fix it. Auditors and customers read the scope, methodology and retest results as evidence for SOC 2, ISO 27001 or a security questionnaire.

Is my report uploaded anywhere?

No. The template runs in your browser. Drafts are saved to your browser's local storage so they survive a reload, and the Markdown, HTML and PDF files are generated on your device.

Should I use CVSS v3.1 or CVSS 4.0?

Use whichever your client or auditor asks for. CVSS 4.0 was published by FIRST in November 2023 and keeps the same severity bands, but many scanners, ticketing systems and compliance templates still expect v3.1 scores.

Can someone write this report for me?

Helix Cyber runs the test and delivers the report: black box $3,000, gray box $4,000, white box from $7,000, with free retests. Every finding is reproduced by a second agent before it is written up.

Helix Cyber

Get the test and the report done for you

Helix Cyber runs penetration tests with AI agents under human oversight. A second agent reproduces every finding before it reaches the report, and retests are free. Black box $3,000, gray box $4,000, white box from $7,000.