Faille dans l'algo de SPIP du GRAIN DE SEL
salut,
je viens rajouter mon grain de sel, car effectivement j'ai trouvé une faille dans celui-ci.
Je ne sais pas si SPIP utilise toujours ce que Mathieu a expliqué pour leur systeme de login, mais je pense avoir trouver une grosse faille.
Citation:
Envoyé par mathieu
la base de données contient les 3 champs suivant par login
- le grain de sel (que je vais appeler GDS)
- un champ égal à md5(GDS + mot de passe)
- le grain de sel suivant (GDS2)
La méthode est la suivante :
- un 1er formulaire demande le login
- envoie du login au serveur
- le serveur renvoie un 2ème formulaire de saisie du mot de passe. ce formulaire connaît GDS et GDS2 de la base de la base de donnée pour ce login
- le javascript de ce formulaire s'occupe de ne pas envoyer le mot de passe mais seulement les informations "md5(GDS + mot de passe)" et "md5(GDS2 + mot de passe)"
- le serveur compare la valeurs "md5(GDS + mot de passe)" avec la base de données et si c'est correct, l'utilisateur est authentifié, GDS2 remplace GDS dans la base de données, "md5(GDS2 + mot de passe)" est mis dans le 2ème champs et un nouveau GDS2 est généré.
Disons que l'utilisateur se loggue :
il entre son mdp et avec javascript il envoie au serveur md5(GDS+mdp) et md5(GDS2+mdp), le serveur dis oki ca correspond avec ce que j'ai, il remplace son md5 par md5(GDS2+mdp) remplace son GDS par GDS2 et recréé un nouveau GDS2.
Jusque la tout le monde est d'accord. mais en fait y avait un petit malin qui écoutait entre le pc et le serveur.
Je rappelle que dans ce cas on essayait de trouver un moyen pour ne pas utiliser un protocole SSL (https)
Donc le hacker a ecouter md5(GDS+mdp) et md5(GDS2+mdp) or voila le premier ne lui sert a rien on est bien d'accord, mais le deuxieme ... BAh c'est EXACTEMENT le md5 que le serveur attend pour la prochaine connexion !!! Y a comme un probleme ici.
Donc apres le hacker se connecte avec le md5(GDS2+mdp) en l'envoyant au serveur et en donnant un autre md5 (celui qu'il veut) et ainsi il prend la place de l'internaute sans aucune difficulté !!
Qu'en dites vous ??
Heureusement (il y a findus) j'ai une solution.
- Sur le serveur :
1. Grain de Sel (GDS)
2. le md5(mdp)
- Coté client :
1. le mec demande a se connecter avec son login
2. il a une demande de mdp, dans ce formulaire, il y a le GDS de son login
3. le javascript (ou autre) fait un (suivez bien) md5(GDS+md5(mdp)) Ce qui fait que quelque chose d'inutile est envoyé en clair au serveur.
4. le serveur recoit ce md5, fait (lui meme, donc en php) md5(Grain de sel de la BDD + md5(mdp) de la BDD) et compare ces deux md5.
5. le GDS est changé.
- Avantages :
- le md5 que le hacker peut chopper en clair ne sert qu'une seule foi et du coup c'est déja trop tard le GDS a été changé
- l'utilisateur est content
- pas besoin de SSL (la j'abuse je pense mais bon ...)
Inconvenients :
- besoin de deux formulaires
vous allez me dire que le md5(du mdp) est stocké comme ca sur la BDD, mais c'est le cas sur la plupart des appli non ??