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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow