The same structure can drive change in an engineering team — or sit unread in a SharePoint folder. The difference is craft.
Raw Nessus / Qualys output pasted with a cover page. No triage, no analysis, no environmental adjustment. False positives sit alongside real findings.
Why it fails: the client paid for analysis, not log forwarding.
Each finding is a copy of the NVD advisory. No context about how the CVE manifests in this environment; remediation is the generic CVE suggestion.
Why it fails: any reader could look up CVEs. The tester's value is the application to the specific environment.
Terminal or browser screenshots without captions, context, or surrounding analysis. The reader has to guess what command produced the output and what to conclude.
Evidence without framing is not evidence.
A list of tools and commands used during the engagement presented as findings: "Nmap was run. Burp Suite was used. Nessus completed in 4 hours."
Process documentation is not findings. The client cares what was discovered, not what was run.
30 findings, 25 marked Critical. No environmental adjustment, no compensating controls considered.
When everything is Critical, nothing is. The client learns to discount the tester's severity ratings entirely.
"It may be possible that an attacker could potentially be able to exploit X, depending on conditions, which would result in a possibly significant impact."
The reader cannot extract a position. Hedging beyond what evidence requires is a failure of professional judgement.
Cart.objects.raw(...) calls in cart/views.py (lines 47–53) with parameterized querysets. The same pattern appears in orders/views.py lines 134–139; review both."
| Avoid | Use instead |
|---|---|
| "The development team failed to implement basic security controls" | "The application is missing input validation at the affected endpoints" |
| "We owned the domain in two hours" | "Domain compromise was achieved within the engagement window via the path described in Section 4" |
| "A skilled attacker could leverage this to devastating effect" | "If exploited, this vulnerability would allow read access to the customer-data table, containing approximately N records" |
| "We got root real quick" | "Local privilege escalation to root was achieved in approximately 8 minutes" |
Reports are read by the people who built the system. Frame findings about systems, not people.
Finding 7 — XSS | Severity: High
The application has cross-site scripting. According to OWASP, XSS is a category of vulnerability where untrusted input is rendered in users' browsers. We found XSS on the search page.
Remediation: Validate and encode all input.
References: OWASP Top 10 A03.
F-007 — Reflected XSS in product-search endpoint enables session hijacking of authenticated users
Severity: High (CVSS 3.1: 7.4 — AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N)
Affected: https://app.example.com/products/search?q=…
The q parameter is reflected without contextual output encoding. The permissive CSP ('unsafe-inline') allows inline script execution. The session cookie lacks HttpOnly; the XSS payload can therefore exfiltrate it.
Remediation: Remove |safe from templates/search.html line 23. Set SESSION_COOKIE_HTTPONLY = True in settings/production.py.
Write with the retest in mind.
Mature testing organizations require peer review before delivery. A second tester reads the report, checks evidence against claims, raises ambiguities, catches errors.
A junior tester who self-edits is producing a draft. Senior review on every report accelerates development. The habit, once built, persists into senior practice.
Walk through how you would peer-review a colleague's report. What do you check, in what order?
(1) Executive summary — does it pass the 10-minute test? (2) Scope & methodology — accurate; limitations honest? (3) Per finding: title conveys impact? evidence supports claim? severity defensible? remediation actionable? reproduction complete? (4) Attack narrative — does it land? ATT&CK consistent? (5) Prioritisation — top recommendations actually doable? (6) Tone and style — moralizing, hedging, casual language. (7) Reproducibility test — pick one finding, mentally reproduce from the text alone.
The report is the engagement. Make it worth reading.