PoC vs scanner output — the practical difference

A scanner finds a potential SQL injection by detecting a timing difference in the response. It flags the parameter. A PoC actually extracts a row from the database using that parameter. One is "this might be vulnerable." The other is "here is the data we pulled out."

The triage consequence is significant. A finding without a PoC requires your engineering team to reproduce and confirm the issue before they can assess its actual risk — is this exploitable in our configuration? What does the attacker actually get? With a working PoC, they run it once to confirm, then move to the patch. Without one, they may spend days determining whether the finding is real before the remediation sprint starts. In environments with long change management cycles, that delay compounds.

False positive rates are also a real operational problem. Enterprise-grade vulnerability scanners produce significant false positive rates on web applications — 20 to 40 percent is common across engagements where we have validated scanner output manually. Every false positive is engineering time spent chasing a finding that does not exist. A pentest report with working PoCs has a false positive rate near zero, because every finding in the report was manually confirmed before it was written. If the tester could not reproduce it with a working PoC, it did not make it into the report.

Risk assessment accuracy is a third dimension where PoCs matter. A CVSS score without a PoC is a theoretical score applied to a theoretical vulnerability. CVSS v4.0 separates exploitability metrics (does a working exploit exist? is it publicly available?) from impact metrics (what does exploitation yield?). A finding with a working PoC informs both axes with actual data from your environment: the exploit exists, it works in your specific configuration, and here is what it produces. Without the PoC, the exploitability assessment is the tester's judgment about a pattern they observed, not a demonstrated outcome. The scores will look similar on paper; the accuracy is different.

There is also a communication benefit that shows up later in the process. When an engineering manager asks why a critical-severity finding is actually critical, the PoC is the answer. Not "the scanner assigned it a CVSS 9.8" — "here is the request, and here is what we got back." That conversation is faster and produces less friction in prioritization.

Using the PoC during remediation

A working PoC is not just evidence of the finding — it is the test case for the fix. When your developer applies a patch, the right first check is to run the PoC against the patched version and see whether it still succeeds. If it does, the fix is incomplete or applied to the wrong layer. If the PoC fails as expected — the payload returns a 403, the injected value is escaped, the over-privileged role no longer exists — that is a positive signal the patch is in the right direction.

Running the PoC yourself is a useful sanity check before the formal retest. Developers who verify their own patches against the PoC before submitting for retest find incomplete fixes faster and reduce the number of round trips in the retest cycle. The PoC is specific enough to test precisely: it is not "try to access someone else's data," it is "send this exact request with these exact parameters and check whether this exact response comes back."

During the formal retest, the pentest.systems engineer runs the original PoC plus variations — different accounts, different parameter values, the same technique applied to adjacent endpoints — to confirm the fix is not just patching the specific instance but addressing the underlying issue. A fix that blocks the original PoC but leaves similar endpoints unpatched is a partial fix. The retest is designed to catch that distinction. See what every engagement includes for how the retest is structured as a standard deliverable, not an add-on.