Qu’est-ce que l’injection SQL?

Dupliqués possibles:

Comment fonctionne l’injection SQL à partir de la bande dessinée XKCD “Bobby Tables”?
https://stackoverflow.com/search?q=sql+injection

Quelqu’un peut-il expliquer l’injection SQL? Comment cela cause-t-il des vulnérabilités? Où est exactement le point où SQL est injecté?

Quelqu’un peut-il expliquer l’injection SQL?

L’injection SQL se produit lorsque vous interpolez du contenu dans une chaîne de requête SQL, et le résultat modifie la syntaxe de votre requête de manière non intentionnelle.

Il ne doit pas être malveillant, cela peut être un accident. Mais une injection SQL accidentelle est plus susceptible de provoquer une erreur que dans une vulnérabilité.

Le contenu préjudiciable ne doit pas provenir d’un utilisateur, il peut s’agir d’un contenu que votre application reçoit de n’importe quelle source, ou même se génère en code.

Comment cela cause-t-il des vulnérabilités?

Cela peut entraîner des vulnérabilités car les pirates peuvent envoyer des valeurs à une application dont ils savent qu’elles seront interpolées dans une chaîne SQL. En étant très intelligent, ils peuvent manipuler le résultat des requêtes, lire des données ou même modifier des données qu’ils ne devraient pas être autorisés à faire.

Exemple en PHP:

$password = $_POST['password']; $id = $_POST['id']; $sql = "UPDATE Accounts SET PASSWORD = '$password' WHERE account_id = $id"; 

Supposons maintenant que l’attaquant définisse les parameters de la requête POST sur ” password=xyzzy ” et ” id=account_id ” pour obtenir le id=account_id SQL suivant:

 UPDATE Accounts SET PASSWORD = 'xyzzy' WHERE account_id = account_id 

Bien que j’attende que $id soit un entier, l’attaquant a choisi une chaîne qui est le nom de la colonne. Bien sûr, la condition est vraie à chaque ligne, donc l’attaquant vient de définir le mot de passe pour chaque compte. Maintenant, l’attaquant peut se connecter au compte de n’importe qui, y compris les utilisateurs privilégiés.

Où est exactement le point où SQL est injecté?

Ce n’est pas du SQL qui est injecté, c’est un contenu qui est interpolé (“injecté”) dans une chaîne SQL, résultant en un type de requête différent de celui que je voulais. J’ai fait confiance au contenu dynamic sans le vérifier et j’ai exécuté la requête SQL résultante à l’aveuglette. C’est là que commence le problème.

L’injection SQL est une erreur dans le code de l’application, généralement pas dans la firebase database ou dans la bibliothèque ou le framework d’access à la firebase database.

La plupart des cas d’injection SQL peuvent être évités en utilisant des parameters de requête. Voir Comment puis-je empêcher l’injection SQL en PHP? pour des exemples.

L’injection SQL se produit lorsque l’utilisateur d’une application est capable d’affecter la signification de la requête de firebase database. Cela se produit souvent lorsque des chaînes arbitraires provenant d’une entrée utilisateur sont concaténées pour créer du code SQL qui est envoyé à la firebase database. Par exemple, supposons que nous ayons le code suivant (en PHP, mais la même chose s’applique à toutes les langues), qui pourrait être utilisée pour gérer une connexion utilisateur.

 $sql = "SELECT FROM users WHERE username='".$_GET['username']."' AND password='".$_GET['password']."'"; 

Le mal est fait quand l’utilisateur entre quelque chose comme

 administrator'; -- 

… pour le nom d’utilisateur. Sans un encodage correct, la requête devient:

 SELECT * FROM users WHERE username='administrator'; -- AND password='' 

Le problème ici est que le ‘dans le nom d’utilisateur ferme le champ du nom d’utilisateur puis le – lance un commentaire SQL, ce qui oblige le serveur de firebase database à ignorer le rest de la chaîne. Le résultat net est que l’utilisateur peut maintenant se connecter en tant qu’administrateur sans avoir à connaître le mot de passe. SQL Inection peut également être utilisé pour exécuter des requêtes UPDATE, DELETE ou DROP et endommager réellement la firebase database.

L’injection SQL peut être évitée en utilisant des requêtes paramétrées ou en appliquant les fonctions d’échappement de votre langage / toolkit (comme mysql_real_escape_ssortingng () en PHP).

Une fois que vous avez compris l’injection SQL, vous obtiendrez la blague derrière ce dessin .

L’injection SQL consiste à traiter les objects supposés être des données SQL à contrecœur.

Par exemple, si vous deviez faire

 mysql_query("SELECT * FROM posts WHERE postid=$postid"); 

Normalement, vous obtenez le message avec un identifiant donné, mais supposons que $postid est défini sur la chaîne 10; DROP TABLE posts -- 10; DROP TABLE posts -- ; tout à coup, la requête que vous envoyez est

 mysql_query("SELECT * FROM posts WHERE postid=10; DROP TABLE posts --"); 

C’est un problème car vous perdriez l’intégralité de votre table de messages à cause d’un utilisateur malveillant – oh mon dieu.

Le moyen le plus simple d’empêcher cela est d’utiliser des instructions préparées, par exemple via PDO ou MySQLi .

L’exemple équivalent dans PDO serait alors

 $statement = $db->prepare('SELECT * FROM posts WHERE postid = :postid'); $statement->bindValue(':postid', $postid); $statement->execute(); 

Cela garantit que le système de firebase database sait que $ postid doit être traité en tant que données et non en tant que code et sera donc traité de manière appropriée.

Cette question a été résolue à plusieurs resockets sur StackOverflow, mais c’est un sujet important pour tout le monde, alors je ne vais pas voter pour clore cette question.

Voici des liens vers certaines de mes réponses passées sur ce sujet:

  • Qu’est-ce que l’injection SQL?
  • Comment protéger cette fonction de l’injection SQL?
  • Les parameters sont-ils vraiment suffisants pour empêcher les injections de Sql?
  • L’injection SQL est-elle un risque aujourd’hui?

J’ai également donné une présentation à la conférence MySQL ce mois-ci et mes diapositives sont en ligne:

  • Les mythes et les erreurs d’injection SQL

L’injection SQL est l’endroit où un utilisateur malveillant mettra du SQL dans les champs d’entrée pour essayer d’exécuter le SQL sur votre serveur.

Le conseil n ° 1 auquel je souscris est d’utiliser des procédures stockées paramétrées plutôt que de générer du code SQL brut.

Les parameters de procédure stockée ne sont pas exécutés, ce qui les rend sûrs dans la plupart des cas.

J’ai trouvé ce document extrêmement intéressant sur les techniques d’injection SQL (lien vers PDF): injection SQL avancée dans les applications SQL Server .

Malgré le titre “Avancé”, il est assez lisible même si vous ne connaissez pas bien l’injection SQL.

Pour obtenir des informations générales, consultez l’article de Wikipedia sur l’injection SQL .

En bref, les attaques par injection SQL peuvent vous rendre vulnérable à tous les cas de vol et de destruction de données. Les détails exacts de ce qui peut être fait pour votre système dépendent des détails du système lui-même.

Chaque fois que vous transmettez des informations de vos utilisateurs à votre firebase database, vous avez un point d’injection potentiel. Les applications Web manquent souvent à cet égard, car les nouveaux programmeurs ne comprennent souvent pas les risques liés à la gestion des entrées des utilisateurs, et les applications Web sont attaquées par des personnes très intelligentes qui, selon vous, ne trouveraient pas votre programme.

Vous aimerez cet article du projet de code; )

Résumé

  • Crypter des données sensibles.
  • Accédez à la firebase database en utilisant un compte avec le moins de privilèges nécessaires.
  • Installez la firebase database en utilisant un compte avec le moins de privilèges nécessaires.
  • Assurez-vous que les données sont valides.
  • Effectuez une révision du code pour vérifier la possibilité d’attaques de second ordre.
  • Utilisez des requêtes paramétrées.
  • Utilisez les procédures stockées.
  • Re-validez les données dans les procédures stockées.
  • Assurez-vous que les messages d’erreur ne contiennent rien sur l’architecture interne de l’application ou de la firebase database.

Le point où SQL est injecté est tout point où votre application accepte les entrées de l’utilisateur.

Que cela devienne une vulnérabilité dangereuse pour votre application Web, cela dépend si cette entrée est utilisée par la suite dans le cadre d’une requête SQL sans vérifier correctement son type et l’échapper si nécessaire.

Sans une échappement correcte, du code SQL «injecté» par l’utilisateur pourrait être exécuté par le moteur SQL en tant que code SQL, plutôt que par une simple chaîne ou valeur.