| Country Rank: | 2 |
|---|---|
| World Rank: | 16 |
| Profile Viewed: | 764 |
| Points: | 11864 |
|
11 Jul
2010
|
La faille MySQL Column truncation [FR]
By: Mohammed CHERIFI
|
Hello les amis !
Aujourd’hui, je vous parlerai d’un nouveau type de faille, il s’agit de MySQL column truncation!
Pendant que les failles du types SQL Injections restent parmi les vecteurs d’attaque les plus discutés sur le Web, il existe un autre genre qui a été discuté pour la première fois par Stefan Esser, ce dernier a illustré son exploitation dans un bug reporté sur bugtraq affectant wordpress!
Comment ça marche ?
Par défaut, la comparaison de deux chaine de caractère dans MySQL ne se fait pas en mode binaire, ceci se fait en « relaxed mode », ce mode compare deux chaines on ignorant les espaces et les caractères nuls de la fin de la chaine, du coup, pour mysql, la chaine de caractères ‘admin’ est égale à ‘admin ‘! .
De ce fait mysql refusera d’enregistrer un nouvel utilisateur qui essaie de s’incrire avec ‘admin ‘ (admin+espace) ce qui est tout à fait logique!
Ou est le problème?
Pour illustrer le problème on immagine l’application suivante:
Qu’est ce qui se passe si on essaie de créer un compte avec comme nom d’utilisateur ‘admin xD’ (admin+11 espaces+xD) et un mot de passe ‘p455wd’:
MySQL va cherche si il existe un utilisateur avec comme username ‘admin xD’, et comme aucun utilisateur ne l’as pris l’application va l’accepter et continuera pour inserer le nouvel utilisateur dans la base.
La chaine du nom d’utilisateur fait 18 caractères (admin+11 espaces+xD), mySQL va automatiquement tronquer les deux dernier caractères (xD) car le champ username est limité à 16 caractères, ce qui donnera ‘admin ‘ (admin+11 espaces), ce dernier sera accepté par l’application et inséré dans la table d’utilisateurs, on aura donc deux utilisateur avec le même login ‘admin’ (rappellez vous que la comparaison en mysql dans le mode par défaut ne prends pas en compte les espaces!).
Dans ce cas, un problème de sécurité potentiel peut affecter l’application, en dépendance de la façon dont elle traite le champ username!
Exemple d’une application vulnérable:
Connexion :
1.if(!empty($_POST['username']) && !empty($_POST['password']){2.$username = $_POST['username'];3.$password= $_POST['password'];4.if(login($username,$password)){5.$userdata = getUserInfoByLogin($username);6.}7.}la fonction getUserInfoByLogin()
01.function getUserInfoByLogin($username){02. 03.$query = mysql_query("SELECT * FROM utilisateurs WHERE username = '$username");04. 05.$userinfo= mysql_fetch_array($query);06. 07.return $userinfo ;08. 09.}Espace membre
01.if($userdata['username'] == 'admin'){02. 03.//espace privé : console d'administration04. 05.}06. 07.else{08. 09.// espace membre!10. 11.}Resultat:
Puisque l’attaquant a un compte avec le login ‘admin ‘, il pourra se connecter à ce dernier avec le passe ‘p455wd’ ! et puisque l’enregistrement du vrai administrateur est le premier en base, celuila sera retourné ! et l’attaquant aura accès à l’espace administrateur du forum!
Ceci est juste une illustration, la faille peut se présenter différemment sur une application web,je cite là wordpress qui était le premier victime de ce type de vulnérabilités!
Comment sécuriser mon application?
Toujours vérifier la longueur des champs sensibles (comme username dans notre exemple), et interrompre l’exécution de votre application si cella dépasse la longueur maximale configurée dans votre table mysql!