Injections SQL et méthodes de protection
Auteurs : Rémi Rebillard et Loïc Robergeon
Les injections SQL (ou SQLi pour SQL Injection) est une une faille de sécurité dans les formulaires. On injecte dans une requète SQL, un morceau de requête qui n'est pas prévu par le système et va alors renvoyer des informations qui lui sont normalement caché, voir même les modifier.
Historique du SQL
Le SQL (Structured Query Language) est un langage informatique permettant d'intéragire avec différente base de données relationnelles.
Qu'est ce que c'est ?
Les injections SQL s’effectue principalement sur des formulaires dans des pages Web. Ces formulaires demande des informations à l'utilisateurs (login, mot de passe...), qui vont être saisie par l'utilisateur. Cette saisie est alors utilisé dans la requète SQL afin de récupérer les informations désirées par l'utilisateurs. Cette requète SQL interagie directement sur la base de donnée du serveur.
<<Image exemple formulaire>>
Cependant, certains site web sont mal configuré, et des failles apparaisse alors dans ceux-ci. Par exemple, au lieu de rentrer son login dans le précédant formulaire, on rentre d'autres informations comme :
<<Image exemple injection dans un formulaire>>
Ces caractères sont spéciaux car ils vont interagir directement sur la requète SQL lié au formulaire. Au lieu de se servir des informations présentes dans le formulaire, les informations vont modifier la requête et retourner des informations qui ne sont pas accessible a l'utilisateurs.
L'utilisateur va alors pouvoir effectuer diverse actions sur la base de donnée, comme consulter la liste des personnes présente avec leurs informations personnels, ou même la modifier.
Quels sont les différents types d’injection ?
Connexion sans mot de passe :
<<Image exemple injection dans un formulaire sans mot de passe>>
SELECT * FROM Users WHERE name='Alice'; -- 'AND password = 'xxx';
Cette requète signifie qu'on souhaite se connecter avec l'utilisateurs "Alice". Cependant grace au caractère "--", la suite de la requète va alors être transformer en commentaire, et ne sera pas compiler par la requète SQL.
Cette requête va récupérer toute les informations sur l'utilisateurs "Alice" présents dans la base de donnée tel que le nom, le prénom, l'adresse ou même leurs numéro de carte de crédit.
Connexion avec mot de passe toujours vraie :
<<Image exemple injection dans un formulaire avec mot de passe>>
SELECT * FROM Users WHERE name='Alice' AND password = or '1==1'; --;
Cette requête va récupérer la liste de tout les utilisateurs présents dans la base de donnée tel que le nom, le prénom, l'adresse ou même leurs numéro de carte de crédit.