SQL - utilizzando la concatenazione di stringhe, come posso sfruttare questa procedura?

2

Ho una semplice stored procedure:

create procedure [dbo].[test]
@str varchar (100)
AS
BEGIN
select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%' + @str +'%'
END
GO

Dato questo tipo di codice, in che modo posso sfruttarlo?

Mi è sempre stato detto che gli exploit del tipo

exec test ''' ''; truncate table [AdventureWorks2012].[HumanResources].[Employee];--'

Dovrebbe funzionare, ma ora è la prima volta che ho la possibilità di provarlo praticamente e non funziona.

La spiegazione che mi è stata data è stata

''' ''; truncate table [AdventureWorks2012].[HumanResources].[Employee];--'

Quando concatenato con la query diventa

select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%' + ' ' ; truncate table [AdventureWorks2012].[HumanResources].[Employee];-- + '%'

Quindi, la query SELECT verrà eseguita con il jobtitle alla ricerca di qualsiasi carattere seguito da uno spazio. Il ; termina la condizione where e quindi l'istruzione della tabella troncata viene eseguita. Dove sto andando male? Sto usando Microsoft SQL Server 2012.

    
posta Akash 06.12.2012 - 06:28
fonte

3 risposte

5

where JobTitle like '%' + @str +'%'

Questa non è una vulnerabilità di SQL-injection. Non inserisce il contenuto nella query da un livello superiore di controllo come una stringa EXEC o una chiamata da C #.

C'è un errore di iniezione qui, tuttavia non è SQL-injection. La concatenazione che viene eseguita è un termine di ricerca in un modello di query LIKE . I metacaratteri in LIKE sono % , _ e, in SQL Server, [ (non ANSI-standard).

Il risultato è che se qualcuno esegue una ricerca, ad esempio, 50% , otterrà risultati che contengono la sottostringa 50 e non solo quelli che contengono 50% . Anche l'uso di [ può causare un errore di sintassi. Questo è indesiderabile, ma non consente nessuno dei tradizionali attacchi di sicurezza che fanno le iniezioni SQL.

Per correggere le iniezioni LIKE, devi nominare un carattere LIKE-escape personalizzato e usarlo per sostituire tutti i metacaratteri LIKE, ad esempio:

SET @liketerm = REPLACE(REPLACE(REPLACE(REPLACE(@str, '!', '!!'), '%', '!%'), '_', '!_'), '[', '![');

... WHERE jobtitle LIKE '%'+@liketerm+'%' ESCAPE '!';
    
risposta data 06.12.2012 - 11:19
fonte
3

Giusto per chiarire la risposta di @ bobince (accetta la sua risposta, non la mia!), questa non è una preoccupazione di SQL injection perché l'istruzione non è costruita dinamicamente usando la variabile @str - invece è passato a un'istruzione statica.

Se la procedura invece legge:

BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = 'select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like ''%' + @str + '%''';
    EXEC @sql;
END

... saresti aperto a un'iniezione usando termini simili a quelli che hai digitato sopra. In genere, questi tipi di costrutti tendono ad accadere nel livello dell'applicazione, ad esempio un'app PHP o ASP (non individuandoli):

// NON-LANGUAGE-SPECIFIC PSEUDO CODE
var searchTerm = Request.Form("searchField");
var sql "select * from [AdventureWorks2012].[HumanResources].[Employee] where JobTitle like '%" & searchTerm & "%'";
var results = db.execute(sql);

Un luogo comune in cui viene visualizzato tale codice si trova nelle procedure di ricerca a più campi, in cui l'utente può fornire un numero di valori e ogni valore viene confrontato con un campo diverso o richiede un join diverso. L'SQL viene quindi creato per aggiungere solo le clausole WHERE o JOIN se e quando viene fornito un termine (che può fornire una query più performante). Dovresti fare molta attenzione a disinfettare correttamente i tuoi input se hai bisogno di farlo nella tua app.

    
risposta data 06.12.2012 - 17:40
fonte
0

Gli input che stai dando non funzioneranno.

Dovrai prima chiudere il carattere '%' e poi inserire la tua query. La tua query finale dovrebbe essere:

dove a JobTitle piace "% str%"; query da aggiungere - "

Spero che questo aiuti.

    
risposta data 06.12.2012 - 07:08
fonte

Leggi altre domande sui tag