venerdì 4 aprile 2025

Entity Framework una situazione reale di SQL injection

Entity framework sql injection

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.

Entity framework sql injection

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.

Entity framework sql injection


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.

Entity framework sql injection


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. 

Nessun commento: