sqli - injection sql

Injections SQL

Les pirates informatiques utilisent diverses façon pour pénétrer dans les systèmes informatiques. Les sites web ne sont pas épargnés et constituent des cibles de choix pour différentes raisons (récupérer des données, se servir de sites web pour lancer d’autres attaques ou déposer des liens dans une logique de référencement/netlinking).

Une des portes privilégiées pour entrer à l’intérieur d’un site web est de passer par sa ou ses bases de données. Tous les sites n’en possèdent pas mais la plupart des CMS avec lesquels sont conçus les sites web modernes (WordPress en est un exemple très célèbre – il propulse ce site !) utilisent une base de données.

On parle alors d’injection SQL (ou SQLi pour SQL injection).

Pour les pirates, l’idée est d’utiliser une fonctionnalité du site pour rentrer à l’intérieur de la base de données en détournant l’objectif initial. Pour y arriver, on peut imaginer diverses approches :

  • Utiliser des formulaires présents sur le site (par exemple un formulaire de recherche, un formulaire de contact, un formulaire de connexion à un espace privé…) ;
  • Utiliser directement les URLs du site.

Les pirates vont volontairement saisir des commandes SQL à l’intérieur des formulaires ou des URLs. Leur souhait est d’espérer que la valeur saisie sera exécutée par le serveur du site web. Concrètement, le pirate modifie une requête SQL en y injectant du code sur mesure qui va altérer ou modifier la requêtes initiale et permettre l’exécution d’une requête différente.

Exemple d’une injection SQL

On pourrait imaginer que le serveur vérifie l’identifiant et le mot de passe pour accéder à un espace privé. Pour cela, le serveur pourrait exécuter la requête suivante après le remplissage d’un formulaire de connexion :

SELECT * from utilisateur WHERE identifiant='$login' AND motdepasse='$password';

Cette requête toute simple vérifie si un utilisateur et un mot de passe correspondent bien avec les données présentes dans la table des utilisateurs de la base de données.

Si dans le champ d’identifiant du formulaire, le pirate saisit : ‘ OR 1=1# que va-t-il se passer ? Pour le serveur de base de données la requête devient :

SELECT * from utilisateur WHERE identifiant='' OR 1=1#AND motdepasse='$password';

En SQL, le # indique un commentaire. Concrètement, le serveur de base de données exécutera :

SELECT * from utilisateur WHERE identifiant='' OR 1=1

La requête recherchera alors un utilisateur dont l’identifiant est vide ou bien si 1 est bien égal à 1. Comme la seconde partie de la requête sera toujours vrai (1 est toujours égal à 1) alors, le feu vert sera donné.

C’est un exemple très basique mais on peut le coupler avec des requêtes qui permettent de lire, modifier, ajouter ou supprimer des données.

Se prémunir des injections SQL

Il existe aujourd’hui tout un ensemble de bonnes pratiques pour éviter les injections SQL. Elles sont bien prises en compte sur les développements solides. Sur les développements rapides ou amateurs, les bonnes pratiques sont rarement présentes.

Dans tous les cas, ça vaut le coup de poser la question à son prestataire ou de lancer un audit rapide sur son propre outil (il existe des outils gratuits en ligne et de nombreux outils commerciaux de tests d’intrusion).