Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
dynast-bench — A DAST benchmark of intentionally-vulnerable apps with ground-truth answer keys for scoring scanners | Kitploit
Инструменты/GitHubGitHub/j3ssie/dynast-bench
Vulnerability ScannersWeb Vulnerability ScannersAPI Security TestingPenetration TestingLearning & EducationCurated ResourcesLabs & Practice
GitHubj3ssie/dynast-bench

dynast-bench

A DAST benchmark of intentionally-vulnerable apps with ground-truth answer keys for scoring scanners

Репозиторий
4621 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Контент недоступен на запрошенном языке. Показываем английскую версию.

DynAST-Bench

A DAST benchmark of intentionally-vulnerable apps with ground-truth answer keys for scoring scanners.

⚠️ This repository contains DELIBERATELY INSECURE applications. They exist only to benchmark security tooling - DAST scanners, SAST engines, and LLM security agents. Every app binds to 127.0.0.1, ships a LOUD banner, and holds no real data. Never deploy any of this on a public network.

A suite of 19 intentionally-vulnerable apps, one per stack, each with a documented, machine-checkable ground truth. The point is to measure how well a scanner or agent (a) finds the planted bugs, (b) ignores the safe near-miss code sitting right next to them, and (c) doesn't hallucinate findings on the patched twin.

The apps at a glance

19 apps · 549 planted vulnerabilities · 146 near-misses · 546 runnable PoCs · 594 cataloged endpoints. Every app boots on 127.0.0.1:13311, ships a vuln/+safe/ twin pair and a single-image build. prints this table live; prints its endpoint catalog.

--solo
dynast-bench list
dynast-bench surface <app>
AppStackDatastoreVulnsNear-missDocs
aspnetC# / ASP.NET Core Razor PagesSQL Server2812plan
fastapiPython / FastAPI + Jinja2Postgres265plan
ginGo / GinPostgres127readme
golangGo / chiPostgres264plan
graphqlNode / GraphQL 16 API-onlyPostgres316plan
jspJava / JSP + Servlets (Tomcat)Postgres286plan
laravelPHP 8.3 / Laravel 11 + BladeMySQL257plan

Extra sidecars per stack (Mailpit, MinIO, Redis, Jenkins, Prometheus, Ollama, …) are listed in The apps below.

The per-stack design docs live in benchmark-plans/ - start there for the full vulnerability catalog of each app. This README is the operational guide: how the repo is laid out and how to run and score an app.

Vulnerability classes covered

Every planted bug carries a CWE and an OWASP category. Rolled up by class - each bug counted once, under its primary CWE - the planted bugs break down roughly as (rollup last regenerated at 480 bugs; per-app counts above are current):

ClassCWEsBugsApps
Sensitive data exposure (errors, logs, debug endpoints, backups, source)200, 209, 489, 524, 532, 538, 540, 5483916
Default / hardcoded / leaked credentials321, 522, 798, 1104, 13923818
Missing or broken authorization (BFLA, vertical + horizontal)269, 284, 285, 668, 862, 8633718
Cross-site scripting (reflected · stored · DOM)792816
Authentication bypass · weak session · JWT verification287, 288, 290, 306, 347, 384, 613, 614, 13852813
SQL injection (incl. second-order, ORDER BY, NoSQL)89, 9432717
Proxy / parser interpretation conflicts (path confusion, header trust)345, 348, 349, 436, 441, 693, 697, 706, 8072710
SSRF (incl. blind, redirect chains, internal-only sinks)9182017
IDOR / BOLA (user-controlled object key)6391917
Path traversal · LFI/RFI · zip slip22, 981916
Mass assignment / over-posting · prototype pollution915, 13211816
Brute force · missing rate limiting · resource exhaustion307, 400, 406, 674, 7701711
Business-logic, pricing and quota abuse625, 8401514
OS command / argument injection781412
Insecure deserialization (pickle · PHP · Java · YAML)470, 5021411
CORS misconfiguration94214

By OWASP category (2021 Top 10 for the web apps, API Top 10 2023 where the app is API-only):

OWASPBugsOWASP APIBugs
A01 Broken Access Control118API8 Security Misconfiguration21
A03 Injection89API5 Broken Function Level Authorization6
A05 Security Misconfiguration72API1 Broken Object Level/Property Authorization4
A07 Identification & Authentication Failures65API2 Broken Authentication4
A04 Insecure Design34API7 Server Side Request Forgery4
A08 Software & Data Integrity Failures17API9 Improper Inventory Management3
A10 SSRF15API3 Broken Object Property Level Authorization2
A02 Cryptographic Failures15API4 Unrestricted Resource Consumption2
A09 Logging & Monitoring Failures4API6 Unrestricted Access to Sensitive Business Flows1
A06 Vulnerable & Outdated Components3API10 Unsafe Consumption of APIs1

Two non-web tracks sit alongside these: the network app plants 32 host/port and service-level findings for network scanners, and the two LLM apps (llmchat, llmagent) plant prompt-injection, tool-abuse and RAG-poisoning bugs scored on a separate injection-channel track.

Each bug is also tagged with a detection difficulty (118 E, 68 E-M, 202 M, 61 M-H, 100 H), a taint distance (351 in-file, 83 cross-file, 87 cross-service, 28 config) and a reachability (368 pre-auth, 181 user), so recall can be broken down along each of those axes instead of reported as one number. The per-app catalogs live in benchmark-plans/.

Repository structure

root@kitploit:~
dynast-bench/
├── README.md             # you are here - overview, safety, run/score guide
├── examples/             # ready-to-score findings/v1 + endpoints/v1 files
├── Makefile              # top-level runner: list / run / verify / validate / solo any app
├── benchmark-plans/      # per-stack design docs (the vulnerability catalogs)
├── dynast-bench/           # the `dynast-bench` CLI + scorer (Bun/TS)
└── vulnerable-apps/      # the 19 apps - each a separated, self-contained folder
    ├── _template/        # skeleton; copy it to start a new app
    ├── fastapi/  golang/  nextjs/  nestjs/  springboot/
    └── rails/  wordpress/  php/  jsp/  aspnet/  ...

Running apps (dynast-bench CLI)

The CLI is the easiest way to drive the suite - it health-gates boots, arbitrates the shared ports, and speaks --json so a scanner harness can consume it. Needs Bun 1.2+ and Docker.

root@kitploit:~
make install                             # compile the CLI + link it into ~/.bun/bin
                                         # (BIN_DIR=/somewhere/else to pick the dir)

dynast-bench list                        # every app: vulns, PoCs, near-misses, what's up
dynast-bench vulns nextjs                # the planted bugs as a checklist, one title each
                                         # (--full · --near · --ids for a coverage diff)
dynast-bench start nextjs                # build + boot, wait for health, print the URL
dynast-bench verify nextjs               # run the ground-truth PoCs (expect all exploitable)
dynast-bench validate nextjs             # twin loop: vuln all-exploitable → safe all-fixed
dynast-bench status                      # variant, mode, target, health
dynast-bench stop --all                  # stop everything
dynast-bench clean --all --images --yes  # reclaim containers, volumes, networks, images

dynast-bench start nextjs --variant safe # the patched twin (false-positive run)
dynast-bench start --count 5 --parallel  # 5 apps at once, one port each + a summary table
dynast-bench start --all --solo --parallel   # whole fleet, one image + port each
dynast-bench run nextjs -- my-scanner --url '$TARGET'   # start → scan → stop

Full reference: dynast-bench/README.md.

Ports

Everything lives in a quiet slice of the ephemeral range, so the suite doesn't fight the usual 3000/8000/8080/5432 crowd - and every app owns a fixed port, so a URL always means the same app, alone or in a batch of five:

rangewhat
13311–13339the app under test - the URL you point a scanner at, one port per app in list order (aspnet 13311, fastapi 13312, … nextjs 13322)
13340–13484that app's sidecars (mailpit, phpMyAdmin, Jenkins, Prometheus, …), 5 apiece
13500–13599relocation pool

dynast-bench list is the map. If anything is already listening on a port an app owns, dynast-bench start leaves it alone and publishes that one service from the relocation pool instead, then prints (and --json-reports) the real URL. Nothing ever binds beyond 127.0.0.1. dynast-bench doctor shows which app ports are free; make targets don't relocate and publish the compose defaults (13311+) one app at a time, honouring DYNAST_PORT=<n>; --port N pins it.

Running apps (top-level Makefile)

The Makefiles remain the low-level contract and work standalone:

root@kitploit:~
make list                  # show all apps (a [solo] tag = has a single-image build)
make run APP=nextjs        # start via compose (app + datastores)
make verify APP=nextjs     # run its ground-truth PoCs (expect all exploitable)
make validate APP=nextjs   # full twin loop: vuln all-pass -> safe all-fixed
make down APP=nextjs        # stop it
make solo APP=nextjs       # run as ONE self-contained image - no compose needed
make solo-down APP=nextjs  # stop the standalone image
# shorthands: make run-nextjs   make validate-nextjs

Two ways to run every app:

  • Compose (make run) - the canonical multi-service topology the ground truth targets (app + Postgres/Redis/etc. as separate containers).
  • Standalone (make solo) - one self-contained image per app (vuln/Dockerfile.standalone) with the datastores + an internal SSRF sink embedded, so docker build + docker run works with no compose. Behaviour and PoCs are identical (compose service names are aliased to 127.0.0.1).

The root stays deliberately small: this README, the design guide, the shared tooling, and the apps. Everything operational for a given app is inside that app's own folder.

Per-app anatomy

Every app under vulnerable-apps/ has the identical shape:

root@kitploit:~
vulnerable-apps/<stack>/
├── README.md            # LOUD banner + run notes
├── Makefile             # up · reset · safe · verify · score · diff  (uniform interface)
├── vuln/                # the vulnerable variant - this is what you scan by default
│   ├── docker-compose.yml   # independent; binds 127.0.0.1 only
│   ├── app/                 # application source; the planted bugs live here
│   └── db/seed.sql          # seed incl. a cross-tenant user + a weak default cred
├── safe/                # the patched twin - same app, every planted bug fixed
│   ├── docker-compose.yml
│   ├── app/
│   └── db/seed.sql
└── ground-truth/        # the answer key - see "Ground truth" below
    ├── VULNERABILITIES.yaml  # every planted bug
    ├── SURFACE.yaml          # every endpoint the app exposes
    ├── verify/          # one runnable PoC per bug
    └── expected/        # optional golden normalized findings

The vuln/safe twin

Each app ships two separated variant folders rather than git branches or patch files:

  • vuln/ - the app with every planted bug. The default target; what a scanner points at.
  • safe/ - the same app with every planted bug fixed and nothing else changed (parameterized queries, escaped output, added authz, safe deserializers, …).

diff -ru vulnerable-apps/<stack>/vuln vulnerable-apps/<stack>/safe is the ground truth. It must touch exactly the lines named in ground-truth/VULNERABILITIES.yaml and nothing else. Scanning the safe/ variant measures a tool's false-positive rate: every finding there is a false alarm, because the twin is clean by construction.

Because each variant's Docker build context is its own folder (vuln/ or safe/), the app's ground-truth/ sits outside every build context and cannot be baked into an image - the answer key can't leak into the running app, by construction.

Ground truth (ground-truth/)

Two answer keys, because there are two questions. VULNERABILITIES.yaml says what is wrong in the app; SURFACE.yaml says what is there at all.

VULNERABILITIES.yaml records one entry per planted bug:

root@kitploit:~
- id: SQLI-001
  variant_paths:                 # same relative path in both variants
    vuln: vuln/app/routes/search.py
    safe: safe/app/routes/search.py
  symbol: search_posts
  route: "GET /posts/search?q="
  cwe: CWE-89
  owasp: "A03:2021-Injection"
  severity: high                 # info | low | medium | high | critical
  difficulty: E                  # E | E-M | M | M-H | H  (detection difficulty)
  taint: in-file                 # in-file | cross-file | cross-service
  reachability: pre-auth         # pre-auth | user | admin
  near_miss: SAFE-SQLI-001       # id of the safe twin planted nearby
  match:                         # machine anchors for the scorer (generated)
    http: { method: GET, path: "/posts/search", params: [q] }
    file: { path: vuln/app/routes/search.py, symbol: search_posts, lines: [18, 24] }
    markers: [GLOBEX-CONFIDENTIAL-MARKER-7f3a]
  poc: ground-truth/verify/sqli_001.sh

SURFACE.yaml records one entry per operation the app exposes, vulnerable and benign alike - it is the denominator for endpoint coverage:

root@kitploit:~
operations:
  - id: posts.search
    kind: http                 # http | graphql | ws | llm | net
    method: GET
    path: /api/posts/search
    params: [q]
    discovery: js-runtime      # same crawl tiers as the answer key
    reachability: user
    vulns: [SQLI-001]          # omit when the operation is benign

  - id: graphql.mutation.update-post
    kind: graphql              # the op BEHIND POST /graphql, which is its own entry
    op: updatePost
    graphql_kind: mutation
    via: graphql.transport
    discovery: static-html

Benign operations are in there on purpose: a catalog of only the vulnerable routes would measure coverage of the answer key rather than of the app.

verify/ holds one runnable PoC per bug - it exits 0 against vuln/ and non-zero against safe/. That's the executable definition of "the bug is real (and actually fixed in the twin)."

The shared runner (dynast-bench/tools/poc-runner.sh) adds a third outcome the exit code cannot carry on its own: the harness could not run. Point the suite at a port nothing is listening on and a good half of any app's PoCs exit 1 - indistinguishable from a genuine fix. So the runner health-probes the target before it believes a rejection, applies a per-PoC deadline, and fails both legs on a timeout, a missing tool or a target that stopped answering. "The suite could not run" is never recorded as "the vulnerability is fixed".

Shared tooling (dynast-bench/, Bun/TypeScript)

One toolchain, used by every app, so cross-stack results are comparable:

  • dynast-bench.ts - the CLI: start/stop/reset/clean, health gating, port arbitration, PoC verification, scoring, --json for harnesses.
  • src/schema/ - types + validators for the two report formats (findings/v1, endpoints/v1) and the two answer keys (VULNERABILITIES.yaml, SURFACE.yaml), the CWE-family table used for partial credit, and the path/route/operation normalizers both sides of a comparison go through.
  • src/normalize/ - adapters converting raw scanner output (OWASP ZAP, SARIF from Semgrep/CodeQL/Snyk, nuclei, Burp XML, nmap XML) into that format. The format is auto-detected, so score takes native output directly.
  • src/scorer/ - matches findings against the answer key and emits precision / recall / F1, recall per difficulty / severity / reachability / taint / CWE, a discrimination score over the near-misses, and a duplicate (noise) ratio. Alongside it, an endpoint-coverage track grades how much of the app a run actually reached and splits every miss into "never found the endpoint" vs "found it, missed the bug".
root@kitploit:~
dynast-bench verify   <app>                 # run the app's ground-truth PoCs
dynast-bench score    <app> findings.json   # findings → P/R/F1 + per-dimension recall
dynast-bench coverage <app> endpoints.json  # endpoint discovery → how much was reached
dynast-bench surface  <app>                 # the operation checklist a crawl is graded on
dynast-bench diff     <app>                 # the vuln↔safe delta vs the answer key
dynast-bench check    --all                 # CI gate: schema · anchors · diff scope · binds

examples/ holds files you can score immediately - a findings run, a false-positive run, three endpoint traces and two blank templates, each documented with the numbers it produces:

root@kitploit:~
dynast-bench score    nextjs examples/findings.json --safe examples/findings-safe.json
dynast-bench coverage nextjs examples/endpoints.json --findings examples/findings.json

Full reference - the finding schema, the matching tiers, every metric: dynast-bench/README.md.

Uniform Makefile interface (identical in every app)

root@kitploit:~
make up       # docker compose up the vuln/ variant (127.0.0.1 only), wait for health
make reset    # down -v && up → fresh, byte-identical state
make safe     # bring up the safe/ variant instead (for false-positive runs)
make verify   # run every ground-truth PoC; expect all PASS against vuln/
make score FINDINGS=f.json    # grade a scanner's findings → P/R/F1
make diff     # the vuln↔safe delta, cross-checked against the answer key
make check    # CI gate: schema · anchors · diff scope · PoCs · 127.0.0.1 binds

The apps

AppStackDBExtra servicesDesign doc
fastapiPython / FastAPI + Jinja2PostgresMinIO, Mailpitfastapi.md
golangGo / chiPostgresPrometheus, Grafanagolang.md
ginGo / GinPostgreschromium, ImageMagick (in-image)README
nextjsNode / Next.js 15PostgresRedis, Mailpitnextjs.md
nestjsNode / NestJS + HandlebarsPostgresRedis, nginxnestjs.md
springbootJava / Spring Boot + ThymeleafPostgresJenkins, Prometheusspringboot.md
railsRuby / Rails 7.2PostgresMinIO, nginxrails.md
wordpressPHP / WordPress + pluginMySQLnginx, Mailpitwordpress.md
phpPHP / procedural LAMPMySQLphpMyAdmin, Mailpitphp.md
jspJava / JSP + Servlets (Tomcat)PostgresMailpitjsp.md
aspnetC# / ASP.NET Core Razor PagesSQL ServerMailpit

Plus three API-only apps (GraphQL, WebSocket, Swagger/OpenAPI), a network-range fleet for host/port scanners, and two LLM apps:

AppStackDBExtra servicesDesign doc
llmchatPython / FastAPI + LangChain (RAG chatbot)Postgres+pgvectorRedis, Ollama, internal svcllmchat.md
llmagentNode / Fastify + Vercel AI SDK + MCP (agent)PostgresRedis, Ollama, partner-MCP, internal svcllmagent.md

Both LLM apps run a local model via an internal-only Ollama container (gemma3:1b for chat, qwen2.5:1.5b for tool calling) - no API key, no egress, no per-run cost - and ship a scripted LLM_BACKEND=stub backend so the ground-truth PoCs stay deterministic against a stochastic model.

See benchmark-plans/README.md for the shared domain model, the OWASP-Top-10 coverage matrix, and the benchmark-design principles (near-misses, taint distance, logic-only bugs).

Getting started

root@kitploit:~
make install                           # once: puts `dynast-bench` on your PATH
dynast-bench doctor                    # docker reachable? which ports are taken?

dynast-bench start fastapi             # boots the vuln/ variant, waits for health
dynast-bench verify fastapi            # sanity-check: every planted bug's PoC PASSes

# ...point your scanner/agent at $(dynast-bench target fastapi), collect findings.json...

dynast-bench start fastapi --variant safe   # patched twin → measures false positives
dynast-bench reset fastapi                  # restore fresh, re-seeded state
dynast-bench clean --all --yes              # give the disk back

Or drive one app directly with its Makefile:

root@kitploit:~
cd vulnerable-apps/fastapi
make up      # vuln/ variant on 127.0.0.1
make verify  # every planted bug's PoC PASSes
make safe    # the patched twin
make reset   # fresh state

Status

  • 19 apps carry a complete answer key: 549 planted vulnerabilities, 146 near-misses, 546 PoCs, and a Dockerfile.standalone each (--solo). dynast-bench list prints the live table.
  • nextjs is the reference implementation - built and validated end to end (35 vulns + 15 near-misses). make validate APP=nextjs proves every PoC exploitable on vuln/ and fixed on safe/; make solo APP=nextjs runs it from one image. Copy its patterns.
  • dynast-bench CLI - built: runs, verifies, scores and cleans any app, in compose or single-image mode, with --json for harnesses.
  • The scorer - built (dynast-bench/src/): scanner output → normalized findings → precision/recall/F1, per-difficulty recall, a discrimination score over the near-misses, and separate discovery (network) and injection-channel (LLM) tracks.
  • Endpoint coverage - built: a SURFACE.yaml per app (~600 operations across the fleet) grading how much of the app a run actually reached, and splitting every miss into "never found the endpoint" vs "found it, missed the bug".
  • Per-app invariants over all 19 answer keys and surface catalogs run in make test; dynast-bench check --all is the CI gate.

Scoring a tool

root@kitploit:~
dynast-bench start nextjs --json | jq -r .target        # boot, get the URL
zap-baseline.py -t http://127.0.0.1:13311 -J zap.json   # scan
dynast-bench score nextjs zap.json --full               # grade it

# measure false positives properly: scan the patched twin too
dynast-bench start nextjs --variant safe
my-scanner --url http://127.0.0.1:13311 --out safe.json
dynast-bench score nextjs zap.json --safe safe.json

score reads a findings/v1 file or native ZAP / SARIF / nuclei / Burp / nmap output - the format is sniffed. Start from examples/ if you are wiring up a tool: examples/template-findings.json is a blank skeleton with every field, and examples/findings.json is a working file you can score right now.

Endpoint discovery is graded separately, against each app's SURFACE.yaml:

root@kitploit:~
dynast-bench coverage nextjs endpoints.json --findings findings.json

That is what separates a discovery miss (never reached the endpoint - fix the crawler) from an analysis miss (reached it, did not report - fix the scanner). See dynast-bench/README.md for the schema, the matching tiers and every metric.

Reading the report (Leg │ Precision │ Recall │ F1)

A leg is one scan run against one target state:

LegWhat it is
blackboxno credentials - the unauthenticated attacker view
credentialedsame target with the seeded logins injected, so authenticated surface (IDOR, privilege escalation) is reachable
safe-twinthe patched twin (--safe), a false-positive baseline - ideally finds nothing

All three run 0.0–1.0, and for all three higher is better (1.0 is perfect):

MetricFormulaBetterReads as
PrecisionTP / (TP + FP)↑ higherof everything reported, how much was real. 0.38 = ~38% of findings were genuine, the rest noise. High = few false alarms.
RecallTP / (TP + FN)↑ higherof the bugs actually planted, how many were found. 0.73 = 8 of 11. High = few misses.
F12 × P × R / (P + R)↑ higherharmonic mean of the two - the headline "overall quality" number. Only high when both are, so it penalises being noisy and missing bugs.

The one inversion: on the safe-twin leg there is nothing real to find, so every finding there is a false alarm - fewer is better, and an empty report is the perfect score.

Endpoint coverage

Recall tells you how many bugs a tool found. It cannot tell you why it missed the rest - and the two reasons need opposite fixes:

MissMeaningWhat to fix
discovery missnever reached the endpoint carrying the bugthe crawler
analysis missreached the endpoint, did not report the bugthe analysis

Telling them apart needs a second input: the endpoints your tool says it found. That is endpoints/v1, scored against each app's SURFACE.yaml.

root@kitploit:~
dynast-bench surface  nextjs                       # the checklist a crawl is graded on
dynast-bench coverage nextjs endpoints.json        # how much did it reach?
dynast-bench coverage nextjs endpoints.json --findings findings.json   # ...and why not the rest
dynast-bench score    nextjs findings.json --endpoints endpoints.json  # both in one report

A crawler that reads HTML and runs JS but never completes a multi-step flow:

root@kitploit:~
operations   62.5%   25 of 40
detection    25.0%   of the bugs on operations it reached
misses:      11 never reached the operation · 18 reached it and did not report

  static-html    6/6   100.0%
  js-static      5/5   100.0%
  js-runtime    11/19   57.9%
  interaction    3/5    60.0%
  flow           0/5     0.0%

The tier breakdown is the useful part: 100% on static-html and 0% on flow is a discovery problem, not a scanner problem, and those read identically in a single recall number.

Two rules keep the number honest:

  • Transport is not operation. One POST /graphql does not exercise the 25 GraphQL operations behind it; one WebSocket handshake does not exercise its events; one POST /api/runs does not exercise an agent's tools. Reaching a URL and exercising what lives there are separately scored.
  • Missing telemetry produces no track at all, never 0%. "We did not measure this" and "it reached nothing" are opposite claims about a tool.

Reported endpoints that match nothing cost precision but never reduce coverage, so spraying a wordlist is not a way to score higher. Full model: dynast-bench/README.md#endpoint-coverage.

License

dynast-bench is made with ♥ by @j3ssie to benchmark Vigolium and Gimorra (An autonomous offensive-security agent), and it is released under the MIT license.

Скачать инструмент
llmagentNode / Fastify + AI SDK + MCPPostgres298plan
llmchatPython / FastAPI + LangChain RAGPostgres+pgvector309plan
nestjsNode / NestJS + HandlebarsPostgres236plan
networkSimulated multi-host network rangemixed fleet325plan
nextjsNode / Next.js 15 (reference impl)Postgres3515plan
phpPHP / procedural LAMPMySQL215plan
railsRuby / Rails 7.2Postgres266plan
springbootJava / Spring Boot + ThymeleafPostgres304plan
swaggerOpenAPI / Swagger UI + spec loadingPostgres195plan
websocketNode 22 / ws + Socket.IO realtimePostgres286plan
weirdproxynginx + Apache + Traefik over one originnone164plan
wordpressPHP / WordPress + custom pluginMySQL286plan
14
Race conditions / TOCTOU3621414
Open redirect6011414
User & resource enumeration (observable response discrepancy)204, 5981312
Code injection · SSTI · expression language94, 917, 1059, 13361110
Weak crypto & randomness · cleartext transport295, 319, 327, 330, 338116
Password reset + account recovery flaws184, 64099
Unrestricted / unsafe file upload43499
CSRF (incl. cross-site WebSocket hijacking)35288
Prompt injection & LLM tool abuse (direct · indirect · RAG)142772
XXE / XML external entity61155
Supply chain & integrity (unsigned updates, vulnerable deps)494, 103522
Insecure network exposure (binding, service misconfiguration)132721
Insufficient logging / log injection11711
aspnet.md