04-04-2010

Attaque web par injection SQL

L’attaque web par injection SQL est réalisée par des experts mettant en relation, d’une manière astucieuse, les entrées utilisateurs et le langage qui parle à la base de données.

Grossièrement, ce qui se produit est soit (1) l’insertion de commandes pour la base de données ou encore (2) la transformation des paramètres de manière à faire appliquer des commandes sur des données non-autorisées.

L’insertion arbitraire de commandes

Ce type d’injection SQL implique qu’il existe des caractères spéciaux capables d’interrompre une commande SQL existante et d’en débuter une nouvelle dictée par l’attaquant. Cette attaque est de loin la pls dangereuse car elle s’exécutera avec les privilèges de l’usager de la base de données et non avec les privilèges de l’usager du site.

La plupart des applications web ne déclinent pas leurs base d’usagers en différentes connections à la base avec différents privilèges. NON. C’est l’application qui gèrent les droits des utilisateurs et l’application se connecte ensuite à la base de données avec un super-utilisateurs qui a tous les droits, et gare à la requête qui serait vicieusement et secrètement transformée par un attaquant.

Le type de caractère spécial capable de provoquer un arrêt de la requête SQL est le ‘;’. Heureusement, la plupart des bases sont prémunies contre cela puisqu’elles n’autorisent qu’une seule commande à la fois et c’est la première qui prévaut. Enfin, certaines applications exécutent des prétraitement sur les variables afin de les filtrer de tout caractères spéciaux ou encore afin de les encoder.

Ce type d’attaque devient de plus en plus difficile à réaliser mais quelques perches subsistent en la nature de transformations mal aiguillées par l’application, qui pourrait par exemple faire l’erreur de laisser passer la requête injectée plutôt que la requête initiale. À cet effet, les requêtes préparées à l’avance (prepared statement) apportent un niveau de sécurité supplémentaire en plus de l’optimisation apportée. Celles-ci, couplées à un engin de traitement automatique des variables injectées dans les requêtes permet d’apporter une sécurisation indépendantes des opérations de programmation opérées lors de la réception des variables.

Cependant, une grande communauté de programmeurs préfèrent opérer la filtration dès la réception des variables afin d’éviter les autres inconvénients possibles de l’injection de données.

Un bon programme de test de l’application devrait donc contenir non-seulement des injections aléatoires de données mais aussi des injections systématiques des caractères dangereux pour en vérifier l’effet réel.

Le détournement de requête par transformation des paramètres

Imaginons des données privilégiées qui sont mélangées à des données publiques dans la base de données ou encore les données personnelles de chacun qui sont contenues dans la même table.

Comme dans un appel de page web dynamique, dans la base de données il ne suffit que d’un paramètre pour modifier l’essence d’une requête. Par exemple:

La réponse à ces questions dépend de l’action coordonnées de l’architecture, de la programmation et de la formulation des requêtes SQL. Une vision d’ensemble est nécessaire et c’est pourquoi la construction des applications web doit être coordonnées et dirigées par un spécialiste du métier. Des connaissances en gestion sont bien insuffisantes car la construction d’applications web n’est pas symétrique à la construction de maisons.

Voici quelques trucs qui permettent dans certaines situations d’éviter les détournements de requêtes

Dans un prochain article, je ferai un essai de procédure systématique et de tableau résumé afin d’obtenir les résultats escomptés sans limiter indûment le pouvoir de l’utilisateur.

Voici un lien complémentaire en attendant ce tableau, qui résume les attaques possibles sous forme d’une “cheat sheet”

Posté par Nadine St-Amand pour Les formations Accent Net dans Base de données, Sécurité | RSS 2.0

Écrire une réponse