Recherche…


Exécuter l'instruction SQL fournie sous forme de chaîne

Dans certains cas, vous devrez exécuter une requête SQL placée dans une chaîne. EXEC, EXECUTE ou la procédure système sp_executesql peut exécuter toute requête SQL fournie sous forme de chaîne:

sp_executesql N'SELECT * FROM sys.objects'
-- or
sp_executesql @stmt = N'SELECT * FROM sys.objects'
-- or
EXEC sp_executesql N'SELECT * FROM sys.objects'
-- or
EXEC('SELECT * FROM sys.columns')
-- or
EXECUTE('SELECT * FROM sys.tables')

Cette procédure renvoie le même jeu de résultats que la requête SQL fournie en tant que texte d'instruction. sp_executesql peut exécuter une requête SQL fournie sous forme de chaîne, de variable / paramètre ou même d'expression:

declare @table nvarchar(40) = N'product items'
EXEC(N'SELECT * FROM ' + @table)
declare @sql nvarchar(40) = N'SELECT * FROM ' + QUOTENAME(@table);
EXEC sp_executesql @sql

Vous avez besoin de la fonction QUOTENAME pour échapper les caractères spéciaux dans la variable @table. Sans cette fonction, vous obtiendrez une erreur de syntaxe si la variable @table contient quelque chose comme des espaces, des crochets ou tout autre caractère spécial.

SQL dynamique exécuté en tant qu'utilisateur différent

Vous pouvez exécuter une requête SQL en tant qu'utilisateur différent en utilisant AS USER = 'nom de l'utilisateur de la base de données'

EXEC(N'SELECT * FROM product') AS USER = 'dbo'

La requête SQL sera exécutée sous l'utilisateur de la base de données dbo. Toutes les vérifications d'autorisation applicables à l'utilisateur dbo seront vérifiées sur la requête SQL.

Injection SQL avec SQL dynamique

Les requêtes dynamiques sont

SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)

Si la valeur de la variable utilisateur est myusername '' OR 1 = 1 - la requête suivante sera exécutée:

SELECT COUNT(*)
FROM AppUsers 
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''

Le commentaire à la fin de la valeur de la variable @username fera un commentaire hors partie de la requête et la condition 1 = 1 sera évaluée. L'application qui la contrôle au moins un utilisateur renvoyé par cette requête renvoie un nombre supérieur à 0 et la connexion réussira.

En utilisant cette approche, l'attaquant peut se connecter à l'application même s'il ne connaît pas un nom d'utilisateur et un mot de passe valides.

SQL dynamique avec paramètres

Pour éviter les problèmes d’injection et d’échappement, les requêtes SQL dynamiques doivent être exécutées avec des paramètres, par exemple:

SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = @user AND Password = @pass
EXEC sp_executesql @sql, '@user nvarchar(50), @pass nvarchar(50)', @username, @password

Le second paramètre est une liste de paramètres utilisés dans les requêtes avec leurs types, une fois que cette liste contient des variables qui seront utilisées comme valeurs de paramètre.

sp_executesql échappera aux caractères spéciaux et exécutera la requête SQL.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow