Un MD5 qui n'en est pas un ?!

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 01:01

Bonjour,

J'ai récemment fait un forum avec MyBB et lorsque je m'inscrit, le mot de passe est normalement transmit vers ma table sql en MD5.
Or, quand je prend le mot de passe test123

(Qui normalement en MD5 donne : cc03e747a6afbbcbf8be7668acfebee5)

met cette suite de chiffres et lettres dans la colonne du mot de passe : a199f55a5758e2f24926e608cc0a806c

Donc j'ai été voir les script de la page d'insertion du mot de passe. Le mot de passe s'envoie en MD5 d'après le scripts.

le script:
	
	
$password = random_str();
$logindetails = update_password($user['uid'], md5($password), $user['salt']);
J'ai l'impression que c'est pas du md5 mais un code aléatoire...
Si je voudrais faire une page de connections sur mon Index qui va utiliser les donner de l'utilisateur pour la connection, comment je peux faire en sorte que sa trouve le mot de passe ? (car si je marque test123 comme mot de passe sur mon index, sa dit que le mot de passe n'est pas bon. Alors que sur le Forum, le mot de passe marche.)

Mammouth du PHP | 19672 Messages

11 août 2011, 01:09

Le troisième paramètre n'a rien évoqué pour toi ? Tu devrais peut-être approfondir pour voir ce que fait exactement ta fonction update_password() et à quoi sert ce troisième paramètre.

Je peux me tromper, mais ça sent le double hachage, un premier avec md5 qu'on voit tout de suite, la suite avec une autre fonction utilisant un « grain de sel » pour modifier la manière de chiffrer ou hacher.... :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 01:16

Bah, quand je fait une recherche de 'update_password' sur la page de script, sa n'en trouve que 1. (Celui que j'ai poster dans mon premier message)

De plus, s'il y a des scripts de hackage dedans, c'est avec les développeurs de MyBB qu'il faut en parler ;)

Mammouth du PHP | 19672 Messages

11 août 2011, 01:25

Il y a sûrement un include quelque part et la fonction update_password doit être définie ailleurs.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 02:04

Aucun Include...

Je commence a penser que se script utilise de la vrais magie...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 août 2011, 03:19

update_password => fichier inc\functions_user.php ligne 137

dont voici le contenu
<?php
/**
 * Updates a user's password.
 *
 * @param int The user's id.
 * @param string The md5()'ed password.
 * @param string (Optional) The salt of the user.
 * @return array The new password.
 */
function update_password($uid, $password, $salt="")
{
	global $db, $plugins;

	$newpassword = array();

	// If no salt was specified, check in database first, if still doesn't exist, create one
	if(!$salt)
	{
		$query = $db->simple_select("users", "salt", "uid='$uid'", array('limit' => 1));
		$user = $db->fetch_array($query);
		if($user['salt'])
		{
			$salt = $user['salt'];
		}
		else
		{
			$salt = generate_salt();
		}
		$newpassword['salt'] = $salt;
	}

	// Create new password based on salt
	$saltedpw = salt_password($password, $salt);

	// Generate new login key
	$loginkey = generate_loginkey();

	// Update password and login key in database
	$newpassword['password'] = $saltedpw;
	$newpassword['loginkey'] = $loginkey;
	$db->update_query("users", $newpassword, "uid='$uid'", 1);

	$plugins->run_hooks("password_changed");

	return $newpassword;
}
/**
 * Salts a password based on a supplied salt.
 *
 * @param string The md5()'ed password.
 * @param string The salt.
 * @return string The password hash.
 */
function salt_password($password, $salt)
{
	return md5(md5($salt).$password);
}

/**
 * Generates a random salt
 *
 * @return string The salt.
 */
function generate_salt()
{
	return random_str(8);
}

/**
 * Generates a 50 character random login key.
 *
 * @return string The login key.
 */
function generate_loginkey()
{
	return random_str(50);
}
?>
celles qui manque tu les trouveras dans fonctions.php (random_str, my_rand etc etc)

trouvé en 5 minutes (téléchargement compris) ^^

au final c'est bien un double MD5 comme l'indique Cyrano :)

pour ce qui est de l'include, ne sachant pas dans quel fichier tu cherche, je ne peux pas t'aider, mais en gros je pense qu'il s'agit d'un fichier inclus et le fichier incluant à inclus les fichiers de fonction avant (je pas certain que ce soit clair toute ces inclusions ?)


@+
Il en faut peu pour être heureux ......

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 03:24

donc c'est un MD5 d'un MD5 ? :shock:

Eléphant du PHP | 343 Messages

11 août 2011, 03:29

Apparemment oui, je ne vois pas ce qui est choquant.
Personnellement, je hash toujours 2 fois avec un algo différent à chaque fois + 1 gds (après ca dépend ce que tu protèges aussi).
Développeur web

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 août 2011, 03:32

oui
function salt_password($password, $salt)
{
return md5(md5($salt).$password);
}

tu fait :
- un md5 du mot de passe (ça c'est dans l'appel de la fonction)
- un md5 du grain de sel (ça c'est dans la fonction salt_password ci dessus)
- tu fait un md5 du tout ^^

pourquoi ?

parce que "casser" un MD5 c'est commode mais n'importe quel idiot peux y arriver avec des dictionnaires de mots ou un générateur de caractère qui test toutes les possibilités (bon et beaucoup, beaucoup, beaucoup de temps ;) ).
la pour le coup faut "casser" le md5 global ensuite pouvoir trouve grain de sel et mot de passe (en MD5) et faire le tric du mot de passe, c'est pas de la tarte. La pour le coup c'est beaucoup plus simple de faire un brute force directement sur le formulaire ou essayé une injection SQL etc etc :)


@+
Il en faut peu pour être heureux ......

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 03:35

Donc si je comprend bien, je devrais faire mon script de connections comme ceci :
SELECT * FROM accounts WHERE name = '" . $username . "' AND password = '" . md5(md5($password)) . "'
? :? le double md5 me mélange un peu...

Eléphant du PHP | 343 Messages

11 août 2011, 03:42

Hé non, pourquoi tu ne reprends pas la fonction qui génère le pass? Et puis bonjour l'injection là :lol:
Développeur web

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 03:52

donc
password = '" . md5(md5($salt).$password) . "'


?
Je dois dire que mon affaire devin plus complexe que je ne l'aurais crus...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 août 2011, 03:57

bof au pire y a des fonctions toutes prêtes pour cela dans le forum mybb donc autant les utiliser :mrgreen:

sachant que le grain de sel est dans la table va falloir récupérer les grain de sel et le mot de passe "codé" pour ensuite tester la validité de celui ci :)

d'ailleurs cela permet d'éviter de tester u truc s'il n'y a aucun résultat de retourné par la requête (mauvais nom d'utilisateur par exemple).

@+
Il en faut peu pour être heureux ......

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 04:47

mais on peux se protéger contre le injection avec 'echo htmlspecialchars' non ?

Mammouth du PHP | 19672 Messages

11 août 2011, 06:53

mais on peux se protéger contre le injection avec 'echo htmlspecialchars' non ?
:shock: Dis moi, t'es-tu jamais demandé si tu savais réellement de quoi tu parlais, parce que là tu es en train de dire vraiment n'importe quoi, cette simple question/affirmation n'a absolument aucun sens !

Au lieu de faire semblant de savoir et d'employer des expression un peu techniques qui « ont l'air bien », pose des questions pertinentes surtout lorsque tu ne sais pas ce que signifie quelque chose, tu n'y perdras pas ta crédibilité bien au contraire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: