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.
malheureusement, la seule personne qu'elle a des feuilles est vous-même. Si vous amure, au lieu de le retarder, "or 1=1", vous risquez de vous retrouver en permettant à chacun et à chacun de se connecter. N'essayez pas de vous tromper en pensant que vous pouvez gérer à déjouer tous ceux qui veut essayer de casser votre site. Vous êtes une personne, si votre site est populaire, ils sont nombreux. Si elle ne l'est pas, alors il n'a probablement pas d'importance ce que, si quelque chose, vous ne.
règle #1: ne pas synthétiser et d'exécuter du code à partir de sources non fiables...

OriginalL'auteur user72150 | 2010-01-07