No, non esiste una lunghezza troppo breve per essere sfruttabile (almeno in alcune situazioni).
Un filtro di lunghezza non è una protezione valida contro l'iniezione SQL e le istruzioni preparate sono davvero solo una difesa adeguata.
Un filtro di lunghezza è comunque una buona misura come difesa in profondità (così come i filtri interi, i filtri alfa, ecc.). Ci sono molte situazioni in cui ad es. un input valido non potrebbe mai essere superiore a 30 caratteri, ma dove uno sfruttamento significativo richiede di più. Dovrebbe (ma probabilmente non lo è) essere ovvio che qualsiasi filtraggio come difesa in profondità deve avvenire lato server poiché qualsiasi cosa lato client può essere semplicemente aggirata.
Bypass restrizione
Le clausole di restrizione (ad esempio AND
/ OR
) possono essere ignorate da due caratteri, il che può causare danni reali, non solo una query fallita. L'esempio più semplice è un accesso (altri esempi sarebbero l'eliminazione non autorizzata di dati aggiuntivi):
SELECT * FROM users WHERE userid = [id] AND password = [password]
Iniezione:
id = 1 # password = wrong_password
Payload: 2 caratteri
DoS
Gli attacchi DoS richiedono pochissimi caratteri. In un esempio MySQL, sono necessari 7 per la chiamata effettiva + x per i secondi dati + tutto ciò che è necessario per poter chiamare la funzione e correggere la query.
Esempio:
SELECT * FROM users WHERE userid = [id]
Injection (questa è un'iniezione valida, una forma più lunga sarebbe 1 AND sleep (99)
):
sleep (99)
Payload: 9 caratteri
Lettura dati
Se i dati viene visualizzato, la lunghezza dipende principalmente dal nome della tabella e della colonna. Presumo che il conteggio delle colonne sia uguale per tutte le tabelle (può succedere e salva i caratteri).
Esempio :
SELEZIONA * DA commenti WHERE commentid = [id]
Iniezione:
1 unione seleziona * dagli utenti
Payload: 27 caratteri.
Modifica dati
È anche possibile apportare modifiche non autorizzate al database con pochi caratteri.
Esempio:
UPDATE users SET password = '[password]' WHERE id = [id]
Iniezione (nella password):
', isadmin =' 1
Payload: 12 caratteri
Funzionerebbe anche un bypass delle restrizioni (il risultato è che tutte le password ora sono vuote *):
'#
Payload: 2 caratteri
* L'esempio della password è usato per semplicità; le password dovrebbero essere sottoposte ad hashing rendendo impossibile l'esempio. L'esempio si applica ancora in tutte le situazioni simili (aggiornamento di un nome utente, aggiornamento delle autorizzazioni e così via)