it-swarm.dev

Non sono consentite virgolette singole, questo punto di iniezione SQL è ancora sfruttabile?

La frase SQL è simile a questa,

"SELECT * from XX where id = '" + id + "'"

La variabile id proviene direttamente dal parametro GET chiamato id.

E l'applicazione Java web non ha esplicitamente vietato la virgoletta singola. Se in quel parametro è stata trovata una virgoletta singola, il server interrompe immediatamente l'elaborazione e restituisce un errore.

Quindi, questo è ancora sfruttabile? Con ambiente postgresql e Tomcat.

8
daisy

Si consiglia di dare un'occhiata a questo documento ( collegamento macchina di ritorno ). Descrive in dettaglio alcuni metodi per bypassare tali filtri.

Ad esempio, alcuni filtri SQL sostituiscono tutte le virgolette singole con una coppia di virgolette singole. Tuttavia, fornendo loro un input contenente \' può ignorarlo.

Inoltre, c'è il contrabbando di Unicode, in cui si utilizza un carattere Unicode che Java (PHP/Ruby/Python/qualunque) capisce di essere diverso da una citazione, ma il database no.

A meno che tu non abbia una ragione davvero, davvero buona, ti consiglio di usare l'escaping integrato.

14
Manishearth

Stai parlando di "prevenire il male noto" che funziona solo fino a quando qualcuno non pensa a una nuova cosa cattiva. Come dice @Manishearth, \' è una tecnica. Per un URL, %27 è un altro. In HTML, puoi avere ', ', ', ', ' sono altri. Cosa fa il tuo server se queste tecniche sono combinate come in, %40%230039%3B (' url coded) o %5C%27 (\' url coded) o \\\\'?

Prevenire Bad noto è sempre una proposta rischiosa. Consenti il ​​bene noto è sempre meglio quando è un'opzione. Pertanto, la conversione in un tipo intero fornirà sempre più sicurezza rispetto al tentativo di prevenire stringhe specifiche. Le dichiarazioni preparate offrono un eccellente livello di protezione.

Consulta l'articolo di Wikipedia su SQL Injection Mitigation .

10
GlenPeterson

Supponendo che il parametro GET 'id' sia solo in cifre, la cosa migliore da fare è verificare se ID davvero contiene solo cifre, ad esempio convertendolo in un INT (e cogliere l'eventuale eccezione) e non alcune cose brutte come virgolette/barre/caratteri codificati/ecc.

In generale preferisco avere una variabile intera reale poiché so perfettamente che contiene solo cifre, piuttosto che una stringa con escape che potrebbe contiene alcuni strani caratteri ..

2
Jeremy