Injection SQL

Injection SQL

Une injection SQL est un type d'exploitation d'une faille de sécurité d'une application interagissant avec une base de données, en injectant une requête SQL non prévue par le système et pouvant compromettre sa sécurité.

Sommaire

Exemple

Considérons un site web dynamique (programmé en PHP dans cet exemple) qui dispose d'un système permettant aux utilisateurs possédant un nom d'utilisateur et un mot de passe valides de se connecter. Ce site utilise la requête SQL suivante pour identifier un utilisateur :

SELECT uid WHERE name = '(nom)' AND password = '(mot de passe hashé)';

L'utilisateur Dupont souhaite se connecter avec son mot de passe "truc" hashé en MD5. La requête suivante est exécutée :

SELECT uid WHERE name = 'Dupont' AND password = '45723a2af3788c4ff17f8d1114760e62';

Attaquer la requête

Imaginons à présent que le script PHP exécutant cette requête ne vérifie pas les données entrantes pour garantir sa sécurité. Un cracker pourrait alors fournir les informations suivantes :

  • Utilisateur : Dupont' --
  • Mot de passe : n'importe lequel

La requête devient :

SELECT uid WHERE name = 'Dupont' -- ' AND password = '4e383a1918b432a9bb7702f086c56596e';

Les caractères -- marquent le début d'un commentaire en SQL. La requête est donc équivalente à :

SELECT uid WHERE name = 'Dupont';

L'attaquant peut alors se connecter sous l'utilisateur Dupont avec n'importe quel mot de passe. Il s'agit d'une injection de SQL réussie, car l'attaquant est parvenu à injecter les caractères qu'il voulait pour modifier le comportement de la requête.

Supposons maintenant que l'attaquant veuille non pas tromper le script SQL sur le nom d'utilisateur, mais sur le mot de passe. Il pourra alors injecter le code suivant :

  • Utilisateur : Dupont
  • Mot de passe : ' or 1=1 --

L'apostrophe indique la fin de la zone de frappe de l'utilisateur, le code "or 1=1" demande au script si 1=1 est vrai, or c'est toujours le cas, et -- indique le début d'un commentaire.

La requête devient alors :

SELECT uid WHERE name = 'Dupont' AND password = '' OR 1=1 --';

Ainsi le script programmé pour vérifier si ce que l'utilisateur tape est vrai, il verra que 1=1 est vrai, et l'attaquant sera connecté sous la session Dupont.

Solution

Ici, la solution consiste à traiter correctement les chaînes de caractères entrées par l'utilisateur.

En PHP on peut utiliser pour cela la fonction mysql_real_escape_string, qui transformera la chaîne ' -- en \' --. La requête deviendrait alors :

SELECT uid WHERE name = 'Dupont\' -- ' AND password = '4e383a1918b432a9bb7702f086c56596e';

L'apostrophe de fin de chaîne ayant été correctement dé-spécialisée en la faisant précéder d'un caractère «\».

L'échappement peut aussi se faire (suivant le SGBD utilisé) en doublant les apostrophes.

La marque de commentaire fera alors partie de la chaîne, et finalement le serveur SQL répondra qu'il n'y a aucune entrée dans la base de données correspondant à l'utilisateur Dupont' -- .

La fonction addslashes ne suffit pas pour stopper les injections via les variables numériques, qui ne sont pas encadrées d'apostrophes ou de guillemets dans les requêtes SQL. Exemple avec la requête :

SELECT ... FROM ... WHERE numero_badge = $numero AND code_4_chiffre = $code;

qui réussit lorsque la variable $numero contient 0 or 1=1 --. Une précaution est d'utiliser la fonction ctype_digit pour vérifier les variables numériques des requêtes. On peut aussi forcer la transformation de la variable en nombre en la faisant précéder d'un transtypeur, comme (int) si on attend un entier (la chaîne 0 or 1=1 -- sera alors transformée en l'entier 0 et l'injection SQL échouera).

La fonction addslashes possède elle-même quelques failles sur certaines versions de PHP qui datent. De plus, elle échappe uniquement les caractères «\», «NULL», «'» et «"». Il serait plus approprié d'utiliser la fonction mysql_real_escape_string qui échappe justement les caractères spéciaux d'une commande SQL (NULL, \x1a, \n , \r , \, ', " et \x00).

Comment éviter ces attaques

Ces attaques peuvent être évitées de plusieurs façons :

  1. Utiliser des procédures stockées, à la place du SQL dynamique. Les données entrées par l'utilisateur sont alors transmises comme paramètres, sans risque d'injection.
  2. Vérifier de manière précise et exhaustive l'ensemble des données venant de l'utilisateur. On peut, par exemple, utiliser une expression rationnelle afin de valider qu'une donnée entrée par l'utilisateur est bien de la forme souhaitée.
  3. Utiliser des comptes utilisateurs SQL à accès limité (en lecture-seule) quand cela est possible.
  4. Utiliser des requêtes SQL paramétrées (requêtes à trous envoyées au serveur SQL, serveur à qui l'on envoie par la suite les paramètres qui boucheront les trous), ainsi c'est le SGBD qui se charge d'échapper les caractères selon le type des paramètres.
  5. Utiliser, en conjonction avec mysql_real_escape_string, la fonction sprintf().

Note : Pour contrer les injections de code SQL, les « magic quotes » sont utilisées par défaut dans la configuration de PHP. Elles permettent de placer un caractère d’échappement devant les apostrophes.

Certaines failles de sécurité et l’annonce de la disparition de magic_quotes_gpc dans PHP6 incitent à remplacer cette option par l’usage systématique de la fonction mysql_real_escape_string.

En PHP, la classe PHP Data Objects permet d'abstraire la connexion à la base de données, et introduit un mécanisme de requêtes préparées résistant aux injections avec la méthode prepare.

Voir aussi

Articles connexes

Liens externes


Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Injection SQL de Wikipédia en français (auteurs)

Игры ⚽ Нужно сделать НИР?

Regardez d'autres dictionnaires:

  • SQL-92 — SQL (das Kürzel für Structured Query Language; offizielle Aussprache [ɛskjuːˈɛl], häufig auch [ˈsiːkwəl] →SEQUEL), ist eine Datenbanksprache zur Definition, Abfrage und Manipulation von Daten in relationalen Datenbanken. SQL ist von ANSI und ISO… …   Deutsch Wikipedia

  • SQL-99 — SQL (das Kürzel für Structured Query Language; offizielle Aussprache [ɛskjuːˈɛl], häufig auch [ˈsiːkwəl] →SEQUEL), ist eine Datenbanksprache zur Definition, Abfrage und Manipulation von Daten in relationalen Datenbanken. SQL ist von ANSI und ISO… …   Deutsch Wikipedia

  • Injection — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Sur les autres projets Wikimedia : « Injection », sur le Wiktionnaire (dictionnaire universel) Le mot injection peut avoir plusieurs… …   Wikipédia en Français

  • SQL-Injection — (dt. SQL Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht. Der Angreifer versucht dabei, über die… …   Deutsch Wikipedia

  • SQL Injection — (dt. SQL Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht. Der Angreifer versucht dabei, über die… …   Deutsch Wikipedia

  • SQL-Injektion — SQL Injection (dt. SQL Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht. Der Angreifer versucht dabei …   Deutsch Wikipedia

  • SQL Injektion — SQL Injection (dt. SQL Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht. Der Angreifer versucht dabei …   Deutsch Wikipedia

  • SQL — ist eine Datenbanksprache zur Definition, Abfrage und Manipulation von Daten in relationalen Datenbanken. SQL ist von ANSI und ISO standardisiert und wird von fast allen gängigen Datenbanksystemen unterstützt. Die Bezeichnung SQL (offizielle… …   Deutsch Wikipedia

  • SQL — Desarrollador(es) IBM ISO/IEC 9075 1:2008 Información general Paradigma Multiparadigma …   Wikipedia Español

  • Injection — may refer to:* Injection (medicine), a method of putting liquid into the body with a syringe and a hollow needle that punctures the skin. * Injective function in mathematics, a function which associates distinct arguments to distinct values *… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”