Bypasser une authentification

Shiney June 2, 2011

1

en PHP et en s´curit´ des applications web sont n´cessaires a sa bonne compr´hension. Par o cons´quent. e e e ` e 1 Un lamer n’est pas un passionn´ de s´curit´ informatique. e e e 2 . vous ˆtes seul et unique e e responsable des cons´quences de vos actes. Des connaissances du protocole HTTP. vous devez savoir qu’en cas de piratage. en SQL. Je vous d´conseil fortement de e e mettre en pratique la d´monstration qui va suivre sur un site qui ne vous e appartient pas.Pr´face e Cet article ne prˆne absolument pas le piratage mais la connaissance. Ce document s’adresse a des professionnels et a des passionn´s de s´curit´ ` ` e e e 1 informatique .

. . . . . . . . . .5 Prise de contrˆle de la requˆte o e . . . . . . . . . . . . . . . . .1 Recherche du nombre de colonne . . . 1. . . .3 Hackbar . . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2. . . . . . . . . . . . . . . . . . . . . . . . .1 Rapide pr´sentation . . . . . .3 Final . . . . . .3. . . . . . . . . . . . . . . . .2 Utilisation . . . . . 10 2. . . . . . . . . 11 3 . . . . . . e 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. . 1. . . . .2 Syntaxe de l’UNION .2 Formulaire . . . . . . . . . . . . . . . . 1. .Contents 1 Analyse 1. . . . . . . . . . . . SQL . . . . . . 1. . . . . .1 Page d’authentification . . . . . . . . . . . . . . . . . . . . . 5 5 6 6 6 7 7 9 2 Exploitation 10 2. .4 Recherche d’une faille . .

Notre ´tude sera en grande partie bas´e sur e e e 2 des injections SQL et nous utiliserons l’extension hackbar avec Firefox. 2 Live Header ou Tamper Data peuvent ˆtre une alternative. e 4 . nous allons ´tudier une m´thode pour bypasser une authentifie e cation faillible a une injection SQL.Introduction Aujourd’hui. Pour cela. je prendrai comme exemple ` un site acad´mique de la NASA.

nous nous contenterons d’analyser le code source du formulaire. 1.1 Analyse Dans cette premi`re partie. Dans notre cas. une bonne analyse des informations envoy´es vers ce dernier est primordiale.org/db/login. Plusieurs m´thodes permettent de cone e naitre ces informations. constitu´ d’un nom d’utilisateur e et d’un mot de passe: http://www.1 Page d’authentification Voici notre page d’authentification classique. nous allons chercher une faille sur un script e d’authentification.php 5 . Pour se faire.nasa-academy.

php’ e e ea 1.org/members/DatabaseFAQ. <FORM METHOD=POST ACTION=”login. <p align=”center”> 8. sans-serif”> 26. </p> 7.1 Hackbar Rapide pr´sentation e Pour ´diter les donn´es que nous enverrons. </font> 23.1. analysons le code source du formulaire qui se situe ` gauche: a 1. sans-serif”> 21. sans-serif” size=”1”> 14. <p align=”center”> 3. Cette e e extension firefox se divise en 3 zones: 6 .php” type=”hidden”> 17. sans-serif” size=”1”>login with username:</font> 9. Helvetica. </font><br> 12. <input name=”pagefrom” value=”alumni. nous allons utiliser hackbar. </font> 28. </p> 29. </p><hr> 19. <font face=”Arial. <font face=”Arial. Helvetica.nasa-academy. Helvetica. Helvetica. </p> 24. sans-serif” size=”1”> 10.2 Formulaire Pour commencer.3 1.htm”>FAQ</a> 27. sans-serif” size=”1”>and passwd:</font><br> 13. <a href=”alumni. <font face=”Arial. <p align=”center”> 25. not logged in<br>(public view) 5. <input value=”Login!” type=”submit”> 18.3. Helvetica.php”> 2. </FORM> On constate que 3 param`tres sont envoy´s au script ’login. sans-serif”> 4. <font face=”Arial. <input name=”username” size=”7” type=”text”> 11.php’ via une e e methode POST: username : le nom du compte password : le mot de passe du compte pagefrom : un param`tre cach´ initialis´ ` ’alumni. <font size=”2” face=”Arial.php”>Search<br>(public)</a> 22. Helvetica. <p align=”center”> 20. </font><br> 16. <font size=”2” face=”Arial. <input name=”password” size=”7” type=”password”> 15. </font> 6. <font size=”2” face=”Arial. <a href=”http://www. Helvetica.

2 Utilisation Une authentification se fait de la mani`re suivante: e 1. un menu avec des fonctions tr`s utiles sur des chaines de caract`res e e 2. par cons´quent e e nous n’attaquerons pas le param`tre password. Nous allons nous focaliser sur e le param`tre username et tenter une fausse authentification dite t´moin et deux e e injections: T´moin. username = Shiney’ OR ’1’=’1 : pour essayer de bypasser une authentification de mani`re classique e 7 . d’´diter les donn´es d’une e e e requˆte POST et d’´diter l’entˆte referer e e e 3.3. un espace permettant d’´diter le champ url.1. username = ”‘ : pour provoquer une erreur 2. username = Shiney & password=Shiney e 1. charger les informations de la derni`re requˆte dans la zone 2. mettre en e e forme la zone de texte courante et ex´cuter la requˆte e e 1.4 Recherche d’une faille La plupart du temps les mots de passes sont encrypt´s en MD5.

Figure 1: Authentification t´moin e Figure 2: Injection 1 Figure 3: Injection 2 8 .

En effet. notre username est valide.] username = ’Shiney’ OR ’1’=’1’ [.] Cependant.. e On remarque que l’injection 1 n’a pas ´t´ concluante. notre injection a donc de nouveau fonctionn´e.Notre authentification t´moin nous montre que le script nous renvoie exactee ment la mˆme page lorsque l’identifiant n’est pas bon.] dans l’encadr´ ci-dessus). nous n’avons aucune id´e de ce qui se situe avant ou apr`s (signal´ e e e par [... c’est de comprendre cette requˆte e e e puis d’en prendre le contrˆle. e 9 . l’injection num´ro 2 est beaucoup plus interessante. e En revanche. Nous avons donc pris le contrˆle de la fin de la e o requˆte SQL. nous avons pu en cerner o a a une partie: SQL : [. 1. c’est donc pour cela que le script ` accept´ notre e a e username mais pas notre password. la e page nous indique que le password est incorrect ce qui montre que pour le script. Notre injection a permis de retourner n’importe quel username de la base de donn´e.. Nous allons donc dire au script que la suite e de notre injection repr´sente du commentaire ` l’aide du caract`re di`se : e a e e username = ’Shiney’ OR ’1’=’1’ # La page nous indique encore que notre password est incorrecte.. aucun message d’erreur ee ou de r´ponse notable de la part du script..5 Prise de contrˆle de la requˆte SQL o e L’objectif apr`s avoir localis´ une faille SQL. Grˆce ` notre injection 2.

mais nous ne savons laquelle e e correspond ` l’username ou au password. nous donne le nombre de colonne: e e username = Shiney’ OR 1=1 ORDER BY 5 # username = Shiney’ OR 1=1 ORDER BY 6 # 2. nous consid´rerons qu’une erreur correspond ` l’absence du message e a ’Incorrect password’.2 Exploitation Nous arrivons ` expliquer au script que notre username est valide mais pas notre a password. ´tant donn´ que rien ne peut ˆtre tri´ si il n’arrive pas ` retourner e e e e a un username . si e e 3 . Nous allons donc tester une UNION a afin d’observer la r´action du script. Cette expression u e e permet de trier les resultats en fonction de la n-`me colonne. alors la on augmente petit ` petit la valeur de n jusqu’` obtenir une erreur a a valeur pr´c´dente de n. Les colonnes seront initalis´es ` 0 et nous e e a remplacerons ’ OR 1=1 par ’ and 1=2 afin que le d´but de la requˆte SQL ne e e perturbe pas la suite de notre UNION. nous allons utiliser l’expression ORDER BY n o` n correspond au num´ro d’une des colonnes de la requˆte. Par cons´quent. Dans notre cas. 3 10 . Nous allons donc faire une UNION afin de donner au script les informations n´cessaires pour qu’il accepte notre authentification.1 Recherche du nombre de colonne Il est n´cessaire de connaitre le nombre de colonne de la premi`re requˆte afin de e e e pouvoir faire une UNION.2 Syntaxe de l’UNION Nous savons que la requˆte n´cessite 5 colonnes. e 2. Pour cela.

0.0 # . la partie ’moche’ de notre pseudo: username = Shiney <!.0.0.0..Notre injection aura donc une syntaxe du type: username = ’ and 1=2 UNION SELECT 0.0.’ AND 1=2 UNION SELECT 0.0. Il semblerait que le script accepte notre authentification.-> 11 .0.3 Final Pour le plaisir des yeux.0.0 # Nous nous sommes connect´s en tant que : ’ and 1=2 UNION SELECT e 0. si la requˆte e SQL renvoie un password qui a pour valeur 0.0 #. 2. nous allons mettre en commentaire HTML.0.

J’ai volone tairement ´pargn´ certaines explications tel que la signification de l’injection 1 e e ou de l’injection 2 afin d’inviter le lecteur ` poursuivre ses recherches dans les a injections SQL classique et ` l’aveugle. e e e Cela aurait pris beaucoup plus de temps et nous nous serions expos´s ` de nome a breuses contraintes notamment avec les password conserv´s en MD5. a 12 .Conclusion Cette d´monstration exploite tr`s clairement une injection SQL. nous aurions pu e e r´cup´rer les identifiants d’un des comptes directement depuis la base de donn´e.