
Un programme pour tester les fonctionnalités WAF
Outil d'évaluation WAF pour entreprise — Des charges d'attaque réelles. Des résultats réels. Des rapports prêts pour la conformité.
Le Testeur WAF évalue les pare-feu d'application web en envoyant des charges d'attaque réelles à une URL fournie par l'utilisateur et en signalant si elles sont bloquées. Disponible sous forme d'application de bureau Windows (Electron) et d'une CLI Python qui fonctionne partout.

Cet outil est destiné uniquement aux tests de sécurité autorisés. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite. Les tests non autorisés de systèmes tiers peuvent violer le Computer Fraud and Abuse Act (CFAA) et les lois équivalentes dans votre juridiction. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.
| Suite | Tests | Ce qu'elle couvre |
|---|---|---|
| OWASP / CWE Core | 44 | Injection SQL (12 variantes), XSS (10 variantes), traversée de chemin, injection de commande, XXE, SSRF, Log4Shell, SSTI, redirection ouverte |
| Rate Limiting | 3 | Rafale de requêtes (30 simultanées), rafale séquentielle, contournement par rotation IP via X-Forwarded-For |
| Bot Detection | 10 | sqlmap, Nikto, Nmap, Scrapy, Masscan, HeadlessChrome, python-requests, curl, UA vide, en-têtes Accept manquants |
| Bypass Attempts | 15 | Double encodage URL, Unicode pleine largeur, octets nuls, variation de casse, obfuscation par commentaire, injection CRLF, injection d'en-tête Host, substitution de méthode, astuces de chemin |
| API Security | 10 | Introspection / lot / énumération GraphQL, algorithme « none » et confusion d'algorithme JWT, affectation en masse, altération de verbe HTTP, BOLA, confusion de type de contenu |
| Business Logic | 8 | Quantité négative, soumission à prix zéro, accès à des points de terminaison admin, pollution de paramètres HTTP, énumération de comptes, exposition excessive de données, navigation forcée, escalade de privilèges |
Chaque test est étiqueté avec un ou plusieurs cadres de conformité :
ÉLEVÉ, PROBABLE ou INCERTAIN plutôt que binaires (réussi/échoué)git clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
La sortie apparaît dans dist/ sous forme d'un installateur NSIS et d'un .exe portable. Aucun prérequis nécessaire sur la machine cible — Electron intègre son propre runtime.
Une version Python en un seul fichier qui fonctionne partout où Python est disponible — serveurs Linux, pipelines CI/CD, conteneurs Docker, WSL ou tout environnement où le .exe Windows n'est pas une option.
pip install rich requests
python waf_tester.py --url https://target.example.com
Exécute les 90 tests, demande une confirmation d'autorisation, affiche les résultats en couleur dans le terminal et enregistre un rapport JSON et HTML dans le répertoire courant.
# Exécuter toutes les suites
python waf_tester.py --url https://app.example.com
# Exécuter uniquement les suites OWASP et API
python waf_tester.py --url https://app.example.com --suites owasp,api
# Authentification par jeton Bearer
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# Authentification par clé API
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# Enregistrer les rapports dans un dossier, ignorer la confirmation (CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# Sortie terminal uniquement — aucun fichier enregistré
python waf_tester.py --url https://app.example.com --output terminal
# Acheminer le trafic via Burp Suite
python waf_tester.py --url https://app.example.com --proxy http://127.0.0.1:8080
docker run --rm -v $(pwd)/reports:/reports \
python:3.12-slim sh -c \
"pip install rich requests -q && python waf_tester.py \
--url https://target.example.com \
--output-dir /reports --confirm"
- name: Évaluation WAF
run: |
pip install rich requests
python waf_tester.py \
--url ${{ secrets.WAF_TARGET_URL }} \
--suites owasp,api,bypass \
--output json \
--output-dir ./reports \
--confirm
- name: Téléversement du rapport
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
La CLI Python peut acheminer tout le trafic de test via Burp Suite, vous donnant un historique HTTP complet de chaque charge utile envoyée par le Testeur WAF. Ceci est utile pour l'inspection manuelle des requêtes et réponses, le réglage fin des charges utiles, le dépannage des comportements inattendus du WAF, et l'utilisation du scanner ou du Repeater de Burp sur des résultats intéressants.
Burp Suite exécute un écouteur proxy local (par défaut 127.0.0.1:8080). Lorsque vous pointez les variables d'environnement proxy du Testeur WAF vers cette adresse, chaque requête que l'outil envoie passe par Burp avant d'atteindre la cible. Vous voyez chaque charge utile dans l'historique HTTP de Burp avec la requête et la réponse complètes — code d'état, en-têtes, corps — exactement comme le WAF l'a vue.
1. Démarrez Burp Suite et confirmez que l'écouteur proxy est actif :
Ouvrez Burp → Proxy → Proxy Settings → confirmez que l'écouteur est sur 127.0.0.1:8080 (ou notez votre port s'il est différent).
2. Exportez le certificat CA de Burp et faites-lui confiance (configuration unique) :
Le Testeur WAF se connecte à des cibles HTTPS, donc Burp doit intercepter TLS. Allez dans Burp → Proxy → Proxy Settings → Import/Export CA Certificate → Exportez au format DER. Installez-le comme autorité de certification racine de confiance sur votre système, ou définissez la variable d'environnement ci-dessous pour ignorer la vérification (acceptable pour un laboratoire, pas en production).
3. Exécutez le Testeur WAF avec --proxy :
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Sous Windows :
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Vous pouvez également utiliser les variables d'environnement si vous préférez :
HTTPS_PROXY=http://127.0.0.1:8080 HTTP_PROXY=http://127.0.0.1:8080 \
python waf_tester.py --url https://target.example.com
4. Désactivez l'interception dans Burp :
Dans Burp → Proxy → Intercept, assurez-vous que l'interception est désactivée — sinon Burp fera une pause sur chaque requête en attendant que vous la relâchiez manuellement, et le Testeur WAF expirera. Vous voulez que Burp enregistre passivement le trafic, pas qu'il l'intercepte.
5. Observez les requêtes arriver dans l'historique HTTP de Burp :
Chaque charge utile du Testeur WAF apparaît comme une entrée séparée. Vous pouvez cliquer droit sur n'importe quelle requête et l'envoyer à Repeater pour la modifier et la renvoyer manuellement, ou à Intruder pour un fuzzing plus poussé.
Si le certificat CA de Burp n'est pas reconnu, ajoutez une solution de contournement --no-verify en désactivant temporairement la vérification SSL dans l'outil. Sinon, faites confiance au certificat CA de Burp au niveau du système ou utilisez une cible HTTP (pas HTTPS) pour les premiers tests.
Niveaux de confiance :
ÉLEVÉ — blocage strict (403, 406, 429) sans ambiguïtéPROBABLE — mots-clés WAF dans le corps de la réponse, ou état différent de la référenceINCERTAIN — blocage souple (400, 503) qui pourrait être une erreur légitime de l'application# Juice Shop (pas de WAF — s'attendre à ce que tout soit contourné)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity avec OWASP CRS (s'attendre à ce que la plupart soient bloqués)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Processus principal Electron — toute la logique de test et IPC
│ ├── preload.js # Pont de contexte sécurisé
│ └── renderer/
│ ├── index.html # Coque de l'application
│ ├── styles.css # Thème sombre militaire/SOC
│ └── app.js # Logique UI, filtres, flux en direct, export
├── waf_tester.py # CLI Python — un seul fichier, aucune configuration nécessaire
├── package.json
└── README.md
waf_tester.py) — un seul fichier, fonctionne partoutMIT — voir LICENSE pour les détails.
Conçu pour les ingénieurs en sécurité qui ont besoin d'une validation WAF allant au-delà de la simple conformité.
| Option | Description | Par défaut |
|---|
--url | URL cible (obligatoire) | — |
--suites | Suites à exécuter, séparées par des virgules | toutes |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | Jeton, chaîne de cookie, ou valeur de clé API | — |
--auth-header | Nom de l'en-tête pour l'authentification par clé API | X-API-Key |
--auth-user | Nom d'utilisateur pour l'authentification de base | — |
--auth-pass | Mot de passe pour l'authentification de base | — |
--no-baseline | Désactiver la comparaison de référence | désactivé |
--no-rotate-ua | Désactiver la rotation du User-Agent | désactivé |
--waf-header | Envoyer l'en-tête d'identification X-WAF-Tester | désactivé |
--output | terminal, json, html (séparés par des virgules) | les trois |
--output-dir | Répertoire pour enregistrer les fichiers de rapport | . |
--timeout | Délai d'attente par requête en secondes | 10 |
--proxy | URL du proxy pour toutes les requêtes (ex. http://127.0.0.1:8080) | désactivé |
--confirm | Ignorer la demande de confirmation d'autorisation | désactivé |
| Score | Note | Signification |
|---|
| 90–100 % | A | Excellent — le WAF bloque presque tous les vecteurs d'attaque |
| 80–89 % | B | Bon — lacunes mineures à examiner |
| 65–79 % | C | Moyen — vecteurs de contournement notables présents |
| 50–64 % | D | Médiocre — lacunes de protection significatives |
| < 50 % | F | Critique — le WAF est largement inefficace |