No, non c'è lunghezza troppo breve per essere sfruttata (almeno in alcune situazioni).
Un filtro di lunghezza non è una protezione valida contro l'iniezione SQL e le istruzioni preparate sono l'unica difesa adeguata.
Un filtro di lunghezza è comunque una buona misura come difesa in profondità (come i filtri interi, i filtri alfanumerici, ecc.). Esistono molte situazioni in cui ad es. l'input valido non può mai essere superiore a 30 caratteri, ma laddove uno sfruttamento significativo richiede di più. Dovrebbe (ma probabilmente non lo è) senza dire che qualsiasi filtraggio come difesa in profondità deve avvenire sul lato server in quanto qualsiasi cosa sul lato client può essere semplicemente aggirata.
Bypass di restrizione
Le clausole di restrizione (ad esempio AND
/ OR
) possono essere ignorate da due caratteri, che possono causare un danno reale, non solo una query non riuscita. L'esempio più semplice è un accesso (altri esempi potrebbero essere la cancellazione 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 di MySQL, occorrono 7 per la chiamata effettiva + x per i secondi specificati + tutto ciò che è necessario per poter chiamare la funzione e correggere la query.
Esempio:
SELECT * FROM users WHERE userid = [id]
Iniezione (questa è un'iniezione valida, una forma più lunga sarebbe 1 AND sleep(99)
):
sleep(99)
Payload: 9 caratteri
Lettura dei dati
Se i dati vengono visualizzati, la lunghezza dipende principalmente dal nome della tabella e della colonna. Assumerò il numero di colonne uguale per tutte le tabelle (potrebbe accadere e salva i caratteri).
Esempio:
SELECT * FROM comments WHERE commentid = [id]
Iniezione:
1 union select * from users
Payload: 27 caratteri.
Modifica dei dati
Anche le modifiche al database non autorizzate possono essere ottenute con pochi caratteri.
Esempio:
UPDATE users SET password = '[password]' WHERE id = [id]
Injection (into password):
',isadmin='1
Payload: 12 caratteri
Funzionerebbe anche un bypass di restrizione (il risultato è che tutte le password ora sono vuote *):
'#
Payload: 2 caratteri
* L'esempio della password è usato per semplicità; le password dovrebbero essere hash rendendo l'esempio impossibile. L'esempio si applica ancora a tutte le situazioni simili (aggiornamento di un nome utente, aggiornamento delle autorizzazioni e così via)