TP : DAST avec OWASP ZAP Proxy¶
Ce TP vous fait manipuler OWASP ZAP sur une application web volontairement vulnérable, d'abord en local puis dans une pipeline GitLab CI/CD
L'objectif est de vous entraîner sur des usages concrets de ZAP sans partir de zéro sur l'application cible
Objectifs du TP¶
- Utiliser ZAP comme proxy local pour observer et intercepter le trafic HTTP
- Réaliser un scan passif de type Baseline sur une application web existante
- Réaliser un scan actif sur un environnement dédié
- Générer et lire un rapport HTML de scan
- Intégrer un scan ZAP dans une pipeline GitLab CI/CD
- Ajuster le comportement du scan avec un fichier de configuration
Pré-requis¶
- Docker installé et fonctionnel
- OWASP ZAP Desktop installé en local
- Un dépôt GitLab avec un fichier
.gitlab-ci.yml - Une application web volontairement vulnérable accessible en HTTP ou HTTPS
- Un navigateur web
Applications cibles recommandées¶
Pour éviter de perdre du temps à créer une application vulnérable, utilisez une cible existante
Option 1 : OWASP Juice Shop¶
Recommandé pour un TP ZAP complet
- application moderne
- beaucoup de surface fonctionnelle
- adaptée au proxy, au baseline scan et au full scan
Exemple de lancement en local :
URL cible :
Option 2 : OWASP WebGoat¶
Recommandé si vous voulez relier plus facilement les exercices à des familles de vulnérabilités connues
- approche très pédagogique
- environnement de formation reconnu
- intéressant pour l'entraînement manuel avec proxy
Option 3 : OWASP PyGoat¶
Recommandé si vous travaillez déjà avec Python et Django
- bon support pour discuter des vulnérabilités applicatives
- utile si vous voulez faire le lien entre scan dynamique et code source
Option 4 : Une application vulnérable déjà utilisée dans vos autres TP¶
Cette option est pertinente si vous avez déjà :
- une application déployable en local
- un dépôt GitLab existant
- une pipeline CI/CD que vous pouvez enrichir
Dans tous les cas, privilégiez une cible :
- simple à lancer
- accessible depuis Docker
- isolée du reste du système
- réservée à un usage pédagogique
Partie 1 : Prise en main de ZAP en local¶
Exercice 1 : Démarrer l'application cible¶
- Lancez OWASP Juice Shop en local avec Docker
- Vérifiez que l'application répond dans le navigateur
- Identifiez rapidement les principales routes ou écrans visibles sans authentification
- Notez quelles actions utilisateur génèrent des appels réseau intéressants
Exercice 2 : Lancer ZAP Desktop¶
Lancez l'application OWASP ZAP Desktop installée sur votre machine
Sur macOS, ouvrez l'application depuis le dossier Applications
Sur Windows, ouvrez l'application depuis le menu Démarrer ou le raccourci installé
- Ouvrez l'interface desktop de ZAP
- Repérez les zones suivantes :
- l'arbre des sites
- l'historique des requêtes
- les alertes
- les détails requête/réponse
- Si vous voulez intercepter du HTTPS, exportez le certificat racine de ZAP depuis l'interface puis importez-le dans votre navigateur de test
Exercice 3 : Utiliser ZAP comme proxy d'interception¶
- Configurez votre navigateur pour utiliser
localhost:8080comme proxy HTTP - Naviguez sur l'application cible
- Vérifiez que les requêtes apparaissent dans ZAP
- Activez le mode interception
- Rejouez une action simple sur l'application
- Modifiez une valeur dans une requête avant de la transmettre
- Observez l'effet côté application et côté réponse HTTP
Exemples d'actions intéressantes :
- formulaire de connexion
- recherche de produit
- ajout au panier
- modification de paramètres dans l'URL
Partie 2 : Scan passif et lecture des alertes¶
Exercice 4 : Réaliser un Baseline Scan¶
Le scan Baseline est un scan passif adapté à la CI/CD. Il explore la cible et analyse les réponses sans tenter d'exploitation active
Depuis un terminal, lancez :
docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \
-t http://host.docker.internal:3000 \
-r zap-baseline-report.html \
-J zap-baseline-report.json
Si host.docker.internal ne fonctionne pas sur votre machine, adaptez la cible pour qu'elle soit joignable depuis le conteneur ZAP
Travail demandé :
- Exécutez le scan baseline
- Ouvrez le rapport HTML généré
- Repérez au moins trois alertes remontées par ZAP
- Classez-les entre :
- défauts d'en-têtes de sécurité
- exposition d'informations
- comportements applicatifs faibles
- Identifiez quelles alertes semblent faciles à corriger et lesquelles demanderaient une modification applicative
Exercice 5 : Ajuster le scan avec un fichier de configuration¶
Générez un fichier de configuration de référence :
docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \
-t http://host.docker.internal:3000 \
-g zap-baseline.conf
- Ouvrez le fichier généré
- Choisissez une ou deux règles à passer en
IGNORE - Choisissez une ou deux règles à passer en
FAIL - Relancez le scan avec l'option
-c - Comparez le résultat avec le premier rapport
- Expliquez dans quels cas il est légitime d'ignorer une alerte
Partie 3 : Scan actif sur environnement dédié¶
Exercice 6 : Réaliser un Full Scan¶
Le full scan lance aussi des attaques actives. Il ne doit pas être exécuté sur une production
Commande de départ :
docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py \
-t http://host.docker.internal:3000 \
-r zap-full-report.html \
-J zap-full-report.json \
-m 3
Travail demandé :
- Exécutez ce scan uniquement sur votre environnement local ou un environnement de test
- Comparez le temps d'exécution avec le baseline scan
- Comparez le nombre et la criticité des alertes
- Repérez les alertes qui n'apparaissaient pas dans le scan passif
- Identifiez une action applicative potentiellement risquée déclenchée pendant le scan
Partie 4 : Intégration GitLab CI/CD¶
Exercice 7 : Ajouter un job de baseline scan¶
Ajoutez un stage security_scan puis créez un job de scan ZAP
Base de travail :
stages:
- security_scan
zap_baseline_scan:
stage: security_scan
image: ghcr.io/zaproxy/zaproxy:stable
variables:
TARGET_URL: "http://example.com"
script:
- mkdir -p /zap/wrk
- zap-baseline.py -t "$TARGET_URL" -r zap-report.html -J zap-report.json
artifacts:
when: always
paths:
- zap-report.html
- zap-report.json
Travail demandé :
- Adaptez
TARGET_URLà votre application vulnérable déjà déployée sur un environnement de test ou de staging - Exécutez le pipeline
- Téléchargez et lisez les artifacts générés
- Vérifiez si le job bloque ou non le pipeline selon les alertes rencontrées
Exercice 8 : Faire évoluer la politique de sécurité¶
- Générez un fichier de configuration ZAP depuis la ligne de commande
- Versionnez ce fichier dans votre dépôt
- Modifiez le job GitLab pour utiliser ce fichier via l'option
-c - Faites en sorte qu'au moins une alerte importante provoque un échec du job
- Faites ensuite évoluer la configuration pour réduire les faux positifs ou les alertes non prioritaires
Exercice 9 : Préparer un full scan planifié¶
Ajoutez un second job, distinct du baseline scan, destiné à un scan plus lourd
Contraintes :
- il doit utiliser
zap-full-scan.py - il ne doit tourner qu'en manual
- il doit cibler uniquement un environnement dédié (Cf: example.com ou app en Gitlab Services)
Travail demandé :
- Créez ce second job
- Définissez une stratégie d'exécution
- Générez un rapport HTML distinct
- Expliquez pourquoi ce job ne doit pas être déclenché sur un environnement partagé sans précaution