Le mot de passe était azerty
Dans une petite entreprise, l'intranet laisse chacun choisir son mot de passe. La moitié des employés ont pris 123456 ou azerty.
Un soir, quelqu'un essaie une courte liste de mots de passe courants sur chaque nom de l'annuaire. En quelques minutes, il entre comme responsable comptable. Le site ne limitait pas les essais.
La règle unique
Attention
Ce laboratoire est un ensemble de leçons volontairement fragiles. Attaquez votre copie privée, et rien d'autre : elle n'a aucune sortie vers Internet. Attaquer un système qui n'est pas le vôtre, ou sans permission de test, est un délit dans presque tous les pays.
À la fin de cette leçon
Remarque
Je peux dire ce qui rend une connexion ou une session fragile.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Session | le temps pendant lequel un site se souvient que vous êtes connecté | |
| Cookie | une petite valeur que le navigateur garde et renvoie au site | |
| Jeton | une valeur qui prouve que vous vous êtes connecté | une longue chaîne |
| Hachage | transformer un mot de passe en une empreinte de longueur fixe, qu'on ne peut pas inverser | |
| Force brute | essayer beaucoup de possibilités les unes après les autres | |
| Expiration | le moment où une session ou un jeton cesse de fonctionner |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les mots de passe faibles tombent
On choisit des mots de passe courts et courants. Un attaquant n'a pas besoin d'astuce : il lui faut une liste des plus courants et un site qui accepte des essais sans fin. C'est la force brute.
Trois défenses vont ensemble. Exiger de la longueur plutôt que des symboles bizarres. Refuser les mots de passe d'une liste courante. Ralentir ou bloquer les échecs répétés.
Exemple travaillé : juger quatre mots de passe
| Mot de passe | Verdict | Pourquoi |
|---|---|---|
| 123456 | À refuser | Il est sur toutes les listes courantes |
| Printemps2025! | Faible | Un mot, une année et un symbole : un schéma que les devineurs connaissent |
| camion-pain-sept-chapeaux | Bon | Long, et sans schéma connu |
| lea | À refuser | Trop court, et identique au nom d'utilisateur |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Garder un hachage, pas le mot de passe
Un site ne doit jamais garder les mots de passe tels qu'ils sont tapés. Si ses données fuient, tous les comptes fuient.
Il garde un hachage du mot de passe, avec un sel aléatoire ajouté avant. Deux personnes au même mot de passe ont donc deux hachages différents. Pour vérifier une connexion, il hache l'essai et compare.
Un cookie de session est une clé
Une fois connecté, le site donne à votre navigateur un cookie de session, et il vous reconnaît grâce à lui à chaque requête. Celui qui possède cette valeur, c'est vous.
Elle doit donc être aléatoire et longue, envoyée seulement en HTTPS, cachée au script par HttpOnly, et elle doit expirer. Le site en émet aussi une nouvelle à chaque connexion.
Regardez les sessions du laboratoire
Votre laboratoire fait tourner WebGoat. Démarrez-le et attendez une minute. Ces trois commandes regardent la porte d'entrée sans vous connecter.
La deuxième demande une page qui exige une connexion. La troisième montre le cookie posé par cette réponse.
La page de connexion répond-elle ?
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/loginAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une page qui exige une connexion
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/welcome.mvcAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le cookie posé par cette réponse
curl -s -I http://web/WebGoat/welcome.mvc | grep -i "^set-cookie"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que disent les trois réponses
La première affiche 200 et aucune adresse. La deuxième affiche 302 et l'adresse de connexion : une page protégée renvoie l'inconnu à la porte. La troisième affiche un cookie JSESSIONID avec Path=/WebGoat; HttpOnly.
La valeur est aléatoire et change à chaque fois. HttpOnly est présent. Secure ne l'est pas, car ce laboratoire utilise du HTTP simple.
Une erreur fréquente
Attention
Beaucoup pensent qu'un jeton qui ressemble à des lettres au hasard est caché. Encoder n'est pas chiffrer. Un jeton qui encode seulement le nom d'utilisateur peut être lu et modifié par tous. Utilisez un identifiant de session aléatoire que le serveur retrouve, ou un jeton signé que le serveur vérifie. Vérifiez aussi l'expiration.
Un jeton doit être signé et expirer
Certains sites donnent un jeton signé qui contient le nom, un rôle et une expiration. Le serveur vérifie la signature avant de croire quoi que ce soit dedans.
Un jeton sans signature, un jeton que le serveur ne vérifie pas, ou un jeton qui n'expire jamais est faible. Refusez les trois.
Exemple travaillé : trois jetons
| Le jeton dit | Signé ? | Verdict |
|---|---|---|
| lea, rôle client, expire demain | Oui | À accepter |
| lea, rôle admin, expire demain | Non | À refuser : personne ne garantit le rôle admin |
| lea, rôle client, expiré depuis une semaine | Oui | À refuser : il est expiré |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.