Jeudi le 10 septembre 2009 à 03:07

La faille MySQL Column truncation

Par Mohammed CHERIFI

mysql column truncation

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 :

if(!empty($_POST['username']) && !empty($_POST['password']){
$username = $_POST['username'];
$password= $_POST['password'];
if(login($username,$password)){
$userdata = getUserInfoByLogin($username);
}
}

la fonction getUserInfoByLogin()


function getUserInfoByLogin($username){

$query = mysql_query("SELECT * FROM utilisateurs WHERE username = '$username");

$userinfo= mysql_fetch_array($query);

return $userinfo ;

}

Espace membre


if($userdata['username'] == 'admin'){

//espace privé : console d'administration

}

else{

// espace membre!

}

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!

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap
Tags :, , ,

Articles similaires

9 Commentaires to La faille MySQL Column truncation

Avatar

pynsso

septembre 10th, 2009 at 4 h 17 min

j’att une article detaillé sur les injections sql de ta part :D
sir ts7er ++

Avatar

Mohammed CHERIFI

septembre 10th, 2009 at 4 h 23 min

@pynsso, ça ne va pas tarder mon ami, keep ON!

Avatar

UpDeL

septembre 10th, 2009 at 4 h 25 min

OMG impressionnant ! j’apprends tout les jours quelques chose de nouveau sur ton blog, très informatif attend que je fais quelques tests :O

Avatar

UpDeL

septembre 10th, 2009 at 5 h 23 min

La solution serait donc un
if(strlen($_POST['username']) > 100){
echo »Pseudo trop long »;
}

ou mieux encore limiter les caractères à 100 et interdire les espaces et les caractères spéciaux genre :

preg_match(« /^[a-z0-9_\-]{5,100}$/ », $_POST['username']);

Avatar

Mohammed CHERIFI

septembre 12th, 2009 at 17 h 47 min

Oui @UpDel, vérifier avec une expression régulière me semble la meilleur solution!

Avatar

Mehdi

septembre 14th, 2009 at 12 h 23 min

comme d’habitude un bon sujet !

mais

pour un varchar par exemple ça me donne cette erreur
#1406 – Data too long for column ‘df’ at row 1

pour un TEXT ca l’enregistre !

Avatar

Mohammed CHERIFI

septembre 15th, 2009 at 22 h 06 min

@Mehdi, c’est quoi la version mysql que tu utilise? avait elle la configuration par defaut?

fait ce petit test et dis moi ce que ça donne :
Tu crée la table utilisateurs :

CREATE TABLE `utilisateurs` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 12 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL
) ENGINE = MYISAM

Puis tu insère un utilisateur dont le nom dépasse 12 caractères

INSERT INTO `test`.`utilisateurs` (
`id` ,
`username` ,
`password`
)
VALUES (
NULL , ‘abcdefghijklmno’, MD5( ‘test’ )
);

abcdefghijklmno ça fait 15 caractères, la requête sql aboutit mais un warning s’affiche! (cf http://www.mcherifi.org/data/mysqltruncation/warningtruncated.png )

si on affiche la les lignes de la table user on trouvé bien notre enregistrement mais tronqué à 12 caractères (cf http://www.mcherifi.org/data/mysqltruncation/truncatedcolumn.png)

par-contre pour un champs de type TEXT il n’y aura pas de warning, il sera correctement enregistré!

Avatar

Mehdi

septembre 15th, 2009 at 23 h 40 min

Version du client MySQL: 5.0.51a

ça donne :

#1406 – Data too long for column ‘username’ at row 1

et rien n’est enregistré …

Avatar

Stack

octobre 20th, 2009 at 1 h 38 min

beau boulot mon frère en apprend toujours de toi quelque chose de très spéciale

Réagissez à ce billet

Categories

Derniers commentaires

  • Victor: Roseny : Pour avoir les mois en Français voici mon code : $dateWidget = new sfWidgetFormI18nDate(array(...
  • abdessamad: Salam, Salutation pour cet article, N.B :  » Un md5 est une chaine de caractère en hexadécimal...
  • 0x1337: Nice tuto bien structuré et synthétisé ! La question qui se pose est ce un attaquant peut faire un Privilege...
  • Roseny: Bonjour, comment fais-t’on pour mettre les mois en français?
  • Laurent: Bonjour Mohammed et merci pour ce tuto. Que faut-il modifier pour que le champ date soit en un seul bloc au...
  • Stack: dommage que le co.ma était hacké aussi
  • Technologix: Très bon article, gg ;)
  • Wail: très bien expliqué mon khoya, génial
  • UpDeL: Respect !
  • El King Zizou: trés bonne explication j’aimerai bien voir des autres articles des attaques sur le web :)...

Flickr PhotoStream

  • Au dessus des montagnes
  • Nuages
  • Insolite hopital marocain
  • Plage bouznika
  • Maroc Blog awars with vladimire
  • Linux Party 2010 - EMI (Maroc)
  • Mawazine 2008
  • Essaouira
  • Rabat Ville with baba mimoun
  • Fucking CowBoyz
  • Essaouira 2009 - En attente de l'arrivé du cheb khaled!
  • Linux Install party Mohammadia

Twitter Feed


Warning: fread() [function.fread]: Length parameter must be greater than 0 in /homepages/44/d193174039/htdocs/mcherifi/wp-content/plugins/wordpress-twitter/BiBTweets.php on line 199
  • mcherifi: Underground Parking System http://bit.ly/aI440T original! le 27 Jul 2010 10:58
  • mcherifi: @halflings un moment j'ai pensé qu'il s'agit d'une erreur, c'est en lisant bien que j'ai compris que ya aussi #freelansing lol le 27 Jul 2010 10:38 en réponse à halflings
  • mcherifi: Comment réaliser sa première photographie en freelensing? http://bit.ly/daZewv le 27 Jul 2010 09:45
  • mcherifi: Une nouvelle loi vient d’être adoptée en #Tunisie , elle intérdit les fessées données aux enfants! Qu'allez vous faire si c'était au #Maroc ? le 26 Jul 2010 16:57
  • mcherifi: Faut-il suivre ses passions ou s’orienter vers du lucratif ? http://bit.ly/99Nsiu le 26 Jul 2010 16:30
  • mcherifi: Safari v4 & v5 critical vulnerability in the AutoFill feature http://bit.ly/9yVKco #safari #security #autofill le 26 Jul 2010 14:41
  • mcherifi: RT: @agharass : Est ce que vous avez un compte http://meme.yahoo.com ? Plz RT le 24 Jul 2010 21:20
  • mcherifi: @A_T_J pas encore mon ami, la soirée vient à peine de commencer ;) ce n'est pas qu'on tweetant pas qu'on dors :P le 24 Jul 2010 03:06 en réponse à A_T_J
  • mcherifi: Trop drôle! Insultes de développeurs http://ping.fm/SKdvT #fordeveloppersonly le 20 Jul 2010 09:02
  • mcherifi: Si vous aimez les pentests voici un ISO pour s'entrainer avec l'OS le plus vulnérable au monde http://ping.fm/a5rKi #damnvulnerablelinux le 20 Jul 2010 08:58
  • mcherifi: Oulah! c'est mon 1000 tweet, Happy day à tous! le 20 Jul 2010 08:56
  • mcherifi: Frameworks PHP: Symfony vs CodeIgniter http://ping.fm/MnLvy le 14 Jul 2010 15:42
  • mcherifi: D'ici fin juillet, l'enveloppe annuelle de la compensation sera déjà épuisée ! Que va faire l'Etat ? http://ping.fm/t2ym2 le 14 Jul 2010 14:00
  • mcherifi: Real Social Dynamics Nation : Smart people http://ping.fm/g2zfw le 14 Jul 2010 11:26
  • mcherifi: just achieved all WabLab HackMe challenges http://bit.ly/dClKUj Actual Rank: Morocco 1, World 10, waiting for the next contests.. le 11 Jul 2010 16:52
  • mcherifi: le monde est fondé sur des conventions, ce que accepte la majorité est souvent ce qui est adopté même si il est faux! le 11 Jul 2010 10:49
  • mcherifi: Youpii, ma carte son Creative Sound Blaster Live marche à merveille sous Ubuntu Lucid lynx, VIVA LINUX <3 ! le 10 Jul 2010 22:20
  • mcherifi: si vous avez du mal avec les dns google voici une version standalone du chat audio/video dans gmail 3http://ping.fm/S76qv le 06 Jul 2010 15:32