web-dev-qa-db-fra.com

Injection SQL via Unicode

Mon équipe utilise actuellement ASP.NET avec MS SQL Server pour notre logiciel. La sécurité est devenue importante depuis que j'ai commencé, dans laquelle il y a des vulnérabilités d'injection partout.

En raison de l'intégration actuelle avec Oracle et MS SQL, la décision d'activité n'a jamais été utilisée. Ceci a bien sûr été un problème.

La mise en œuvre de la recherche et de la remplacement de la blanchissante des paramètres a fortement réduit le problème.

Mon seul problème est que j'ai lu beaucoup sur Unicode et d'autres codages étant la cause de l'injection SQL. Je ne comprends pas bien cela. Actuellement, nous désinfilons tout comme ceci:

        Const pattern As String = "^[a-zA-Z0-9.=,:\s\\\/\']*$"
        term = term.Replace("'", "''")

        If Not Tools.ValidString(term, pattern) Then
            term = String.Empty
        End If 

    Public Shared Function ValidString(ByVal source As String, ByVal pattern As String) As Boolean
        If source = String.Empty Then Return True

        Dim params As Text.RegularExpressions.RegexOptions = Text.RegularExpressions.RegexOptions.None
        Dim regex As New Text.RegularExpressions.Regex(pattern, params)
        Dim match As Text.RegularExpressions.Match = regex.Match(source, pattern, params)
        Return match.Success
    End Function

Est-ce que quelqu'un a un exemple dans lequel une injection unicode/codé pourrait être utilisée, ou simplement un exemple simple où cette expression régulière n'empêcherait pas d'empêcher l'injection SQL.

Merci

MISE À JOUR

Puis-je s'il vous plaît ne pas avoir de réponses liées à l'injection SQL standard. Je connais fortement cela avec cela déjà. Aussi, arrêtez d'arrêter de publier dire n'utilisez pas la mise en assainissement des chaînes. Il y a zéro ressource dans la société pour transférer toutes les requêtes sur les requêtes paramétrées avec ADO.NET tout en renforçant la logique pour utiliser ODP.NET si le client utilise Oracle. OWASP mentionne l'utilisation de la blanchissage de caractères si le paramétrage est hors de question, de sorte que cela ressemble dans le regex, seuls quelques caractères sont autorisés. Je ne suis pas des personnages enflammés, car c'est stupide.

Il n'y a pas de conformité requise pour les données que nous détenons. La sécurité est pour l'intégrité de la base de données, car ce serait un cauchemar si le contenu était modifié.

Notre logiciel est une très grande application de cloud CMS et DMS en un, où 99% du logiciel est utilisé interne, et seule une minorité est externe et n'est utilisée que pour la révision publique et les commentaires sur les documents.

De ma nouvelle compréhension de l'injection Unicode. Il ne peut se produire que si les données sont codées avant d'être placées dans la requête, et donc une injection Unicode ne se produit que dans les applications avec la mondialisation des données. Je passe des champs de chaîne brute directement dans la requête de chaîne après la mise à la dentelle ci-dessus.

Puis-je s'il vous plaît seulement avoir une réponse d'un expert en injection, qui peut sauvegarder ma prétention selon laquelle Unicode ne s'appliquera pas dans ma situation?

4
Cyassin

Il existe des cas d'injections SQL exploitant la conversion implicite de nicode homoglyphes des types de chaîne de caractères Unicode (NCHAR, NVARCHAR) aux types de chaîne de caractères (Char, Varchar). Un personnage tel que ʼ (U + 02BC) à NvarchaRar peut glisser à travers la routine d'échappement et être traduite en ' (U + 0027) dans Varcharate , qui peut entraîner une injection SQL lorsqu'une telle chaîne est utilisée pour créer une instruction SQL de manière dynamique.

Cependant, votre validation est assez stricte (uniquement des caractères du bloc de base latin unicode et caractères blancheurs unicode ) et je ne peux penser à aucun cas où cela échouerait.

6
Gumbo

La seule chose dont vous avez le plus besoin pour arrêter l'injection SQL est un demi-côon (;). Cependant, il n'est pas toujours simple de les éliminer. Vous aurez des situations dans lesquelles un demi-point est utilisé dans un champ de texte sous forme de caractère et non en tant que terminateur de commande SQL.

Il y a de nombreux articles qui entrent en détail sur la manière d'injecter et d'empêcher SQL dans vos questions.

Si vous écrivez une sortie de texte sur une page Web, encodez-la à l'aide de HTTTPUTIPH.HTMLENCODE. Faites cela si le texte provenait de l'entrée de l'utilisateur, une base de données ou un fichier local.

Cela porte à l'esprit l'une des méthodes utilisées pour protéger contre l'injection SQL: encoder des caractères qui causeront des problèmes de ceux qui ne peuvent pas.

Spécifiquement pour Unicode par rapport à tout autre codage, vous devrez toujours utiliser les mêmes techniques de recherche et de retirer ou de remplacer les caractères incriminés de vos chaînes.

[~ # ~ ~] Mise à jour [~ # ~]

Si vous encodez des chaînes Unicode à quelque chose comme/U0000, vous pouvez laisser la chaîne codée et la mettre en sécurité dans votre base de données sans vous soucier de l'injection SQL. Vous devrez écrire la routine qui effectue la désinfectation, car elle n'est pas intégrée à SQL Server.

2
Adam Zuckerman

Si vous envisagez comment Unicode peut être exploité, voir cette question , si vous recherchez une solution, il n'y en a vraiment que deux qui peuvent être considérés comme vraiment sécurisés: des requêtes paramétrées et codant tout Votre entrée dans Hex ou Base64 ou un autre codage qui ne laissait pas d'ouvrir la possibilité de modifier le contexte de la valeur.

Je réexaminerais sérieusement que l'utilisation de requêtes paramétrées - Thay est en fait remarquablement facile à utiliser, tandis que je ne connais pas votre base de code, il est généralement assez facile de basculer. Particulalement depuis l'introduction de méthodes d'extension.

2
jmoreno

S'il vous plaît, s'il vous plaît, s'il vous plaît, n'utilisez pas de regex à la main pour empêcher l'injection SQL. Vous ne devriez jamais écrire vos propres fonctions d'échappement, de filtrage ou de désinfectant pour empêcher l'injection SQL, les XSS, l'injection de coque ou similaires. Ce sont des choses que vous comptez sur des bibliothèques intégrées et vérifiées.

Là où vous pouvez l'éviter, n'utilisez même pas une fonction d'échappement de la bibliothèque standard. Utilisez des requêtes paramétrées.

Pour un, cela s'échappe ne vous aidera pas si vous utilisez une valeur entières non cotée à la fin d'une requête. En pseudocode:

check ValidString(input)
query("SELECT * FROM table WHERE id=" + input)

L'utilisateur peut facilement entrer 1 OR 1=1 Pour voir toutes les lignes dans table.

... ou ils peuvent entrer 1 UNION ALL SELECT password,1,1 FROM password_table ou similaire. Et maintenant, la sortie contient tous les mots de passe utilisateur.

Dis-vous qu'il est impossible de revenir en arrière et de convertir tout code SQL pour utiliser des requêtes paramatherzées? Si oui, je suppose que vous feriez mieux d'être sûr à 100% que vous citez toujours des valeurs SQL et de ne jamais faire de comparaisons ou d'insertions entier ...

Si j'étais vous, je convaincrais simplement convaincre votre gestion et/ou votre équipe que si la sécurité est souhaitée même au moindre, la durée doit être prise pour réécrire réellement le code de manière sécurisée.

2
Anorov