Microsoft SQL Server
SQL dinamico
Ricerca…
Esegui istruzione SQL fornita come stringa
In alcuni casi, è necessario eseguire la query SQL inserita nella stringa. EXEC, EXECUTE o procedura di sistema sp_executesql può eseguire qualsiasi query SQL fornita come stringa:
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')
Questa procedura restituirà lo stesso set di risultati della query SQL fornita come testo dell'istruzione. sp_executesql può eseguire query SQL fornite come string letteral, variable / parameter o even 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
Hai bisogno della funzione QUOTENAME per sfuggire ai caratteri speciali nella variabile @table. Senza questa funzione si otterrebbe l'errore di sintassi se la variabile @table contiene qualcosa come spazi, parentesi o qualsiasi altro carattere speciale.
SQL dinamico eseguito come utente diverso
Puoi eseguire query SQL come utente diverso usando AS USER = 'nome utente del database'
EXEC(N'SELECT * FROM product') AS USER = 'dbo'
La query SQL verrà eseguita con l'utente del database dbo. Verranno verificati tutti i controlli di autorizzazione applicabili all'utente dbo sulla query SQL.
SQL Injection con SQL dinamico
Le query dinamiche sono
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)
Se il valore della variabile utente è myusername '' OR 1 = 1 - verrà eseguita la seguente query:
SELECT COUNT(*)
FROM AppUsers
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''
Il commento alla fine del valore della variabile @nomeutente commenterà la parte finale della query e verrà valutata la condizione 1 = 1. L'applicazione che verifica che ci sia almeno un utente restituito da questa query restituirà un conteggio maggiore di 0 e l'accesso avrà esito positivo.
Utilizzando questo approccio, l'attaccante può accedere all'applicazione anche se non conosce nome utente e password validi.
SQL dinamico con parametri
Per evitare problemi di iniezione e di fuga, le query SQL dinamiche devono essere eseguite con parametri, ad esempio:
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
Il secondo parametro è un elenco di parametri utilizzati nella query con i loro tipi, dopo questo elenco vengono fornite le variabili che verranno utilizzate come valori dei parametri.
sp_executesql eviterà caratteri speciali ed eseguirà query sql.