2010-06-01 7 views
2

Je connais un peu les injections SQL et le décodage d'URL, mais quelqu'un qui est plus expert que moi sur ce sujet peut-il jeter un coup d'œil à la chaîne suivante et me dire exactement ce qu'il essaie de faire?Tentative d'injection SQL sur mon serveur

Un enfant de Pékin il y a quelques semaines a essayé un certain nombre d'injections comme celle ci-dessous.

% 27% 20et% 20char (124)% 2Buser% 2Bchar (124) = 0% 20et% 20% 27% 27% = 27

Répondre

4

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.

+0

Exactement ce que je cherchais. Merci! –

+1

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

2

Vous trouverez les informations détaillées ici:

http://blogs.technet.com/b/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx

Ces lignes sont à double codé - le premier ensemble de caractères codés, qui serait traduit par IIS, sont désignés par % XX. Par exemple,% 20 est un espace . Le deuxième ensemble ne doit pas être traduit jusqu'à ce qu'ils obtiennent au SQL Server et ils utilisent la fonction char (xxx) dans SQL.

+0

Je connais familièrement char(). À quoi sert cette chaîne? –

2
' and char(124)+user+char(124)=0 and ''=' 

qui est strange..however, assurez-vous échapper à des chaînes donc il n'y aura pas d'injections sql

+0

Tout a été nettoyé par une classe avant d'aller à la base de données, donc je suis raisonnablement sûr que rien n'est entré. –

+0

bon travail, vous n'avez rien à craindre alors :) –

+0

Je voudrais toujours le comprendre :) –

2

D'autres personnes ont couvert ce qui se passe, donc je vais prendre un moment pour monter sur mon cheval et suggérer fortement que si vous n'êtes pas déjà (je ne soupçonne pas d'un commentaire ci-dessous) que vous utiliser les requêtes paramétrées.Ils vous protègent littéralement de l'injection SQL car ils provoquent des paramètres et la requête est transmise complètement séparément. Il y a aussi des avantages de performance potentiels, yadda yadda, etc.

Mais sérieusement, faites-le.