Outils pour utilisateurs

Outils du site


web:injection_sql

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
web:injection_sql [2016/04/15 09:48]
arkinar
web:injection_sql [2016/04/15 12:14]
yorin Correction ortho
Ligne 3: Ligne 3:
 __Introduction__ \\  __Introduction__ \\ 
 Le nom de cette technique parle d’elle-même,​ le but est d’injecter du code SQL afin de compromettre les requêtes vers une base de données. C’est une attaque web très connu et les répercussions peuvent être graves. Avec une bonne injection exploitant une ou plusieurs failles sur une page web, on peut aller du contournement d’authentification à la récupération complète des données. \\  Le nom de cette technique parle d’elle-même,​ le but est d’injecter du code SQL afin de compromettre les requêtes vers une base de données. C’est une attaque web très connu et les répercussions peuvent être graves. Avec une bonne injection exploitant une ou plusieurs failles sur une page web, on peut aller du contournement d’authentification à la récupération complète des données. \\ 
-Il faut savoir qu'il existe plusieurs types de BDD (postgresql,​ sqlite, mySQL), les commandes données en exemple dans cet articles ​sont pour une base mySQL.\\ \\ +Il faut savoir qu'il existe plusieurs types de BDD (postgresql,​ sqlite, mySQL), les commandes données en exemple dans cet article ​sont pour une base mySQL.\\ \\ 
  
  
 __Exploitation__ \\  __Exploitation__ \\ 
-On retrouve plusieurs formes d’injection reposant sur différentes ​méthode ​d’attaque, la plus simple étant une injection ​tel que : **' OR 1=1 ;#** \\ +On retrouve plusieurs formes d’injection reposant sur différentes ​méthodes ​d’attaques, la plus simple étant une injection ​telle que : **' OR 1=1 ;#** \\ 
  
 Pour comprendre le but de cette injection, regardons une requête type pour une authentification : ​ Pour comprendre le but de cette injection, regardons une requête type pour une authentification : ​
Ligne 13: Ligne 13:
 <​code>​SELECT * FROM user WHERE login='​toto'​ AND passwd='​frite'​ ;​ </​code>​ <​code>​SELECT * FROM user WHERE login='​toto'​ AND passwd='​frite'​ ;​ </​code>​
  
-L’utilisateur a rentré son login et son mot de passe, pour l’exemple,​ toto/frite. La page web forge la requête et l’envoi vers le serveur. Ce dernier va simplement exécuter la demande vers la base de données. Maintenant, que ce passe-t-il si, à la place du login, on rentre l’injection : ​+L’utilisateur a rentré son login et son mot de passe, pour l’exemple,​ toto/frite. La page web forge la requête et l’envoie ​vers le serveur. Ce dernier va simplement exécuter la demande vers la base de données. Maintenant, que se passe-t-il si, à la place du login, on rentre l’injection : ​
  
 <​code>​SELECT * FROM user WHERE login=''​ OR 1=1 ;#'​ AND passwd='​frite'​ ;​ </​code>​ <​code>​SELECT * FROM user WHERE login=''​ OR 1=1 ;#'​ AND passwd='​frite'​ ;​ </​code>​
Ligne 24: Ligne 24:
  
  
-Prenons l’exemple d’une page internet utilisant des paramètres dans l’url ​tel que :+Prenons l’exemple d’une page internet utilisant des paramètres dans l’url ​telle que :
  
 <​code>​www.exemple.com/​frite/?​action=register </​code>​ <​code>​www.exemple.com/​frite/?​action=register </​code>​
Ligne 36: Ligne 36:
 <​code>​www.exemple.com/​frite/?​action=register AND length(passwd)= 5</​code>​ <​code>​www.exemple.com/​frite/?​action=register AND length(passwd)= 5</​code>​
  
-Si la longueur du mot de passe est bien de 5 (true), alors la page demandé ​s’affichera. C’est une bonne façon d’obtenir des informations. Dans cet exemple, l’étape suivante ​serai de comparer avec les caractères du mot de passe... ​+Si la longueur du mot de passe est bien de 5 (true), alors la page demandée ​s’affichera. C’est une bonne façon d’obtenir des informations. Dans cet exemple, l’étape suivante ​serait ​de comparer avec les caractères du mot de passe... ​
 \\  \\ 
-Il existe aussi une table contenant les informations ​source ​de la base de donnée ainsi que des fonctions que l’on peut injecter afin d’obtenir des informations sur la base afin de mieux cibler les injections suivantes. Dans un cas plus réel, ce sont ces injections qu'il faut faire en premier afin d'en apprendre d'​avantage sur la base de données.\\ ​+Il existe aussi une table contenant les informations ​sources ​de la base de donnée ainsi que des fonctions que l’on peut injecter afin d’obtenir des informations sur la base afin de mieux cibler les injections suivantes. Dans un cas plus réel, ce sont ces injections qu'il faut faire en premier afin d'en apprendre d'​avantage sur la base de données.\\ ​
  
    * SELECT version();    * SELECT version();
Ligne 45: Ligne 45:
    * SELECT COLUMN_NAME,​ COLUMN_KEY FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = ‘name_of_table’;​    * SELECT COLUMN_NAME,​ COLUMN_KEY FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = ‘name_of_table’;​
  
-Ces commandes nous donne la version de la BDD ainsi que son nom. Ce dernier ​nous permet ​d'​obtenir le nom des colonnes ainsi que le contenu des tables.+Ces commandes nous donnent ​la version de la BDD ainsi que son nom. Ces dernières ​nous permettent ​d'​obtenir le nom des colonnes ainsi que le contenu des tables.
  
  
 __Sécuriser les requêtes SQL__ \\  __Sécuriser les requêtes SQL__ \\ 
-Depuis que cette faille a été découverte,​ des contre-mesures ont été mise en place, certaines permettent juste d’éviter les attaques SQL ‘basique’ grâce à des filtres, mais reste vulnérables à des techniques plus avancée.\\  +Depuis que cette faille a été découverte,​ des contre-mesures ont été mises en place, certaines permettent juste d’éviter les attaques SQL ‘basique’ grâce à des filtres, mais reste vulnérables à des techniques plus avancées.\\  
-Une méthode plutôt efficace consiste ​changer la façon dont les requêtes sont forgées. \\ \\ +Une méthode plutôt efficace consiste ​à changer la façon dont les requêtes sont forgées. \\ \\ 
 Sans contre-mesures :  Sans contre-mesures : 
 <​code>​sql.execute("​SELECT * FROM user WHERE lastname = '​%s'"​ % name) </​code>​ <​code>​sql.execute("​SELECT * FROM user WHERE lastname = '​%s'"​ % name) </​code>​
Ligne 58: Ligne 58:
 Avec contre-mesures :  Avec contre-mesures : 
 <​code>​sql.execute("​SELECT * FROM user WHERE lastname = %s", (name,)) </​code>​ <​code>​sql.execute("​SELECT * FROM user WHERE lastname = %s", (name,)) </​code>​
-Alors qu'​ici,​ on ne forge plus le requête directement,​ mais on envoi la forme de la requête voulue, ​suivie ​des arguments nécessaire pour cette requête. ​+Alors qu'​ici,​ on ne forge plus la requête directement,​ mais on envoi la forme de la requête voulue, ​suivi des arguments nécessaire pour cette requête. ​
  
 \\  \\ 
-Il existe bien des façon ​de protéger sa base de données, notamment en faisant attention à son code.+Il existe bien des façons ​de protéger sa base de données, notamment en faisant attention à son code.
  
web/injection_sql.txt · Dernière modification: 2016/07/04 08:38 (modification externe)