
API REST vulnerable con las 10 principales vulnerabilidades de OWASP para pruebas de seguridad
La API Vulnerable (Basada en OpenAPI 3)

VAmPI es una API vulnerable hecha con Flask que incluye vulnerabilidades del OWASP top 10 para APIs. Fue creada porque quería una API vulnerable para evaluar la eficiencia de herramientas utilizadas para detectar problemas de seguridad en APIs. Incluye un interruptor de encendido/apagado para permitir que la API sea vulnerable o no durante las pruebas. Esto permite cubrir mejor los casos de falsos positivos/negativos. VAmPI también puede usarse con fines de aprendizaje/enseñanza. Puedes encontrar más detalles sobre las vulnerabilidades en erev0s.com.
El flujo de acciones de VAmPI es el siguiente: un usuario no registrado puede ver información mínima sobre los usuarios de prueba incluidos en la API. Un usuario puede registrarse y luego iniciar sesión para poder usar el token recibido durante el inicio de sesión y publicar un libro. Para un libro publicado, los datos aceptados son el título y un secreto sobre ese libro. Cada libro es único para cada usuario y solo el propietario del libro debería poder ver el secreto.
A continuación se muestra un breve resumen de las acciones incluidas:
| Acción | Ruta | Detalles |
|---|---|---|
| GET | /createdb | Crea y llena la base de datos con datos de prueba |
| GET | / | Inicio de VAmPI |
| GET | /me | Muestra el usuario que ha iniciado sesión |
| GET | /users/v1 | Muestra todos los usuarios con información básica |
| GET | /users/v1/_debug | Muestra todos los detalles de todos los usuarios |
| POST | /users/v1/register | Registrar nuevo usuario |
| POST | /users/v1/login | Iniciar sesión en VAmPI |
| GET | /users/v1/{username} | Muestra usuario por nombre de usuario |
| DELETE | /users/v1/{username} | Elimina usuario por nombre de usuario (solo administradores) |
| PUT | /users/v1/{username}/email | Actualizar el correo electrónico de un usuario |
| PUT | /users/v1/{username}/password | Actualizar la contraseña del usuario |
| GET | /books/v1 | Recupera todos los libros |
| POST | /books/v1 | Añadir nuevo libro |
| GET | /books/v1/{book} | Recupera libro por título junto con su secreto |
Para más detalles, puedes ejecutar VAmPI y visitar http://127.0.0.1:5000/ui/ o usar un servicio como el swagger editor proporcionando la especificación OpenAPI que se encuentra en el directorio openapi_specs.
Es una aplicación Flask, por lo que para ejecutarla puedes instalar todos los requisitos y luego ejecutar app.py.
Para instalar todos los requisitos, simplemente ejecuta pip3 install -r requirements.txt y luego python3 app.py.
O si lo prefieres, también puedes ejecutarlo a través de docker o docker compose.
docker run -p 5000:5000 erev0s/vampi:latest
[Nota: si ejecutas Docker en versiones más recientes de macOS, usa -p 5001:5000 para evitar conflictos con el servicio AirPlay Receiver. Alternativamente, puedes deshabilitar el servicio AirPlay Receiver en Preferencias del Sistema -> Compartir.]
docker-compose contiene dos instancias, una con la configuración segura en el puerto 5001 y otra con la configuración insegura en el puerto 5002:
docker-compose up -d
Visita la ruta /ui donde se está ejecutando la API y un Swagger UI estará disponible para ayudarte a empezar.
http://127.0.0.1:5000/ui/
Si deseas modificar el tiempo de expiración del token creado después del inicio de sesión o si quieres cambiar el entorno para que no sea vulnerable, puedes usar algunas formas según cómo ejecutes la aplicación.
python3 app.py, todo lo que tienes que hacer es editar las variables alive y vuln definidas en el propio app.py. La variable alive se mide en segundos, por lo que si pones 100, el token expira después de 100 segundos. La variable vuln es como un booleano: si la estableces en 1, la aplicación es vulnerable; si la estableces en 0, la aplicación no es vulnerable.docker run o editar el Dockerfile y reconstruir.
Ejemplo de Docker run: docker run -d -e vulnerable=0 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest
vulnerable=1 en un puerto diferente y cambiar fácilmente entre los dos.En el Dockerfile encontrarás dos variables de entorno establecidas: ENV vulnerable=1 y ENV tokentimetolive=60. Siéntete libre de cambiarlas antes de ejecutar el comando de construcción de docker.
/createdb para llenar la base de datos.