Descrivere SQL injection

Completato

SQL injection è un metodo comune usato per le violazioni dei dati. L'attacco comporta l'aggiunta di un comando SQL a un campo modulo in un front-end Web o dell'applicazione, in genere tramite un sito Web, con lo scopo di interrompere lo script SQL originale ed eseguire lo script SQL inserito. Ciò si verifica spesso quando sql generato dinamicamente viene usato all'interno dell'applicazione client. La causa principale degli attacchi SQL injection è una scarsa procedura di codifica sia nell'applicazione client che nelle stored procedure di database. Anche se molti sviluppatori adottano procedure migliori, SQL injection rimane un problema significativo a causa della prevalenza delle applicazioni legacy e delle applicazioni più recenti create dagli sviluppatori che non hanno dato priorità alla prevenzione dell'inserimento DI SQL.

Si supponga, ad esempio, che un'applicazione Web front-end crei un'istruzione SQL dinamica come indicato di seguito:

SELECT * FROM Orders WHERE OrderId=25

Questa istruzione T-SQL viene creata quando l'utente passa alla parte relativa alla cronologia degli ordini di vendita del sito Web della società e immette 25 nel campo modulo per il numero ID dell'ordine. Si supponga, tuttavia, che l'utente immetta più di un solo numero ID, ad esempio "25; DELETE FROM Orders;"

In tal caso, la query inviata al database sarà la seguente:

SELECT * FROM Orders WHERE OrderID=25; DELETE FROM Orders;

Il funzionamento della query nell'esempio precedente consiste nel fatto che il database SQL viene indicato tramite il punto e virgola ";" che l'istruzione è terminata e che deve essere eseguita un'altra istruzione. Il database elabora quindi l'istruzione successiva come indicato, causando l'eliminazione di tutte le righe dalla tabella Orders.

La query iniziale SELECT viene eseguita normalmente senza generare errori. Tuttavia, quando si esamina la tabella Ordini, non si vedono righe. È stata eseguita anche la seconda query del batch, che elimina tutte le righe.

Una tecnica usata per impedire attacchi SQL injection consiste nel controllare il testo dei parametri o i valori immessi nei campi modulo cercando diverse parole chiave. Tuttavia, questa soluzione fornisce solo una protezione minima perché esistono molti modi per far sì che questi attacchi funzionino. Alcune di queste tecniche di inserimento includono il passaggio di dati binari, la conversione da parte del motore di database dei dati binari in una stringa di testo e quindi l'esecuzione della stringa.

È possibile eseguire il codice T-SQL seguente per visualizzare un esempio di questo scenario.

DECLARE @v VARCHAR(255)

SELECT @v = cast(0x73705F68656C706462 AS VARCHAR(255))

EXEC (@v)

Quando si accettano dati da un utente, sia che si tratti di un cliente o di un dipendente, è fondamentale verificare che l'input corrisponda al tipo di dati previsto per impedire attacchi SQL injection. Se è previsto un numero, l'applicazione client deve verificare che l'input sia effettivamente un numero. Se è prevista una stringa di testo, assicurarsi che sia della lunghezza corretta e non contenga dati binari. L'applicazione client deve convalidare tutti gli input dell'utente. La convalida può essere eseguita informando l'utente del problema e consentendogli di correggerlo o gestendo correttamente l'errore per assicurarsi che non vengano inviati comandi al database o al file system.

Correggere il codice dell'applicazione dovrebbe essere sempre la priorità, tuttavia potrebbero esserci casi in cui non è possibile farlo. In questi casi, Advanced Threat Protection può offrire un livello di sicurezza aggiuntivo per i dati sensibili.