web-dev-qa-db-fra.com

L'accès en lecture seule à la base de données empêche-t-il l'injection SQL?

J'ai une API Web qui se connecte à mon serveur SQL à l'aide d'une connexion en lecture seule et je souhaite autoriser les utilisateurs avertis de mon API à entrer une clause SQL where sur la chaîne de requête. Je veux simplement dire ce qu'ils entrent dans l'instruction select.

Une connexion en lecture seule à la base de données avec un privilège minimum (sélection de la capacité sur une seule table) empêche-t-elle toutes les attaques par injection?

51
Aaron

Non. Vous pourriez confondre l'injection SQL avec l'injection de données; les tables en lecture seule n'empêchent pas l'injection SQL et au mieux ne font que peu pour limiter son impact.

L'injection SQL signifie simplement la possibilité d'injecter du code SQL. Bien que les tables en lecture seule puissent limiter la capacité à injecter data dans la table, elles n'ont pas d'impact sur la capacité à:

  • Lire à partir d'autres bases de données ou tables si non autorisé
  • Lire à partir des tables système ou exécuter d'autres requêtes système difficiles à interdire
  • Écrire des requêtes trop complexes qui effectueront un DoS
  • Exfiltrer des données en utilisant DNS
  • Accéder aux fichiers locaux (par exemple, utl_file dans Oracle)
  • Accéder au réseau du serveur de base de données (par exemple, utl_http dans Oracle)
  • Exécuter du code arbitraire sur le serveur via débordements de tampon de fonction DB
  • Voir Injection SQL avancée dans les bases de données Oracle pour une bonne marche à travers toutes sortes de choses dont vous devez vous soucier (et réalisez que d'autres bases de données ont leurs équivalents)

Si vous

veulent simplement clouer ce qu'ils entrent dans l'instruction select.

alors vous autorisez expressément l'attaquant à essayer n'importe lequel de ces éléments.

Maintenant, vous pouvez certainement faire des choses pour limiter cela. Vous pouvez interdire les guillemets et les caractères de séparation des instructions SQL. Vous pouvez interdire toute entrée qui n'est pas [A-Za-z0-9"=] (ou équivalent équivalent à votre base de données). Mais si vous commencez à suivre ce chemin, vous feriez mieux d'écrire votre application correctement : exposez une interface de requête plus riche où vous proposez les clés à vérifier puis vous effectuez des citations appropriées sur toutes les valeurs entrées par l'utilisateur.

109
gowenfawr

Non, exemple trivial

EXEC ('SELECT COUNT(*) 
       FROM table 
       WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')

Définissez @Password sur a' OR 1=1;--

Et votre mot de passe est contourné

13
Akash

Une connexion en lecture seule à la base de données avec un privilège minimum (sélection de la capacité sur une seule table) empêche-t-elle toutes les attaques par injection?

L'injection SQL est un moyen pour un attaquant de modifier une instruction existante afin qu'elle provoque des actions involontaires. Ces actions peuvent être des modifications de la base de données ou l'exécution de code sur le système, mais aussi simplement renvoyer des données qu'il ne devrait pas ou faire un déni de service en exécutant des opérations gourmandes en ressources.

Restreindre les requêtes aux seules sélections sur une table spécifique peut limiter l'impact, mais vous pourrez probablement toujours provoquer un déni de service. Et selon l'endroit où les résultats de la requête seront utilisés, vous pouvez modifier le comportement de l'application en renvoyant des résultats inattendus.

12
Steffen Ullrich

Pas du tout. Les failles d'injection SQL ne se trouvent pas au niveau du serveur SQL mais au niveau de l'application Web, donc si l'application Web est sensible à l'injection SQL, elle le restera quel que soit le niveau d'accès à la base de données.

Cependant, le principe du moindre privilège que vous mentionnez fait que, même si quelqu'un parvient à exploiter une injection SQL sur l'application Web, il n'obtiendra qu'un accès en lecture sur le contenu de la base de données, il ne pourra pas modifier le contenu ou la structure de la base de données .

0
WhiteWinterWolf