MSSql MySql Python javascript PHP java DotNet Ruby Hackme Takeawy Code Twitter Facebook

The house of developers, A website to classify and rank developers

 
 
 
 
Country Rank: 2
World Rank: 16
Profile Viewed: 764
Points: 11864
11 Jul 2010

La faille MySQL Column truncation [FR]

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:

  • Un forum de discution ou un blog ou tous le monde peut s’enregistrer
  • Le champs username de la table utilisateurs est limité à 16 caractères
  • L’administrateur du forum est ‘admin’
  • MySQL est utilisé dans le mode par défaut
  • Pas de vérification sur la longueur du nom d’utilisateur

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'administration
04. 
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!

Facebook Share Delicious Share Digg Share Google Buzz Share My Space Share Reddit Share Stumbleupon Share Technorati Share Twitter Share

Comments

Please, login or register to add a comment.