Practice range. VulnShop breaks on purpose so scanners have something to find. Keep it on 127.0.0.1 — never put it on the internet.
Vulnshop. Merch for people who read the source

Shop floor · open · no code review

Everything here is for sale. Including the flaws.

12 pieces of security merch, sold by a storefront that trusts every input it is handed. The back room has every deliberate defect laid out with a form to reproduce it — no README required.

Each card is a real weakness in this app, reachable from the URL shown. Nothing here is simulated — the shop genuinely runs the input you give it.

GET

SQL Injection

The q parameter is concatenated into SQL with no binding.

/search?q=shirt
GET

Reflected XSS + SSTI

User input rendered with Jinja2 without escaping.

/greet?name=guest
GET

Command Injection

Host parameter passed to shell ping command.

/api/ping?host=127.0.0.1
GET

Path Traversal

File parameter not sanitized for .. sequences.

/download?file=readme.txt
GET

Open Redirect

URL parameter passed directly to redirect().

/redirect?url=/
GET

IDOR

Order endpoint returns any order by id, no ownership check.

/api/orders/1
POST

XXE (XML External Entity)

XML parser accepts external entity declarations.

/api/import
Sign in with admin / admin123 — the same credentials sitting in /.env and stored unhashed in the users table. Placing an order gives you a receipt at /api/orders/<id>, which never checks whose order it is.