Sfruttare le iniezioni SQL è l'arte di fornire parametri che, una volta incorporati in un'istruzione SQL, producono una sintassi dell'istruzione SQL valida mentre cambiano la semantica voluta dallo sviluppatore in una parte che è proficua per un utente malintenzionato.
A seconda del DMBS e del tipo di istruzione, in cui l'iniezione è possibile, i risultati di un'iniezione SQL di successo variano dalla divulgazione delle informazioni (lettura di dati arbitrari, file locali), tramite manipolazione dei dati (inserimento, eliminazione o alterazione arbitraria) dati, scrivendo file locali), fino all'esecuzione arbitraria dei comandi.
Il DBMS e la dichiarazione influenzano anche quali tecniche possono essere utilizzate durante lo sfruttamento. Se l'API di connessione non consente l'esecuzione di più istruzioni (le cosiddette "query impilate"), il spesso citato Robert';DROP TABLE Students; --
non avrebbe effetto. In tal caso, anche si limita agli effetti collaterali del particolare tipo di istruzione in cui si verifica l'iniezione : se è un% dichiarazione diSELECT
, è molto probabile che sia possibile leggere solo i dati, ma non scrivere o cancellare dati.
E infine, dipende anche dal feedback che viene dato all'attaccante in merito al risultato dell'istruzione eseguita. I messaggi di errore, in particolare quelli generati da un'API di connessione o dal linguaggio di programmazione, sono spesso piuttosto tecnici e dettagliati e possono rivelare informazioni critiche, ad esempio parti dell'istruzione non riuscita come "Hai un errore nella sintassi SQL vicino a '...'". Tali messaggi possono fornire utili informazioni agli utenti malintenzionati sul contesto in cui avviene l'iniezione (tipo di istruzione, tipo di clausola, livello di nidificazione parentesi, ecc.).
Nel tuo esempio un semplice id=' OR '1'='1
risulterebbe nella seguente affermazione:
SELECT * FROM 'mytable' WHERE id='' OR '1'='1'
Con quest'ultima espressione '1'='1'
verranno selezionate tutte le righe. Un'estensione a questo sarebbe utilizzare una sottoquery per leggere dati arbitrari in modo cieco:
SELECT * FROM 'mytable' WHERE id='' OR EXISTS (SELECT * FROM users WHERE name='admin' AND password LIKE 'a%') AND '1'='1'
Qui tutte le righe saranno selezionate solo se esiste un utente admin
la cui password inizia con a
, altrimenti non verrà selezionata alcuna riga. Questa tecnica è chiamata 'cieca booleana'.