web-dev-qa-db-fra.com

Aucun guillemet simple n'est autorisé, ce point d'injection SQL est-il toujours exploitable?

La phrase SQL ressemble à ceci,

"SELECT * from XX where id = '" + id + "'"

La variable id provient directement du paramètre GET nommé id.

Et l'application Web Java a explicitement interdit les guillemets simples. Si un seul guillemet a été trouvé dans ce paramètre, le serveur arrête de le traiter immédiatement et renvoie une erreur.

Alors, est-ce toujours exploitable? Avec environnement postgresql et Tomcat.

8
daisy

Vous voudrez peut-être jeter un œil à ce document ( lien vers la machine de retour ). Il détaille certaines méthodes de contournement de ces filtres.

Par exemple, certains filtres SQL remplacent tous les guillemets simples par une paire de guillemets simples. Cependant, en leur fournissant une entrée contenant \' peut contourner cela.

En outre, il y a la contrebande Unicode, où vous utilisez un caractère Unicode que Java (PHP/Ruby/Python/autre) comprend comme étant différent d'une citation, mais pas la base de données.

Sauf si vous avez une très, très bonne raison, je vous recommande d'utiliser l'échappement intégré.

14
Manishearth

Vous parlez de "prévenir le mal connu" qui ne fonctionne que jusqu'à ce que quelqu'un pense à une nouvelle mauvaise chose. Comme le dit @Manishearth, \' est une technique. Pour une URL, %27 en est un autre. En HTML, vous pouvez avoir ', ', ', ', ' sont d'autres. Que fait votre serveur si ces techniques sont combinées comme dans, %40%230039%3B (' URL encodée) ou %5C%27 (\' URL encodée) ou \\\\'?

Prévenir les problèmes connus est toujours une proposition risquée. Autoriser le bien connu est toujours meilleur quand c'est une option. Ainsi, la conversion en un type entier offrira toujours plus de sécurité que d'essayer d'empêcher des chaînes spécifiques. Les déclarations préparées offrent une excellente couche de protection.

Consultez l'article Wikipédia sur SQL Injection Mitigation .

10
GlenPeterson

En supposant que le paramètre GET 'id' en chiffres uniquement, la meilleure chose à faire est de vérifier si l'ID vraiment contient uniquement des chiffres, par exemple en le convertissant en INT (et en détectant l'exception le cas échéant) , et pas des choses désagréables comme des guillemets/barres obliques/caractères codés/etc.

En général, je préfère avoir une vraie variable entière car je sais parfaitement qu'elle ne contient que des chiffres, plutôt qu'une chaîne d'échappement qui pourrait contient des caractères étranges ..

2
Jeremy