Il est faire une proposition sur le type de l'instruction SQL que les données de formulaire est remplacé dans, et en supposant qu'il sera mal aseptisé à un certain moment le long de la route. Considérons un programme de parler à un serveur SQL (code CISH purement par exemple):
fprintf(sql_connection, "SELECT foo,bar FROM users WHERE user='%s';");
Cependant, avec la chaîne ci-dessus, le serveur SQL voit:
SELECT foo,bar FROM users WHERE user='' and char(124)+user+char(124)=0 and ''='';
Whoops! Ce n'était pas ce que vous vouliez. Ce qui se passe ensuite dépend du back-end de la base de données et si vous avez activé ou non les rapports d'erreurs.
Il est assez commun pour les développeurs Web paresseux d'activer inconditionnellement la génération de rapports d'erreurs pour tous les clients et de ne pas les désactiver. (Moral: activer uniquement le rapport d'erreurs détaillé pour un réseau de confiance très serré, voire pas du tout.) Un tel rapport d'erreur contient généralement des informations utiles sur la structure de la base de données que l'attaquant peut utiliser pour savoir où aller.
Considérez maintenant le nom d'utilisateur '; DESCRIBE TABLE users; SELECT 1 FROM users WHERE 'a'='
. Et ainsi de suite ... Il y a quelques stratégies différentes en fonction de la manière exacte dont les données sortent. Il existe des kits d'injection SQL qui peuvent automatiser ce processus et tenter de vider automatiquement tout le contenu d'une base de données via une interface Web non sécurisée. Rafal Los's blog post contient un aperçu un peu plus technique.
Vous n'êtes pas limité au vol de données, que ce soit; si vous pouvez insérer du SQL arbitraire, eh bien, le obligatory xkcd reference l'illustre mieux que je ne peux.
Exactement ce que je cherchais. Merci! –
Il convient de noter que toutes les bases de données ne permettent pas l'empilement de requêtes. Par exemple mysql5 l'a introduit, mais mysql_query() accepte toujours seulement 1 requête. – rook