Il y'a quelques semaines, Yahoo a subi une attaque par injection SQL (details ici), les pirates auraient récupéré plus de 400000 identifiants. C'est un exemple d'attaque parmi tant d'autres. En effet plusieurs entreprises et individu enregistrent chaque année un viol de l’intégrité et de la confidentialité de leurs données. Mais ce n'ai ni Yahoo si les identifiants révélés qui vont nous intéresser, mais plutôt comment mettre en oeuvre une telle attaque et surtout comment s'en protéger.
1. Principe
Les injections SQL consistent à faire exécuter un code SQL malveillant à partir d’une application qui fait des requêtes à un serveur de base de données. Les applications web et les sites internet sont d'excellents cibles car ils sont accessible de part le monde et beaucoup d'administrateurs et de développeurs n'assurent pas une sécurité raisonnable dans leurs systèmes.2. L'environnement de test
Voici un exemple d'application qui peut subir l'attaque en question. L’utilisateur a un formulaire qui fourni les données au script PHP. Ce dernier vérifie dans la base de données si les informations soumises depuis le formulaire authentifie l’utilisateur. L’utilisateur est informé du résultat.L’utilisateur en temps normale entre un nom d’utilisateur (ingc dans notre cas) et son mot de passe (esmt dans notre cas).
La requête SQL résultante est :
SELECT * FROM users WHERE username='ingc' and pw='esmt'
3. Exploitation
L’utilisateur malveillant peut entrer un nom d’utilisateur correct,puis dans le champ de mot de passe l'expression suivante : ‘ OR ‘1
Dans ce cas, la requête résultante est:
SELECT * FROM users WHERE username='ingc' and pw='' OR '1‘
Cette requette liste toute la table users
4. Autre technique d'exploitation
Plus généralement, il est possible d’exécuter des requêtes SQL en utilisant « ; » pour fermer la requête en cour et en écrivant ensuite n’importe quelle requête SQL.Le code suivant, entré dans le champ de mot de passe vide la table:
'; DELETE FROM users WHERE 1 OR username = ‘
La requête résultante étant:
SELECT * FROM users WHERE username='ingc' AND pw=''; DELETE FROM users WHERE 1 OR username = ‘'
5. La parade
Avant de faire des requêtes à la base de données, il faut s’assurer que les informations du formulaire entré par les utilisateurs ne comportent pas de code malveillant.PHP offre une fonction dans ce sens. Elle permet d’échapper tout code SQL éventuel dans une chaine de caractères avant de l’utiliser dans une requête.
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )
Ces dispositions mettent plus de chances de votre coté face aux pirates. Mais nul, même le meilleur n'est à l'abri, Yahoo en sait quelque chose.
Il est donc une très bonne pratique de sécurité que d'assurer la traçabilité des utilisateurs de vos sites web grâce à la géolocalisation et la journalisation des information d’accès au serveur. Il sera alors possible d'identifier la source des attaques même si vous n'y échappez pas. c'est mieux que rien.
Commentaires