Benchmarks
Public benchmark results.
Raw results are linked below. View the current VulnerableApp JSON.
Results
| Benchmark | Result |
|---|---|
| ZAP WAVSEP — positive cases | 1 210 / 1 210 |
| ZAP WAVSEP — negative cases | 40 / 40 silent |
| Google Security Crawl Maze | 85 / 85 scored · 6 excluded |
| SekuScan crawler traps ours | 10 / 10 |
| OWASP VulnerableApp | 145 / 154 · 94.2% |
ZAP WAVSEP
zaproxy/wavsep, the ZAP team’s fork of sectooladdict/wavsep
Positive cases
| Category | Detected |
|---|---|
| LFI | 816 / 816 |
| SQLi | 135 / 135 |
| RFI | 108 / 108 |
| Reflected XSS | 91 / 91 |
| Open redirect | 60 / 60 |
| Total | 1 210 / 1 210 |
Negative cases
| Result | Cases |
|---|---|
| Stayed quiet | 38 |
| A different, real bug the corpus does not score | 2 |
| False positive | 0 |
| Total | 40 |
- 40 is the corpus’s own negative denominator: 8 LFI, 6 RFI, 7 reflected XSS, 10 SQLi, 9 open redirect. The app also ships 4 backup-file look-alikes, which the ZAP team does not score either — there is no such section in their published results, and whether a served page is a forgotten leftover is not observable over HTTP.
- The two disputed cases are exposures we found that the corpus files under
a different name. On one, the target fetched a URL we supplied and our
callback fired — that is SSRF; the case is scored for remote file
inclusion, which did not occur. On the other,
/WEB-INF/web.xmlanswers 404 when requested directly and comes back in full through the parameter; the case is scored for OS path traversal, which did not occur. WAVSEP’s own documentation says “out of scope” exposures should be ignored when scoring, so we report them and count neither as a detection.
71,966 requests · ≈ 4 h*
Google Security Crawl Maze
85 / 85 scored cases found.
- 6 cases excluded: the deployment does not serve them (Angular, Polymer and React framework routes). Excluded from the denominator, not counted as misses.
230 requests · ≈ 1 min*
OWASP VulnerableApp
145 / 154 · 94.2%
- 8 expected findings missed. Six of the nine are cases the target’s own fixture cannot satisfy — a seeded password hash that is not the hash of the seeded password, an XSS case whose sinks are both escaped, a traversal case made impossible by the upload resolver that level uses, and a weak-random case pointed at the one level using a secure generator. Two more we decline because our evidence names a different weakness than the answer key does. Against the 148 rows that are actually reachable, this is 145.
- Graded by the project’s own
/scanner/benchmarkharness. - 346 findings sent; 181 were not credited by the answer key (not a false-positive count).
- Measured 2026-09-20 against engine
7166b5a; 0 check failures.
47 954 actions · 47 251 probes · 42 min 27 s
Selected vulhub targets
Selected targets only; no aggregate score.
| CVE / issue | Software | Check |
|---|---|---|
| CVE-2018-7600 “Drupalgeddon2” | Drupal | injection/drupal_render |
| CVE-2021-22205 | GitLab (ExifTool) | injection/gitlab_exiftool |
| S2-045, S2-059, S2-061 | Apache Struts 2 | injection/struts_ognl |
| CVE-2024-27956 | WordPress Automatic | injection/wp_automatic_sqli |
| CVE-2026-63030 | WordPress (batch) | injection/wp_batch_sqli |
| CVE-2024-6624 | WordPress JSON API User | auth/wp_json_api_user_privesc |
| CVE-2020-25213 | WP File Manager | upload/unauth_connector |
| Magento 2.2 SQL injection | Magento | injection/sqli |
Raw results
* The ZAP WAVSEP and Crawl Maze runs above were
measured on 2026-09-09 against engine a2b55e7 with a clean
tree. The VulnerableApp run was measured on 2026-09-20 against engine
f99b6a0, also on a clean tree, and its duration above is
recorded rather than derived; its raw JSON carries the full provenance
stamp, including request cost. Durations marked
≈ for the older runs are derived, not recorded: the harness
did not time those runs, so each figure is the request count over the
median throughput of 4.8 operations per second measured across 47 other
runs.