Problème avec MD5

debbv Messages postés 14 Date d'inscription samedi 19 décembre 2009 Statut Membre Dernière intervention 14 mars 2011 - 7 févr. 2011 à 12:06
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 8 févr. 2011 à 00:43
Salut à tous ,
Je viens par ce message vous présenter une faille que j'ai avec une application que j'ai eu à developper. La faille se trouve au niveau de la zone de connexion.
Pb :
- Au fait j'ai une page login.php dans laquelle un user va saisir son login et son passwd.Cette page va sur une autre page appélée REDIRECT.PHP
- REDIRECT.PHP cherche si le login et le passwd MD5 existe dans ma base MYSQL .et affiche une page accueil.php si c bon ou error.php si c pa bon.
La faille : un user entre test et 1234 ça passe car ce compte existe dans la base (Page acceuil.php).
mais s il entre test et 1234' il a accès a la Page acceuil.php .
Or 1234 et 1234' sont differents .
////////////////////////////////////////////////////////////////////////////////
Mon code : Redirect.PHP
///////////////////////////////////////////////////////////////////////////////
<?php
// REDRIRECTION PASSWORD

require 'config.php';
$connect = mysql_connect ("localhost","root",$password);// or die('Erreur de connexion'.mysql_error());
mysql_select_db ($base);////or die('Erreur de connexion'.mysql_error()) ;
$log=mysql_real_escape_string($_POST['log']);
$mdp2=mysql_real_escape_string($_POST['pwd']);
$mdp=MD5($login + "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio" + $mdp2 +$login+$mdp2);
$sql = "select * from compte where login='$log' and pass='$mdp' ";
$req = mysql_query($sql);
$num = mysql_num_rows($req);
if ($num >=1)
{
session_start();
$_SESSION['log']=$log;
$_SESSION['mdp']=$mdp;
header('Location:accueil.php');

}
else
{
header('Location:error_pass32.php');

}
//}
?>

////////////////////////////////////////////////////////////////////////////
Mon HASH a la création du compte
////////////////////////////////////////////////////////////////////////////
$mdp=MD5($login + "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio" + $mdp2 +$login+$mdp2);


//////////////////////////////////////////////////////////////////////////////////
Merci et je compte sur vous
////////////////////////////////////////////////////////////////////////////////
Mon application marche sur près de 90 Positions et des infos ne doivent pas être vue par tout les users
Et je suis le seul a savoir k il ya faille actuellement

3 réponses

debbv Messages postés 14 Date d'inscription samedi 19 décembre 2009 Statut Membre Dernière intervention 14 mars 2011
7 févr. 2011 à 12:13
Ce que je vois 1234 et 1234'
ont le même HASH
0
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
7 févr. 2011 à 18:10
lut,

Deux choses :
- $log n'est pas défini
- Addition et concaténation sont deux choses différentes

Correction :

$login=mysql_real_escape_string('test');
$mdp2=mysql_real_escape_string("1234");
$mdp_TEST1=MD5($login . "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio" . $mdp2 .$login.$mdp2);

var_dump($mdp_TEST1);

$login=mysql_real_escape_string('test');
$mdp2=mysql_real_escape_string("1234'");
$mdp_TEST2=MD5($login . "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio" . $mdp2 .$login.$mdp2);

var_dump($mdp_TEST2);

if($mdp_TEST1===$mdp_TEST2)
echo "faille !!";
else
echo "correct";


______________________________________________________________________
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
8 févr. 2011 à 00:43
Salut,

Afin de compléter la juste remarque de phpAnonyme, je vais expliquer le pourquoi du comment de l'histoire :

Afin de réaliser l'addition (et non la concaténation), les chaînes de caractères sont converties en leur valeur décimale (ou flotante). Ainsi, une chaîne ne représentant pas de nombre est convertie en 0 et, si sa première portion représente un nombre (mais pas la suite), alors elle sera convertie en ce nombre (donc 1234' est convertis en 1234). Si on refais l'addition dans ce sens, le "$login + "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio" + $mdp2 +$login+$mdp2" revient à : "0 + 0 + 1234 + 0 + 1234", soit 2468 dans les deux cas, d'où l'égalité des md5.

Pour s'en persuader :
<?php

var_dump(null + "zo5pro$1pvkhj6cz4a8ùtvb#ui4oeuio"); // 0                       
                                                                                
var_dump(0 + "1234"); // 1234                                                   
var_dump(0 + "1234'"); // 1234                                                  

var_dump(1234 + 'test'); // 1234                                                

var_dump(1234 + "1234"); // 2468                                                
var_dump(1234 + "1234'"); // 2468                                               

?>


Plus d'informations :
Conversion de chaînes en nombres
La précédence des opérateurs
0
Rejoignez-nous