Quels sont les personnages sont réellement capables de provoquer une injection SQL dans mysql

Nous savons tous que nous devrions utiliser les requêtes préparées ou le remplacement/règles de mise en forme afin de prévenir l'injection sql dans nos applications.

Toutefois, lorsque vous prenez un coup d'oeil à MySQL liste de chaînes de caractères, j'ai remarqué qu'il comprend les caractères suivants:

  • \0 Un ASCII NUL ( 0x00 ).
  • \' Un guillemet simple ( ' ).
  • \" Un guillemet double ( " ).
  • \b Un caractère de retour arrière.
  • \n Un retour à la ligne, saut de ligne).
  • \r Un caractère de retour chariot.
  • \t Un caractère de tabulation.
  • \Z 26 ASCII (Ctrl+Z). Voir la note à la suite de la table.
  • \\ Une barre oblique inverse ( \ ).
  • \% Un % caractère.
  • \_ Un _ caractère.

Maintenant, alors que la % et _ caractères doivent être échappés afin d'éviter l'injection de indésirables des caractères génériques dans les déclarations, et alors que le ' (apostrophe), \ (barre oblique inverse), et " (double quote) tous doivent être échappés afin d'éviter l'injection de requêtes SQL - pourrait avoir l'une de ces autres personnages sans échappement conduire directement à une vulnérabilité d'injection SQL qui autrement ne seraient pas présents? Quelqu'un at-il des exemples du monde réel d'un tel exploit?

Supposons que nous construisons notre requête comme:

SELECT * FROM users WHERE username='$user'

Est-il de la valeur pour $user où la seule sans échappement de caractères littéraux sont \b (retour arrière), \0 (NUL), \n (saut de ligne), \r (saut de ligne), \t (tab) ou \Z (Ctrl+Z) qui permet l'injection de requêtes SQL dans cette requête?

Je veux savoir si le signe "%" peut conduire à quelque chose de plus que des résultats supplémentaires dans une clause LIKE.
La réponse courte à votre question est, autant que je sache, pas de ce type de caractères (même si sans échappement) de ne pas interrompre la chaîne de caractères littérale contexte et de la place du serveur dans SQL contexte; ainsi, l'injection SQL ne peut pas apparaître. Cependant, vous devez être attentif à ce que vos échapper méthodologie est conscient du jeu de caractères que le serveur utilise pour décoder le littéral de chaîne d'octets reçus du: si l'échappement est réalisée dans un jeu de caractères différent, il peut être possible pour soigneusement conçu chaînes de résilier le littéral de chaîne et de les injecter un code SQL arbitraire.
Le démarrage d'une comme avec un % modifie le plan de requête à utiliser une analyse de la table qui est généralement mauvais pour la performance. Donc, si tout le reste est géré qui peut encore être utilisé pour attaquer un système. Selon l'interface que vous utilisez, l'injection d'un ; il peut vous permettre d'exécuter une deuxième requête. C'est une bonne politique pour limiter les autorisations de l'utilisateur de l'exécution de la requête. Ligne de caractères de commentaire -- dans mysql peut aussi causer des problèmes. ex: mise à JOUR aux utilisateurs de définir des access_time = x where id = y; si x est -9999 -- qui pourrait être utilisé pour mettre à jour tous les utilisateurs access_time.
Je ne vois pas un caractère de commentaire répertoriés. C'est l'un des plus communs qui sont listés dans des attaques par injection SQL.

OriginalL'auteur schizodactyl | 2013-01-17