Penetration
Testing Reports
Evidence / impact / repair
Scope & readers

Write penetration testing reports that people can act on

In the record

A penetration testing report is the durable record of an authorized assessment: what was in scope, what the testers attempted, what they observed, and what the organization should do next. Its job is to support decisions and repairs after the testing session has ended.

A useful report serves several readers without forcing them through the same level of detail. Leadership needs the consequences and decisions. Engineers need evidence, affected components, and a way to check a fix. A later reviewer needs the dates, scope, limitations, and status history. This guide works through those needs using an original, illustrative finding.

Read the boundaries before the findings

Start with the assessment dates, target environment, assets, accounts, and exclusions. A report about a staging build does not automatically describe production. A test with an ordinary user account does not establish what an administrator could do. A clean result for one API does not cover an untested companion application.

The scope section should identify the version or build where practical, the access provided, the testing window, and restrictions that affected the work. If testers could not authenticate, could not reach an endpoint, or had to stop a test, the report should preserve that limitation.

NIST SP 800-115 addresses planning and conducting technical assessments, analyzing findings, and developing mitigation strategies. It is a useful foundation for treating reporting as part of an assessment process rather than a decorative PDF delivered at the end.

When reviewing a report, ask a narrow question: does its conclusion stay within the evidence and access the team actually had? “No issue found in the tested workflow” is more informative than a broad declaration that the application is secure.

Give each reader a useful entry point

An executive summary should explain the important failure paths, affected business activities, and immediate decisions. It does not need payloads or every informational observation. Avoid replacing those decisions with a count of red, orange, and yellow findings.

The technical findings should contain the material needed to assess and repair each issue. An appendix can hold supporting inventories, methodology details, or carefully controlled evidence that would interrupt the main reading path. A remediation table should identify owners and status without pretending that a table entry alone verifies a fix.

There is no single page count that makes a report complete. A short assessment with one well-supported issue may produce a short report. A broad engagement may need several distinct technical sections. Organize around the decisions and evidence, not around making every report the same length.

An illustrative finding: another tenant's export can be read

The following is an invented staging scenario for teaching report construction. It does not describe a test performed on a real organization. The tenant names, record names, and identifiers are synthetic.

The claim

A signed-in member of Maple can retrieve a private export belonging to Quarry by requesting that export's identifier.

This title names the actor, action, and boundary that failed. It is more useful than “Broken access control,” which identifies a category but leaves the reader to discover the consequence.

The context

The example application gives each tenant private exports. A normal member should be able to read exports belonging to their own tenant and should be denied access to another tenant's exports. The assessment uses two ordinary-member accounts and two synthetic files in a staging environment.

The report should record the exact affected build, route, role, and evidence references. In an actual engagement, those are factual fields to fill from the test record. Inventing them to make a report look finished would weaken the evidence.

The reproduction record

  1. Create or identify the approved synthetic export owned by Maple and the one owned by Quarry.
  2. Sign in with the Maple ordinary-member test account and confirm that its own export is readable.
  3. Using the same Maple session, make the agreed request for Quarry's synthetic export.
  4. Record whether the application returns Quarry's file or denies access.
  5. Compare the content and tenant ownership with the controlled test records.

The report should attach redacted request and response evidence to those steps. A status code without the returned content is ambiguous. A screenshot without the account context may show a legitimate owner reading their own document. Both can support a finding when tied to the same session, object, and expected rule.

What the example establishes

If the described response contains Quarry's private synthetic export under Maple's ordinary-member session, the evidence supports a cross-tenant read in that tested workflow. It does not, by itself, prove that the tester could modify exports, access every tenant, or compromise the database.

That distinction belongs in the impact statement. Explain the observed capability first. Then identify plausible wider consequences as unverified questions requiring additional authorized work. Do not turn a reasonable concern into an observed result.

The repair direction

The engineering task is to enforce the caller's permission to the requested export on the server. Hiding the export link from the interface would not address a direct request. OWASP's Authorization Cheat Sheet recommends checking permissions on every request and includes guidance about protecting resources from identifier-based access failures.

The report should also identify related paths worth reviewing: file previews, download links, alternate API versions, or background export jobs. These are follow-up checks, not automatically confirmed instances of the same problem.

The retest criteria

The repair is ready for verification when the permitted owner can still retrieve its export and the unrelated tenant is denied. Record the new build, the same relevant roles, the tested paths, and the result. Check any related variants included in the agreed retest scope.

The outcome should say what was verified. If only one route was retested, do not close every related concern on the strength of that request. If a temporary control blocks the route while the permanent repair is unfinished, record the mitigation and remaining work separately.

Keep the severity explanation beside the score

A numeric rating should be accompanied by its reasoning. State the access required, interaction needed, affected data or operations, and the consequence supported by the evidence. Describe environmental assumptions that change the priority.

If the report uses CVSS, record the version, vector, and score together. FIRST's CVSS v4.0 specification defines the metric groups and vector representation. A number copied without its inputs is harder to review or reproduce.

For the illustrative export finding, this guide deliberately does not invent a CVSS score. The impact of a private export depends on its contents, the conditions required to retrieve it, and the assessment's evidence. A report should establish those facts before presenting a precise rating.

Business priority is another decision. A small amount of highly sensitive information and a large amount of public data have different consequences. Keep the organization's prioritization rationale visible rather than silently changing a technical score to express urgency.

Show the chain when findings depend on one another

Some assessments demonstrate a sequence: one weakness provides access that enables a second action. Explain the prerequisites and transitions. Link the individual finding identifiers so a reader can distinguish independent weaknesses from steps in the same path.

For example, a report might establish that a low-privilege user can obtain a token and then use that token against another service. The report needs evidence for both operations and for the token's role in connecting them. Two unrelated screenshots do not establish that sequence.

Also explain how a proposed repair interrupts the path. Fixing the first step may remove the demonstrated route while leaving the second service's independent authorization failure intact. The remediation plan should identify each required change and the tests that would verify it.

Make uncertainty and exclusions readable

Reports lose value when unknowns are buried in a generic legal paragraph. Put a material limitation near the conclusion it affects. If an unavailable service prevented validation of a suspected issue, mark it unconfirmed and state what evidence is missing.

Keep these outcomes distinct:

Outcome What the record should establish
Confirmed finding The observed behavior, affected scope, and supporting evidence
Unconfirmed observation Why it may matter and what prevents confirmation
Not tested The missing access, exclusion, interruption, or other reason
Retest passed The corrected behavior observed in the identified retest scope
Risk accepted The decision owner, rationale, conditions, and review date

A report with no confirmed findings can still be useful if it accurately describes meaningful tests and their limits. It should not become a certificate that no vulnerability exists.

Turn the report into an owned repair record

After delivery, assign an engineering owner to each accepted finding. Preserve a stable finding ID when moving work into another system. Keep the original evidence, agreed action, due date or review date, and any dependency on another team.

Ask engineers to define acceptance criteria before closing the issue. “Updated the library” is a change record; “the affected build now contains the corrected version and the relevant check passed” is closer to verification. For an application logic flaw, the acceptance criteria need to describe the behavior that must be allowed and the behavior that must be denied.

Do not erase the original report when a fix lands. Add a retest entry or a new version showing what changed, when it was checked, and by whom. A reader should be able to tell which conclusions came from the initial assessment and which came from later verification.

Share the right report with the right audience

A full report can contain credentials, internal addresses, personal information, architecture details, and working reproduction material. Decide who needs that detail and use an appropriate delivery channel. Redact secrets while keeping enough context for authorized reviewers to understand the finding.

A customer-facing summary may answer a different question: which service was assessed, when, by whom, and whether material findings have been addressed. Keep it consistent with the underlying report. Removing sensitive technical detail should not expand the scope or remove a limitation that changes the conclusion.

When studying public sample reports, pay attention to what was omitted as well as what was published. A sample is evidence of one reporting format. It is not permission to copy a real customer's finding into a new engagement or to imply that the same test occurred elsewhere.

Use a finding template without letting it write the conclusion

The downloadable finding template provides fields for the claim, context, evidence, limits, repair direction, and retest. It leaves factual values blank so the author must supply the actual assessment record.

Before delivery, have someone unfamiliar with the test try to answer three questions from each finding: what can the wrong actor do, what evidence supports that conclusion, and what would demonstrate that the repair works? Missing answers are a reason to improve the finding, even when the rest of the report looks polished.

Continue reading

Cite this entry

Penetration Testing Reports. “Write penetration testing reports that people can act on.” Reviewed November 12, 2026.
https://penetrationtestingreports.com/category/