DVWA (Damn Vulnerable Web Application) es una aplicación web PHP/MariaDB construida a propósito con vulnerabilidades reales para que puedas practicar hacking web de forma legal y segura en tu propio entorno. Es el punto de partida más recomendado para principiantes que quieren aprender ataques como SQL Injection, XSS o Command Injection antes de enfrentarse a plataformas de CTF o entornos de producción.
En esta guía verás qué es DVWA, cómo instalarlo en minutos con Docker, qué módulos incluye y cómo ejecutar tu primer ataque de ejemplo paso a paso.
Qué es DVWA y para qué sirve
DVWA, cuyas siglas corresponden a Damn Vulnerable Web Application, es un proyecto de código abierto mantenido por digininja en GitHub. Su objetivo declarado es dar un entorno donde los profesionales de seguridad puedan «poner a prueba sus habilidades y herramientas en un entorno legal» y donde los desarrolladores puedan entender los procesos de securización de aplicaciones web.
A diferencia de plataformas como HackTheBox o TryHackMe, que ofrecen máquinas en la nube, DVWA corre en tu propia máquina, lo que te da control total sobre el entorno y te permite experimentar sin límite de tiempo ni de conexión. Va bien para:
- Estudiar vulnerabilidades web del OWASP Top 10.
- Aprender el funcionamiento de herramientas como Burp Suite, sqlmap o Nikto.
- Preparar certificaciones como eJPT, CEH o OSCP.
- Entender cómo defender una aplicación viendo primero cómo se ataca.
Si quieres contexto más amplio antes de continuar, consulta nuestra guía completa de hacking web y nuestro artículo sobre las mejores plataformas para practicar hacking.
Instalación de DVWA paso a paso
Hay varias formas de instalar DVWA. La más rápida y recomendada para principiantes es Docker, porque no requiere configurar manualmente Apache, PHP ni MariaDB. También existe la opción tradicional con XAMPP, que detallamos brevemente al final.
Método recomendado: Docker (5 minutos)
Requisitos previos: tener Docker Desktop instalado y en ejecución en tu sistema (Windows, macOS o Linux).
Paso 1: descargar y arrancar el contenedor
Abre una terminal y ejecuta:
docker run --rm -it -p 127.0.0.1:80:80 vulnerables/web-dvwa
Este comando hace lo siguiente:
--rm: elimina el contenedor al detenerlo (el entorno queda limpio).-it: modo interactivo; verás los logs en tiempo real.-p 127.0.0.1:80:80: expone el puerto 80 solo en localhost, nunca en la red externa.vulnerables/web-dvwa: imagen oficial publicada en Docker Hub.
Si el puerto 80 ya está ocupado en tu máquina (por ejemplo por XAMPP u otro servidor local), usa el puerto 8080:
docker run --rm -it -p 127.0.0.1:8080:80 vulnerables/web-dvwa
Paso 2: abrir DVWA en el navegador
Una vez que Docker haya descargado la imagen y el contenedor esté en marcha (verás mensajes de inicio de Apache y MySQL), abre tu navegador y ve a:
http://127.0.0.1/
O bien http://127.0.0.1:8080/ si usaste ese puerto. Aparecerá la página de login de DVWA.
Paso 3: iniciar sesión y crear la base de datos
Las credenciales por defecto son:
Usuario: admin
Contraseña: password
Después del login, DVWA te redirigirá a la página de configuración. Haz clic en el botón «Create / Reset Database». Este paso crea las tablas necesarias y deja la aplicación lista para usar. Si todo va bien, verás los campos en verde.
Paso 4: volver a iniciar sesión
Tras crear la base de datos la sesión se cierra. Vuelve a http://127.0.0.1/login.php y accede de nuevo con admin / password.
Listo, ya tienes DVWA en marcha.
Vídeo tutorial en español
Si prefieres ver la instalación en vídeo (en este caso sobre Ubuntu Server, proceso muy similar), este tutorial lo explica con detalle:
«Instalación COMPLETA de DVWA en Ubuntu Server – Laboratorio de Ciberseguridad» — canal Gerardo (@gerardo-IT) en YouTube.
Método alternativo: XAMPP (Windows/Linux)
Si no quieres usar Docker, puedes instalar DVWA sobre XAMPP:
- Descarga e instala XAMPP y arranca Apache y MySQL desde el panel de control.
- Descarga la última versión de DVWA desde github.com/digininja/DVWA (botón «Code → Download ZIP»).
- Descomprime la carpeta dentro de
C:xampphtdocsdvwa(Windows) o/opt/lampp/htdocs/dvwa/(Linux). - Copia el archivo de configuración de ejemplo:
# Dentro de la carpeta dvwa/config/
cp config.inc.php.dist config.inc.php
- Edita
config.inc.phpy ajusta las credenciales de base de datos (por defecto: usuarioroot, contraseña vacía). - Abre
http://localhost/dvwa/setup.phpen el navegador y haz clic en «Create / Reset Database».
La ventaja de Docker es que no «ensucia» tu sistema y puedes destruir el entorno en un solo comando (Ctrl+C). Con XAMPP tienes más control sobre la configuración de PHP, lo que puede ser útil para módulos avanzados.
Niveles de seguridad en DVWA
Uno de los puntos más didácticos de DVWA es que puedes cambiar el nivel de dificultad de cada vulnerabilidad en tiempo real. El nivel se configura en DVWA Security (menú lateral izquierdo) y afecta a todos los módulos.
- Low: sin ningún tipo de protección. El código fuente es directamente vulnerable. Sirve para aprender el ataque básico y ver cómo funciona el exploit.
- Medium: se añaden algunas defensas básicas (filtros simples, validaciones parciales). Tendrás que buscar formas de saltarlas.
- High: defensas más robustas. Requiere más creatividad o herramientas adicionales. Equivale a lo que podrías encontrar en aplicaciones reales mal securizadas.
- Impossible: el código usa buenas prácticas de seguridad (prepared statements, tokens CSRF correctos, etc.). Sirve de referencia para ver cómo debería escribirse el código seguro.
El flujo que recomiendo es: empieza en Low, ejecuta el ataque, sube a Medium y comprueba si tu técnica sigue funcionando, luego a High. Por último, lee el código fuente de Impossible para aprender la defensa correcta.
Módulos disponibles en DVWA
DVWA incluye los siguientes módulos de práctica, cada uno centrado en una categoría de vulnerabilidad web:
| Módulo DVWA | Vulnerabilidad que practica | OWASP Top 10 (ref.) |
|---|---|---|
| Brute Force | Ataque de fuerza bruta a formularios de login | A07 – Fallos de autenticación |
| Command Injection | Inyección de comandos del sistema operativo | A03 – Inyección |
| CSRF | Cross-Site Request Forgery (falsificación de petición) | A01 – Control de acceso roto |
| File Inclusion | Inclusión local (LFI) y remota (RFI) de archivos | A05 – Configuración insegura |
| File Upload | Subida de archivos maliciosos (webshell PHP) | A04 – Diseño inseguro |
| SQL Injection | Inyección SQL clásica (dump de base de datos) | A03 – Inyección |
| SQL Injection (Blind) | SQLi ciega: inferencia de datos sin respuesta directa | A03 – Inyección |
| Weak Session IDs | Identificadores de sesión predecibles | A07 – Fallos de autenticación |
| XSS (DOM) | Cross-Site Scripting basado en el DOM | A03 – Inyección |
| XSS (Reflected) | XSS reflejado: el payload vuelve en la respuesta HTTP | A03 – Inyección |
| XSS (Stored) | XSS almacenado: el payload queda en la base de datos | A03 – Inyección |
| Content Security Policy | Bypass de cabeceras CSP mal configuradas | A05 – Configuración insegura |
| JavaScript | Manipulación de lógica client-side en JavaScript | A04 – Diseño inseguro |
Cómo practicar tu primer ataque: SQL Injection en nivel Low
Con DVWA en marcha, vamos a ejecutar el ataque más clásico del hacking web: una inyección SQL básica que nos permite leer datos de la base de datos sin credenciales válidas. Para más contexto teórico, visita nuestro curso de hacking web.
Paso 1: configurar el nivel de seguridad
En el menú lateral de DVWA, haz clic en DVWA Security. Selecciona Low y haz clic en «Submit».
Paso 2: abrir el módulo SQL Injection
En el menú lateral, haz clic en SQL Injection. Verás un campo de texto con el texto «User ID» y un botón «Submit».
Paso 3: probar la inyección básica
En el campo «User ID» introduce el siguiente payload y haz clic en Submit:
1' OR '1'='1
Si la aplicación es vulnerable (y en nivel Low lo es), en lugar de mostrar solo el usuario con ID 1, mostrará todos los usuarios de la base de datos. Esto ocurre porque la consulta SQL que ejecuta el servidor queda así:
SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1'='1';
La condición '1'='1' siempre es verdadera, así que la cláusula WHERE no filtra nada y devuelve todas las filas.
Paso 4: extraer la versión de la base de datos
Podemos ir más lejos y usar UNION para obtener información del sistema. Introduce:
1' UNION SELECT user(), version()-- -
Esto devuelve el usuario de MySQL y la versión del servidor de base de datos. En la respuesta verás algo como root@localhost y 10.x.x-MariaDB.
Paso 5: ver el código fuente y aprender la defensa
Haz clic en el botón «View Source» (abajo a la derecha) para ver el código PHP vulnerable. Luego cambia el nivel a Impossible y vuelve a ver el código: ahí verás el uso de prepared statements con PDO, que impiden por completo este tipo de ataque.
Este ciclo (atacar en Low, intentar en Medium/High, leer la defensa en Impossible) es, a mi juicio, el método de estudio más efectivo con DVWA. Si quieres montar un laboratorio más completo en casa, consulta nuestra guía sobre cómo montar un laboratorio de hacking en casa.
Buenas prácticas: usa DVWA de forma segura
DVWA es una herramienta de entrenamiento, no un juguete. Sigue estas reglas siempre.
- Red aislada o localhost únicamente. Usa siempre
127.0.0.1(loopback) o una red interna de laboratorio (por ejemplo, una red host-only en VirtualBox/VMware). Nunca expongas el puerto en0.0.0.0. - Nunca en producción ni en un servidor con IP pública. Si tu servidor de hosting tiene abierto el puerto, DVWA será comprometido en horas. El propio repositorio oficial lo avisa explícitamente.
- Destruye el contenedor cuando no lo uses. Con Docker, cuando termines simplemente para el contenedor con Ctrl+C y el flag
--rmlo elimina automáticamente. - No uses las credenciales de DVWA en ningún otro servicio.
admin/passwordson credenciales triviales, solo válidas para este entorno de práctica. - Usa una máquina virtual si vas a probar exploits más agresivos. Para módulos como File Upload (webshells) o Command Injection es más prudente correr DVWA dentro de una VM, no directamente en tu sistema anfitrión.
Preguntas frecuentes sobre DVWA
¿Es ilegal instalar DVWA?
No. DVWA es una herramienta de formación legal, de código abierto, pensada para instalarse en entornos privados. Lo que sería ilegal es usar las técnicas que aprendes en ella contra sistemas que no son tuyos o para los que no tienes autorización escrita. Dentro de tu laboratorio local, es completamente legal.
¿Necesito saber programar para usar DVWA?
No es imprescindible para los primeros ejercicios, pero sí es muy recomendable tener nociones básicas de HTML y SQL. DVWA tiene un botón «View Source» que muestra el código PHP de cada módulo, y leerlo es una parte importante del aprendizaje. Si partes de cero, revisa antes nuestro curso introductorio de hacking web.
¿Funciona DVWA en Windows con Docker Desktop?
Sí. Docker Desktop para Windows incluye todo lo necesario. Solo asegúrate de que la virtualización está habilitada en la BIOS/UEFI de tu equipo y de que WSL 2 (Windows Subsystem for Linux) está instalado, que es el backend que usa Docker Desktop en Windows. El comando docker run funciona igual en PowerShell o en CMD.
¿Cuál es la diferencia entre SQL Injection y SQL Injection Blind en DVWA?
En la SQLi clásica, la aplicación devuelve los datos directamente en la respuesta (los ves en pantalla). En la SQLi ciega (Blind), la aplicación no muestra los datos pero sí cambia su comportamiento (un mensaje de error, un retardo en la respuesta) en función de si la condición inyectada es verdadera o falsa. La inyección ciega es más realista porque la mayoría de aplicaciones bien configuradas no muestran errores SQL al usuario.
¿Puedo usar DVWA con Kali Linux?
Sí, y es una combinación muy popular. Puedes instalar Docker en Kali y correr DVWA tal como se describe en esta guía. La ventaja de usar Kali como máquina atacante es que ya incluye todas las herramientas necesarias: Burp Suite, sqlmap, Nikto, Hydra, etc. También puedes instalar DVWA directamente sobre LAMP/XAMPP en Kali si prefieres no usar Docker.
