AccueilđŸ‡«đŸ‡·Chercher

Injection SQL

La faille SQLi, abrĂ©viation de SQL Injection, soit injection SQL en français, est un groupe de mĂ©thodes d'exploitation de faille de sĂ©curitĂ© d'une application interagissant avec une base de donnĂ©es. Elle permet d'injecter dans la requĂȘte SQL en cours un morceau de requĂȘte non prĂ©vu par le systĂšme et pouvant en compromettre la sĂ©curitĂ©.

Types d'injections SQL

Il existe plusieurs types d'injection SQL :

  • la mĂ©thode blind based (associĂ©e Ă  sa cousine la time based), qui permet de dĂ©tourner la requĂȘte SQL en cours sur le systĂšme et d'injecter des morceaux qui vont retourner caractĂšre par caractĂšre ce que l'attaquant cherche Ă  extraire de la base de donnĂ©es. La mĂ©thode blind based, ainsi que la time based, se basent sur la rĂ©ponse du serveur : si la requĂȘte d'origine renvoie bien le mĂȘme rĂ©sultat qu'Ă  l'origine (et indique donc que le caractĂšre est valide) ou ne renvoie pas le mĂȘme rĂ©sultat (et indique donc que le caractĂšre testĂ© n'est pas le bon). La time based a pour seule diffĂ©rence qu'elle se base sur le temps de rĂ©ponse du serveur plutĂŽt que sur la rĂ©ponse en elle-mĂȘme ;
  • la mĂ©thode error based, qui permet de dĂ©tourner la requĂȘte SQL en cours sur le systĂšme et d'injecter des morceaux qui vont retourner champ par champ ce que l'on cherche Ă  extraire de la base de donnĂ©es. Cette mĂ©thode profite d'une faiblesse des systĂšmes de base de donnĂ©es permettant de dĂ©tourner un message d'erreur gĂ©nĂ©rĂ© par le systĂšme de base de donnĂ©es et prĂ©alablement volontairement provoquĂ©e par l'injection SQL pour lui faire retourner une valeur prĂ©cise rĂ©cupĂ©rĂ©e en base de donnĂ©es ;
  • la mĂ©thode union based, qui permet de dĂ©tourner la requĂȘte SQL en cours sur le systĂšme et d'injecter des morceaux qui vont retourner un ensemble de donnĂ©es directement extraites de la base de donnĂ©es. Cette mĂ©thode profite de certaines mĂ©thodes afin de dĂ©tourner entiĂšrement le retour de la requĂȘte SQL d'origine afin de lui faire retourner en une seule requĂȘte un important volume de donnĂ©es, directement rĂ©cupĂ©rĂ© en base de donnĂ©es. Dans ses exemples les plus violents, il est possible de rĂ©cupĂ©rer des tables entiĂšres de base de donnĂ©es en une ou deux requĂȘtes, mĂȘme si en gĂ©nĂ©ral cette mĂ©thode retourne entre 10 et 100 lignes de la base de donnĂ©es par requĂȘte SQL dĂ©tournĂ©e ;
  • la mĂ©thode Stacked queries, la plus dangereuse de toutes. Profitant d'une erreur de configuration du serveur de base de donnĂ©es, cette mĂ©thode permet d'exĂ©cuter n'importe quelle requĂȘte SQL sur le systĂšme ciblĂ©, ce qui ne se limite pas seulement Ă  rĂ©cupĂ©rer des donnĂ©es comme les 3 prĂ©cĂ©dentes. En effet, quand ce type de requĂȘte n'est pas dĂ©sactivĂ©, il suffit d'injecter une autre requĂȘte SQL, et elle sera exĂ©cutĂ©e sans problĂšme, qu'elle aille chercher des donnĂ©es, ou en modifier directement dans la base de donnĂ©es.

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 FROM Users 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 FROM Users 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 hacker pourrait alors fournir les informations suivantes :

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

La requĂȘte devient :

SELECT uid FROM Users 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 FROM Users 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 --

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

La requĂȘte devient alors :

SELECT uid FROM Users WHERE name = 'Dupont' AND password = '' or 1 --';

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

Échappement des caractĂšres spĂ©ciaux

La premiÚre solution consiste à échapper les caractÚres spéciaux contenus dans les chaßnes de caractÚres entrées par l'utilisateur.

En PHP on peut utiliser pour cela la fonction mysqli_real_escape_string, qui transformera la chaĂźne ' -- en \' --. La requĂȘte deviendrait alors :

SELECT uid FROM Users 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 à un utilisateur Dupont' -- avec ce mot de passe.

La fonction addslashes ne suffit pas pour empĂȘcher 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 --. 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 -- 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 mysqli_real_escape_string qui Ă©chappe justement les caractĂšres spĂ©ciaux d'une commande SQL (NULL, \x1a, \n , \r , \, ', " et \x00).

Utilisation d'une requĂȘte prĂ©parĂ©e

La seconde solution consiste Ă  utiliser des requĂȘtes prĂ©parĂ©es : dans ce cas, une compilation de la requĂȘte est rĂ©alisĂ©e avant d'y insĂ©rer les paramĂštres et de l'exĂ©cuter, ce qui empĂȘche un Ă©ventuel code insĂ©rĂ© dans les paramĂštres d'ĂȘtre interprĂ©tĂ©.

De nombreux frameworks sont Ă©quipĂ©s d'un ORM qui se charge entre autres de prĂ©parer les requĂȘtes.

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, qui, s'ils sont correctement utilisĂ©s par la procĂ©dure (par exemple injectĂ©s dans une requĂȘte paramĂ©trĂ©e), Ă©vitent l'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, ou profiter de fonctions de transformation spécifiques au langage ;
  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.

En PHP

Les « magic quotes » Ă©taient utilisĂ©es par dĂ©faut dans la configuration de PHP. Elles permettaient qu'un caractĂšre d’échappement soit automatiquement placĂ© devant les apostrophes et guillemets dangereux.

Certaines failles de sécurité et la disparition de magic_quotes_gpc dans PHP5.4 incitent à remplacer cette option par les solutions ci-dessus : la fonction mysqli_real_escape_string, les classes PHP Data Objects, etc.

Exemples

  • En , Jeremiah Jacks rĂ©vĂšle une faille de sĂ©curitĂ© sur le site de Guess.com exploitable par une attaque d’injection SQL et permettant d’obtenir les coordonnĂ©es de plus de 200 000 personnes y compris leurs numĂ©ros de cartes de crĂ©dit avec la date d’expiration[1].
  • Le , un jeune pirate utilise l’injection SQL pour s’introduire dans le site d’information taĂŻwanais consacrĂ©e Ă  la sĂ©curitĂ© informatique et s’empare des donnĂ©es de la base client[2].
  • Le , un pirate s’attaque par une injection SQL au site officiel du tourisme indien appartenant au gouvernement[3].
  • En , des dizaines de milliers de PC sont infectĂ©es par une injection SQL automatique exploitant une faille de sĂ©curitĂ© de Microsoft SQL Server.
  • Le survient le vol de 10 597 numĂ©ros de sĂ©curitĂ© sociale amĂ©ricains[4].
  • Le , le dĂ©partement de la justice amĂ©ricaine identifie l'amĂ©ricain Albert Gonzalez et deux russes comme les auteurs du vol de 130 millions de numĂ©ros de cartes de crĂ©dit grĂące Ă  une attaque par injection SQL. Les principales victimes sont la sociĂ©tĂ© de traitement des paiements par cartes Heartland Payment Systems, les chaĂźnes de supermarchĂ© 7-eleven et Hannaford Brothers[5].
  • Le , des attaques par injection SQL simultanĂ©es de Japon et de Chine parviennent Ă  pĂ©nĂ©trer la sociĂ©tĂ© NeoBeat qui gĂšre des supermarchĂ©s sur internet et volent 12 191 donnĂ©es de cartes bancaires.
  • Le , un pirate roumain appelĂ© TinKode utilise une attaque par injection SQL pour paralyser le site de la Royal Navy en Angleterre[6] - [7].
  • Le , l’ensemble du rĂ©seau Barracuda est victime d’une attaque par injection SQL. Identifiants et adresses emails des employĂ©s sont dĂ©tournĂ©s[8].
  • Le , le groupe appelĂ© LulzSec est accusĂ© d’une attaque par injection SQL contre le site de Sony. Au moins 1 million de clients se font voler coupons, clĂ©s d’activation et mot de passe[9].
  • En , Yahoo rapporte le vol de donnĂ©es de plus de 450,000 clients[10] - [11].
  • En , Yahoo rapporte le vol de donnĂ©es de plus de 1 milliard de comptes[12] - [13].

Notes et références

  1. (en) « Guesswork Plagues Web Hole Reporting », SecurityFocus, .
  2. (en) « WHID 2005-46: Teen uses SQL injection to break to a security magazine web site », Web Application Security Consortium, (consulté le ).
  3. (en) « WHID 2006-27: SQL Injection in incredibleindia.org », Web Application Security Consortium, (consulté le ).
  4. (en) Alex Papadimoulis, « Oklahoma Leaks Tens of Thousands of Social Security Numbers, Other Sensitive Data », The Daily WTF, (consulté le ).
  5. (en) « US man 'stole 130m card numbers' », BBC, (consulté le ).
  6. (en) Royal Navy website attacked by Romanian hacker, BBC News, 8-11-10, Accessed November 2010.
  7. (en) Sam Kiley, « Super Virus A Target For Cyber Terrorists », (consulté le ).
  8. (en) « Hacker breaks into Barracuda Networks database ».
  9. (en) « LulzSec hacks Sony Pictures, reveals 1m passwords unguarded », electronista.com, .
  10. (en) Chenda Ngak. "Yahoo reportedly hacked: Is your account safe?", CBS News. 12 juillet 2012. Consulté le 16 juillet 2012.
  11. (en) Jamie Yap, « 450,000 user passwords leaked in Yahoo breach | ZDNet », ZDNet,‎ (lire en ligne, consultĂ© le )
  12. SĂ©bastien Gavois, « Yahoo annonce le vol de donnĂ©es de plus d'un milliard de comptes », Next INpact,‎ (lire en ligne, consultĂ© le )
  13. Florian Reynaud, « Le piratage de Yahoo! est le plus important vol de donnĂ©es de l’histoire », Le Monde.fr,‎ (ISSN 1950-6244, lire en ligne, consultĂ© le )

Voir aussi

Articles connexes


Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.