
API REST vulnérable avec les 10 principales vulnérabilités OWASP pour les tests de sécurité
L'API Vulnérable (Basée sur OpenAPI 3)

VAmPI est une API vulnérable créée avec Flask et inclut des vulnérabilités du top 10 OWASP pour les API. Elle a été créée car je souhaitais une API vulnérable pour évaluer l'efficacité des outils utilisés pour détecter des problèmes de sécurité dans les API. Elle comporte un interrupteur pour activer ou désactiver la vulnérabilité lors des tests, permettant ainsi de mieux couvrir les cas de faux positifs/négatifs. VAmPI peut également être utilisée à des fins d'apprentissage ou d'enseignement. Vous trouverez plus de détails sur les vulnérabilités sur erev0s.com.
Le flux d'actions de VAmPI se déroule ainsi : un utilisateur non enregistré peut voir des informations minimales sur les utilisateurs fictifs inclus dans l'API. Un utilisateur peut s'inscrire, puis se connecter pour utiliser le jeton reçu lors de la connexion afin de publier un livre. Pour un livre publié, les données acceptées sont le titre et un secret concernant ce livre. Chaque livre est unique pour chaque utilisateur et seul le propriétaire du livre devrait pouvoir voir le secret.
Un aperçu rapide des actions incluses peut être consulté dans le tableau suivant :
| Action | Chemin | Détails |
|---|---|---|
| GET | /createdb | Crée et remplit la base de données avec des données fictives |
| GET | / | Page d'accueil VAmPI |
| GET | /me | Affiche l'utilisateur connecté |
| GET | /users/v1 | Affiche tous les utilisateurs avec des informations de base |
| GET | /users/v1/_debug | Affiche tous les détails pour tous les utilisateurs |
| POST | /users/v1/register | Inscrire un nouvel utilisateur |
| POST | /users/v1/login | Se connecter à VAmPI |
| GET | /users/v1/{username} | Affiche l'utilisateur par nom d'utilisateur |
| DELETE | /users/v1/{username} | Supprime l'utilisateur par nom d'utilisateur (Admin seulement) |
| PUT | /users/v1/{username}/email | Met à jour l'adresse e-mail d'un utilisateur |
| PUT | /users/v1/{username}/password | Met à jour le mot de passe de l'utilisateur |
| GET | /books/v1 | Récupère tous les livres |
| POST | /books/v1 | Ajouter un nouveau livre |
| GET | /books/v1/{book} | Récupère un livre par titre ainsi que son secret |
Pour plus de détails, vous pouvez soit exécuter VAmPI et visiter http://127.0.0.1:5000/ui/, soit utiliser un service comme le swagger editor en fournissant la spécification OpenAPI qui se trouve dans le répertoire openapi_specs.
C'est une application Flask, donc pour l'exécuter, vous pouvez installer toutes les dépendances puis lancer app.py.
Pour installer toutes les dépendances, exécutez simplement pip3 install -r requirements.txt puis python3 app.py.
Ou, si vous préférez, vous pouvez également l'exécuter via Docker ou Docker Compose.
docker run -p 5000:5000 erev0s/vampi:latest
[Remarque : si vous exécutez Docker sur des versions récentes de macOS, utilisez -p 5001:5000 pour éviter les conflits avec le service AirPlay Receiver. Vous pouvez également désactiver le service AirPlay Receiver dans Préférences Système -> Partage.]
docker-compose contient deux instances, une avec la configuration sécurisée sur le port 5001 et une autre avec la configuration non sécurisée sur le port 5002 :
docker-compose up -d
Visitez le chemin /ui là où vous exécutez l'API et une interface Swagger UI sera disponible pour vous aider à démarrer !
http://127.0.0.1:5000/ui/
Si vous souhaitez modifier le délai d'expiration du jeton créé après la connexion ou si vous voulez changer l'environnement pour qu'il ne soit pas vulnérable, vous pouvez utiliser plusieurs méthodes selon la façon dont vous exécutez l'application.
python3 app.py, il vous suffit de modifier les variables alive et vuln définies dans app.py lui-même. La variable alive est mesurée en secondes, donc si vous mettez 100, le jeton expire après 100 secondes. La variable vuln est booléenne, si vous la mettez à 1, l'application est vulnérable, et si vous la mettez à 0, l'application n'est pas vulnérable.docker run, soit modifier le Dockerfile et reconstruire.
Exemple Docker run : docker run -d -e vulnerable=0 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest
vulnerable=1 sur un port différent et basculer facilement entre les deux.Dans le Dockerfile, vous trouverez deux variables d'environnement définies : ENV vulnerable=1 et ENV tokentimetolive=60. N'hésitez pas à les modifier avant d'exécuter la commande docker build.
/createdb afin de remplir la base de données.