After the pentest
How to read a penetration testing report, section by section
How to read a penetration testing report section by section: the 13 parts, an annotated sample finding, severity versus priority, and how to plan fixes.
Short answer
Read a penetration testing report in this order: the executive summary and priority actions, the findings at a glance, then each finding's impact, evidence and fix. Severity says how bad a flaw is in general. Priority says what your team fixes first, given your system. Reproduce each finding before you close it.
Read the executive summary first, then the findings at a glance, then each finding in order of severity. Treat the report as a work list. Each finding should lead to a fix, a check, and a close-out.
The structure below is that of an Excession Labs report. Other providers use different section names, but the parts are similar. To see the structure with real formatting, open the demonstration report.
What are the sections of a pentest report?#
An Excession Labs report has these sections, in this order:
- Project details: scope, assets and the severity scale.
- Assessment method.
- Safety constraints.
- Evidence labels.
- Executive summary with priority actions.
- Findings at a glance.
- Reproduction environment.
- One section per finding: description, impact, verified results, reproduction, remediation.
- Controls that held.
- Remediation plan.
- Limitations and open questions.
- Evidence index.
- Appendix of reproduction scripts.
What do the first sections tell you?#
The opening sections tell you what the report covers and how far to trust it. Read them before the findings, because they set the limits of every claim after them.
Project details: check the scope. Does the list of assets match what you asked for? Anything not listed was not tested. Check the severity scale and its definitions here too.
Assessment method: this says what the tester did: direct HTTP requests, browser tests, review of client-side code, comparison of anonymous and signed-in users. A black box report and a grey box report mean different things. See black box, grey box and white box testing.
Safety constraints: this lists what the tester did not do, how risky tests were bounded, and which test-owned accounts and records were used.
Evidence labels: "Observed" means the tester reproduced it. "Browser-observed" means it was shown in a real browser. A path labeled as inferred was not proven, so do not treat it as confirmed.
How do you read the executive summary and findings at a glance?#
The executive summary gives the overall picture and the priority actions. Use it to brief management. The findings at a glance table lists every finding with its ID, title and severity. Use it to build your ticket list.
Check that the summary agrees with the table. If the summary says "two high findings", the table should show two. A report that disagrees with itself needs a question to the tester.
What is in a finding?#
Each finding has five parts. Read all five before you open a ticket.
| Part | What it tells you | What to check |
|---|---|---|
| Description | What the flaw is, in plain words | Can your team name the affected feature? |
| Impact | What an attacker gains | Does it match your data and users? |
| Verified results | The evidence | Requests, responses, timestamps, read-back from a second account |
| Reproduction | Steps to see it yourself | Can a developer follow them? |
| Remediation | How to fix | Does the fix match your stack? |
The verified results part is the proof. A bare "success" response is not proof: a write is proven when the changed record is read back through another session, so look for that read-back.
An annotated sample finding#
Demonstration only
This is a demonstration. No real customer system was tested. "Harbor Notes" is a fictional app and app.example.com is a reserved example host.
F-02: Any signed-in user can read another tenant's notes (High)
Description. The GET /api/notes/{id} endpoint checks that the caller is signed in. It does not check that the note belongs to the caller's tenant.
Impact. A user in tenant A can read any note in tenant B by guessing or enumerating numeric IDs. Notes may hold customer data.
Verified results. Observed. With Bob's session (tenant B), a request for note 4021, created by Alice (tenant A), returned HTTP 200 and Alice's content.
Controls. A request for a nonexistent ID returned 404. A request with no token returned 401. A request with Bob's token for Bob's own note returned 200. So the server checks identity but not ownership.
Reproduction. Sign in as the test user in tenant B. Send the request below with the ID of a note that belongs to tenant A.
GET /api/notes/4021 HTTP/1.1
Host: app.example.com
Authorization: Bearer <tenant B test token>
Remediation. Load the note with the tenant ID in the query. Return 404 when the note is not in the caller's tenant. Add a test that fails when a second tenant can read the note.
What is the difference between severity and priority?#
Severity is the tester's rating of how bad a flaw is in general. Priority is your decision on what to fix first.
Severity comes from a written scale. Excession Labs uses four levels: Critical, High, Medium and Low, each with a written definition. CVSS vectors are not added by default. If your program needs CVSS, say so during scoping. For reference, FIRST's CVSS v4.0 qualitative bands are Low 0.1 to 3.9, Medium 4.0 to 6.9, High 7.0 to 8.9 and Critical 9.0 to 10.0.
Priority adds your context:
- Exposure: is the endpoint public or internal?
- Data: does it touch customer data, money or credentials?
- Effort to fix: a one-line fix can go first even at Medium.
- Chains: two Medium findings may combine into a High impact. The report may say so.
- Deadlines: a customer review or audit date can raise priority.
Write your priority next to the tester's severity. Keep both.
How do you reproduce a finding?#
Run the reproduction steps in a test environment with a test account. Reproduction shows that your team understands the flaw and gives you a before-and-after check for the fix. Follow these rules:
- Run scripts only with authorization and only with test-owned identifiers.
- Prefer a staging copy. Reproduction scripts are read-only where possible, but check each one.
- Save the output before the fix and after the fix.
- If you cannot reproduce a finding, do not close it. Tell the tester and share your environment details, because the tester may have used a state you do not have.
What are "controls that held"?#
This section lists protections that the tester tried to break and could not. Keep these controls working when you change code: a fix for one finding must not remove a control that held. Turn them into regression tests.
How do you use the remediation plan?#
The remediation plan puts the fixes in order. Use it as the base of your backlog, then add owners and dates.
Our guide to after the pentest: remediation and retest gives a full workflow. When fixes are done, ask for a retest. See retesting.
What do limitations and the evidence index mean?#
The limitations section states what the tester could not check or could not confirm. An open question is neither a confirmed issue nor a clean result, so decide whether to scope it into the next test.
The evidence index lists saved requests and responses with timestamps. Key evidence can carry a SHA-256 manifest, so you can check that files were not changed. Keep these files with the report, because auditors and customers may ask for them.
What should you check before you share the report?#
Check that it does not contain secrets, live tokens or customer data, and check your contract for confidentiality terms. For customers, consider a shorter summary or an attestation letter. The PCI SSC guidance says its report outlines "are only suggested outlines and do not define specific reporting requirements for PCI DSS penetration tests". Ask your auditor what they need.
Judge us by the report
Every finding comes with the request, the response, the impact and a fix. See the demonstration report.
Questions
How long should a pentest report be?
Length depends on scope and the number of findings. Do not judge quality by page count. Judge it by whether each finding has evidence, reproduction steps and a clear fix, and whether the scope and limits are stated.
What if I disagree with a severity rating?
Ask the tester to explain the rating. Severity scales have written definitions, so you can compare the finding to the definition. If your context changes the risk, record your own priority. Do not edit the tester's severity.
Do I need CVSS scores in the report?
Only if a customer, auditor or program asks for them. Excession Labs does not add CVSS vectors by default. Tell your provider during scoping if you need them.
Can I share the full report with a customer?
A full report holds sensitive detail about open weaknesses. You can share a shorter summary or an attestation letter instead, or share the report under an NDA after the fixes. Decide before you share, and check your contract.
Sources
- FIRST: Common Vulnerability Scoring System v4.0 specification (qualitative severity ratings) (checked 9 November 2026)
- PCI SSC Information Supplement: Penetration Testing Guidance v1.1 (report outlines, section 5.2) (checked 9 November 2026)
- NIST SP 800-115: Technical Guide to Information Security Testing and Assessment (checked 9 November 2026)