Se défendre contre un "WAITFOR DELAY' attaque par injection sql?
Le problème
Nous avons besoin pour se défendre contre un "WAITFOR DELAY' attaque par injection sql dans notre application java.
Fond
[C'est long. Passez à la Solution? " section ci-dessous si vous êtes pressé ]
Notre application utilise principalement des déclarations préparées à l'avance et appelable consolidés (procédures stockées) dans l'accès à la base de données.
Dans quelques endroits de nous construire, de façon dynamique et d'exécuter des requêtes de sélection. Dans ce paradigme, nous utilisons un critère de l'objet à construire la requête en fonction de l'entrée utilisateur critères. Par exemple, si l'utilisateur a spécifié des valeurs pour first_name et last_name, le résultat de l'interrogation toujours ressemble à quelque chose comme ceci:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier'
(Dans cet exemple, l'utilisateur a spécifié "joe" et "frazier" comme une de ses valeurs d'entrée. Si l'utilisateur avait plus ou moins critère on aurait plus ou moins de requêtes. Nous avons constaté que cette approche est plus facile que d'utiliser des requêtes préparées et plus rapide/plus performants que les procédures stockées).
L'attaque
Une vulnérabilité de vérification ont signalé une injection sql échec. L'attaquant injecté la valeur " frazier WAITFOR DELAY '00:00:20' pour le 'last_name' paramètre, ce qui entraîne dans cette sql:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20'
Le résultat: la requête s'exécute correctement, mais prend 20 secondes à s'exécuter. Un attaquant pourrait attacher toutes vos connexions de base de données dans la base de données de la piscine et efficace de l'arrêt de votre site.
Quelques observations au sujet de cette "WAITFOR DELAY' attaque
- J'avais pensé que, parce que nous avons utilisé Déclaration executeQuery(String) nous serions à l'abri de l'injection sql. executeQuery(String) ne s'exécute pas DML ou DDL (supprime ou diminue). Et executeQuery(String) étouffe sur des points-virgules, donc le "Bobby Tables" paradigme sera un échec (c'est à dire l'utilisateur entre les 'frazier; DROP TABLE' pour un paramètre. Voir. http://xkcd.com/327/)
- 'L'ATTENTE' attaque diffère sur un point important: WAITFOR modifie le 'SELECT' de la commande, et n'est pas une commande séparée.
- L'attaque ne fonctionne que sur le dernier paramètre dans la requête. c'est à dire 'WAITFOR" doit se produire à la fin de l'instruction sql
Solution, Hack, ou les Deux?
La solution la plus évidente consiste simplement à virer de bord "ET 1=1" sur la clause where.
L'résultant sql échoue immédiatement et les feuilles de l'attaquant:
SELECT first_name,last_name FROM MEMBER WHERE first_name ='joe' AND last_name='frazier' WAITFOR DELAY '00:00:20' AND 1=1
Les Questions
- Est-ce une solution viable pour la WAITFOR attaque?
- Est-il défendre contre d'autres semblables vulnérabilités?
- Je pense que la meilleure option impliquerait en utilisant les requêtes préparées. Plus de travail, mais moins vulnérable.
règle #1: ne pas synthétiser et d'exécuter du code à partir de sources non fiables...
OriginalL'auteur user72150 | 2010-01-07
Vous devez vous connecter pour publier un commentaire.
La bonne façon de gérer l'injection SQL consiste à utiliser des requêtes paramétrées. Tout le reste est juste pisser dans le vent. Il peut fonctionner un temps, même deux fois, mais finalement, vous serez frappés par cette sensation de chaleur qui dit "vous foutu mal!"
Quoi que vous fassiez, à l'exception des requêtes paramétrées, va être sous-optimale, et ce sera à vous de vous assurer que votre solution n'a pas d'autres trous que vous avez besoin de patch.
Des requêtes paramétrées, d'autre part, fonctionne hors de la boîte, et empêche toutes ces attaques.
C'est pourquoi j'ai dit "requête paramétrée", pas "requête préparée".
"La bonne façon de gérer l'injection SQL consiste à utiliser des requêtes paramétrées. Tout le reste est juste pisser dans le vent" Merci pour avoir dit la vérité! C'est la réponse à presque tous les programmes de sécurité de problème en fait.
OriginalL'auteur Lasse Vågsæther Karlsen
Injection SQL est SQL injection - il n'y a rien de spécial au sujet d'un
WAITFOR DELAY
.Il n'y a absolument aucune excuse pour ne pas utiliser les requêtes préparées à une telle requête simple dans cette journée et l'âge.
(Edit: Ok, pas "absolument" - mais il n'y a presque jamais une excuse)
Pas vraiment. Juste paramétrer l'individu EN jetons (
WHERE status IN (?, ?, ?)
).une ride: la taille de la liste peut varier. liste dynamique des tailles de présenter un problème, autant que je sache, la preparedStatement sql peut avoir une longue liste de '?' (c'est à dire à la limite supérieure de la taille de la liste), vous pouvez définir les 3 premières et l'utilisation setNull pour définir la date de upperbound-3. c'est a dire : OÙ le statut (?,?,?,?,?,?,?,?,?,?)
C'est un problème résolu: javaranch.com/journal/200510/Journal200510.jsp#a2 une de ces approches sont mieux que les premières chaînes.
Non, je pense que c'est 'absolument'. Il n'y a pas d'exceptions. Tout ce que vous pensez est une exception est en fait quelque chose que vous avez besoin pour résoudre d'une autre manière.
OriginalL'auteur Aaronaught
Je pense que vous l'avez suggéré, la solution vous-même: des Requêtes Paramétrées.
Comment avez-vous trouvez que votre construites dynamiquement la requête est plus rapide que d'utiliser une procédure stockée? En général, il est souvent à l'opposé.
de mon expérience, le SQL optimiseurs/moteurs très mal sur de telles procédures; ils se sont re-utiliser un très générique plan d'accès (habituellement analyse complète de la table) plutôt que de reconnaître à la volée à l'utilisation d'un indice particulier . En outre, certaines valeurs sont en fait des listes (c'est à dire " OÙ le rang dans le classement (1,2,3)' ). J'ai dans les endroits passé valeurs séparées par des virgules listes à une procédure stockée, analysé et peuplée d'une table temporaire, et s'est joint à l'encontre de la table temporaire, mais cette pratique fonctionne PIRE qu'un simple sql avec une clause in.
enfin, pour résumer, à partir de mon expérience : simple sql effectue meilleur. Super-fantaisie sql rend super lent. Les optimiseurs et de l'accès-plan-les générateurs ne sont pas si intelligents. (également nous soutenir un peu différent de la db ont donc des limites à la façon dont de nombreux indices nous pouvons fournir)
Si l'on doit à cet effet utiliser SQL générées de manière dynamique, d'assainir l'entrée. Je veux dire de l'échappement de chaînes, et de la validation des types numériques, etc. Il y a beaucoup de pré-code existant pour le faire pour vous.
Les procédures stockées ne sera pas vous protéger contre les injections SQL si vous casser les chaînes dans la procédure stockée lui-même et puis exec() le résultat. J'ai vu ce fait. La chose importante à souligner est paramétrés requêtes.
OriginalL'auteur Daniel Vassallo
Pour répondre à toutes vos questions:
Est-ce une solution viable pour la WAITFOR attaque?
Pas. Juste ajouter -- à l'attaque de la chaîne et il ignorera votre correction.
Est-il défendre contre d'autres semblables vulnérabilités?
Pas. Voir ci-dessus.
Je pense que la meilleure option impliquerait en utilisant les requêtes préparées. Plus de travail, mais moins vulnérable.
Oui. Vous n'avez pas de fixer SQL injection vous-même. Vous utiliser ce qui est déjà existant et que vous l'utilisez à droite, qui est, par paramétrage dynamique une partie de votre requête.
Un autre moindre solution est d'échapper à toute chaîne qui va obtenir insérée dans votre requête, cependant, vous sera oublier un jour, et vous avez seulement besoin de quelqu'un pour obtenir de l'attaqué.
OriginalL'auteur Coincoin
Tout le monde a cloué cette (paramétrer!) mais juste pour toucher sur un couple de points ici:
Non, il ne le fait pas. Le WAITFOR truc, c'est probablement tout simplement être utilisé pour le "sniffing" de la vulnérabilité; une fois qu'ils ont trouvé la page vulnérable, il y a beaucoup plus de choses qu'ils peuvent faire sans DDL ou (le non-SÉLECTIONNER des parties d') DML. Par exemple, penser que s'ils ont réussi les éléments suivants comme nom
Même après l'ajout de la ET 1 = 1, vous êtes toujours arrosé. Dans la plupart des bases de données, il y a beaucoup de choses malveillantes que vous pouvez faire avec il suffit de SÉLECTIONNER l'accès...
OriginalL'auteur Cowan
Comment suivre xkcd et désinfecter l'entrée. Vous pouvez le vérifier mots réservés en général et pour WAITFOR en particulier.
Je n'ai pas de -1, mais il peut sembler que la première phrase de votre réponse pourrait justifier un +1 (puisqu'il mentionne xkcd), mais ensuite, vous arrivez à la deuxième phrase. Et c'est là que tout tombe à l'eau.
L'interdiction des mots clés réservés est une stratégie que la TSA peut se permettre de dépenser des milliards sur et sortir avec.
Ha, j'ai été aveuglé par l'autorité de xkcd 🙂 à l'Aide de déclarations préparées à l'avance, au contraire, est évidemment la voie à suivre.
OriginalL'auteur David Soroko