In questo articolo, vedremo un possibile caso di come tramite istruzione SQL, possiamo eseguire istruzioni SQL per compiere azioni malevoli, in particolare la cancellazione di una tabella.
L'esempio di codice dell'articolo, oltre al database SQL Serve e linguaggio di programmazione C#, utilizza Entity Framework, per la gestione dei dati.
L'esempio si basa su un'applicazione di tipo Windows Application, ma può si può realizzare anche in un progetto di tipo Web.
Il Database
In questo esempio utilizzeremo un database esistente (denominato Dati), con una tabella esistente chiamata "Anagrafica" con i campi IdAngrafica, nome e Cognome , dove idAnagrafica è il campo chiave contatore.
Si crea una nuova tabella, denominata "Test", con i campi "IDTest" di tipo contatore, Nome e Cognome, di tipo varchar, il tutto come mostrato in figura 1.
Figura 1 - La tabella che sarà eliminata.
Questa tabella, sarà quella che tramite istruzione SQL injection, ossia istruzione malintenzionata, porterà alla cancellazione della tabella "Test".
Si crea una Stored Procedure, che rileva i dati dalla tabella Anagrafica, questa StoredProcedure, accetta un parametro, questo parametro, sarà utilizzato per inviare istruzione SQL di tipo "Drop", per eliminare la tabella "Test".
Di seguito si riporta la Stored Procedure che esegue la selezione dei record.
CREATE PROCEDURE [dbo].[GetAnagrafica]
@nome varchar(50)
AS
BEGIN
-- SET
NOCOUNT ON added to prevent extra result sets from
--
interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert
statements for procedure here
SELECT * from Anagrafica where Nome = @nome
END
GO
La stored Procedure, effettua un filtro per la colonne nome.
Stesura del codice
Terminata la predisposizione della base dati, non resta che scrivere il codice per per eseguire tramite Entity Framework Core la stored Procedure.
Dopo aver aggiunto i riferimenti Entity Framework Core, mappato la base dati, in un evento click, oppure in una funzione o dove si desidera, tramite il metodo "FromSqlRaw" dell'entità eseguiamo la stored procedure passando oltre il parametro anche l'istruzione Drop.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
DatiContext dati = new DatiContext();
string nome = "Luigi;drop table test--";
var datiSP = dati.Anagraficas.FromSqlRaw($"EXECUTE GetAnagrafica {nome}").ToList();
Come si è visto dalla precedente riga di codice, oltre al valore di ricerca che viene passato, viene aggiunta l'istruzione Drop della tabella test, con la conseguenza che viene cancellata, come riportato nel SQL Server Profiler qui di seguito.
Figura 2 - Le varie attività di Sql Server, tra cui la cancellazione della tabella
Apriamo il database Sql Server, come da figura qui di seguito, la tabella è stata cancellata.
Figura 3 - La tabella test non esiste più
Una delle varie tecniche per evitare ciò, è quella di utilizzare il metodo "FromSql", che evita queste situazioni.
Conclusioni
L'articolo ha voluto fornire un esempio di scenario reale in cui si potrebbe verificare una situazione di sql injection, ossia, esecuzioni di istruzioni SQL per compiere azioni particolari e di proprio interesse su una base dati.
Per questo è importante realizzare applicazioni con particolare attenzione alla sicurezza, soprattutto quelle in ambito web, che tramite parametri passati alle Stored Procedure, possono eseguire codice malintenzionato.