2010-10-22 27 views
2

Nous avons changé nos règles de pare-feu (RegEx) à ce qui suit:Est-ce que ces motifs regex vont attraper toutes les injections SQL nécessaires?

Name 
Type 
Context 
Severity 
Pattern 

CS:select_into 
signature 
http-url 
critical 
.*\[select\]\s+.*\[into\].* 

CS:select_from 
signature 
http-url 
critical 
.*\[select\]\s+.*\[from\].* 

CS:insert_into 
signature 
http-url 
critical 
.*\[insert\]\s+.*\[into\].* 

CS:drop_database 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[database\].* 

CS:drop_table 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[table\].* 

CS:delete_from 
signature 
http-url 
critical 
.*\[delete\]\s+.*\[from\].* 

CS:drop_view 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[view\].* 

CS:exec 
signature 
http-url 
critical 
.*\[exec\].*(%28|\().*(%29|\)).* 

CS:update_set 
signature 
http-url 
critical 
.*\[update\](%20|\+)(%20|\+|.)*\[set\].* 

ce que ce bloc toutes les tentatives d'injection SQL? Par exemple, est-il possible de supprimer une vue en utilisant plusieurs espaces?

+12

Non, absolument pas! – Gumbo

+2

Probablement, l'attaquant pourrait juste POST l'injection SQL plutôt que de l'ajouter à l'URL. –

+8

Vous protégez l'injection SQL sous forme de base de données à l'aide de règles de regex de pare-feu? Vous aimez vivre sur le bord ... ;-) –

Répondre

21

Une liste noire est la mauvaise approche. Il y aura toujours des choses auxquelles vous n'avez pas pensé, auxquelles l'attaquant pensera.

Quel langage de programmation/base de données utilisez-vous? Ils ont tous des méthodes pour transmettre des paramètres aux instructions SQL. Par exemple:

String userName = .... ; // from your GET or POST parameter 
String sql = "SELECT id FROM user where user_name=?"; 
ResultSet rs = executeSql(sql, userName); 

Voir http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements

+2

+1 si vous êtes sur la défensive alors vous ne mettez pas sur liste noire – annakata

+0

+1 bien dit, et battez-moi – AdaTheDev

+1

La liste noire est juste un addon à notre sécurité existante. Nous avons mis en place plus de moyens pour éviter ce type de piratage. Une de nos couches est celle-ci, et nous avons remarqué que même si nous avons nos autres couches de sécurité, celle-ci arrête certaines entrées dangereuses. – Younes

2

Essayer d'empêcher l'injection sql en filtrant certains mots ne va pas travailler - il y aura toujours quelque chose que vous manquez et sera beaucoup de temps pour essayer de trouver tout couvrir. Vous devriez regarder des choses comme comment vous interrogez la base de données - si vous construisez SQL à la volée et concaténer les valeurs du client directement dans l'instruction, alors cela va être un domaine important sur lequel vous concentrer - passer à en utilisant des procédures SQL/paramétrées paramétrées. Les procédures stockées vous donneront également une couche de sécurité supplémentaire car vous pouvez accorder des autorisations pour les exécuter sans accorder d'autorisations directes sur les tables sous-jacentes.

0

Vous ne devez pas utiliser regex pour le filtrage d'entrée.

Vous devez filtrer vos entrées une par une avant de les transmettre au serveur SQL. Si vous insérez une chaîne (ou quoi que ce soit entre des apostrophes dans l'instruction sql), vous devez utiliser la fonction d'échappement de votre serveur sql, ce qui empêchera toute attaque.

Si vos données sont d'un type de nombre (entier ou flottant), vous devez vérifier si les données sont réellement un nombre (vous ne pouvez pas faire d'injection SQL sans lettres). La meilleure façon de le faire dépend du langage de programmation que vous utilisez, mais surtout des vérifications de type ou des catalogues forcés. Vous ne devez jamais insérer des données de type chaîne non fiables (tout ce qui vient d'un utilisateur n'est pas fiable) dans un état sqnd, où vous ne pouvez pas placer d'apostrophes, comme pour une table ou un nom de colonne.

0

Vous devez vous assurer que tout code SQL est uniquement exécuté via un compte à privilèges limités qui ne dispose d'aucune autorisation, sauf ceux dont l'application a explicitement besoin, plutôt que d'essayer d'intercepter toutes les permutations de SQL hostile.

+2

Eh bien, ce n'est pas vraiment possible dans de vraies applications. Par exemple, vous souhaiterez peut-être que votre application puisse mettre à jour le solde d'un utilisateur.Vous ne voulez probablement pas le laisser tromper dans la mise à jour de ce solde à 1 million de dollars. La restriction de privilège ne vous obtiendra pas cela. – Gaius

+0

Les mises à jour doivent être plus fortement contrôlées et si possible effectuées sous un compte authentifié séparément. Il ne devrait pas y avoir de place pour un compte exposé à la possibilité de SQL dynamique ayant les permissions pour faire les commandes que l'OP essaie de bloquer avec RegEx. Il ne devrait pas y avoir de privilèges au-dessus du minimum requis par l'application. – MartW