Sto cercando di comprendere appieno come filtrare / sfuggire correttamente i caratteri pericolosi dall'input dell'utente che verranno interpolati in una query DB2 SQL.
Il routing di disinfezione che sto analizzando funziona in questo modo:
- Rimuovi tutti i backslash (s / \\ //)
- Sostituisci tutte le virgolette singole con virgolette singole doppie (s / '/' '/)
Il mio primo istinto è stato quello di esaminare una funzione di sanitizzazione db2 esistente, per verificare eventuali differenze. Così ho dato un'occhiata a db2_real_escape_string che, a quanto pare, è molto diversa: anteporre i backslash a caratteri speciali nell'argomento stringa. I caratteri preceduti da una barra rovesciata sono \ x00, \ n, \ r, \, ', "e \ x1a.
Alcune domande specifiche che ho sono:
- Perché db2_real_escape_string () backslash-escape cita invece di raddoppiarli? Questo sembra scorretto.
- La funzione di sanitizzazione che sto analizzando non riesce a uscire o filtrare \ x00, \ n, \ r, \ x1a, ". Come potrebbero questi personaggi essere maltrattati da un utente malintenzionato? Questa è la mia domanda principale.
- Un'altra deficienza della mia funzione di sanitizzazione è che non è sensibile al charset, ma suppongo che questo non sia un problema perché db2, in questo caso, è configurato per l'uso con il set di caratteri predefinito (che sono la supposizione non è multi-byte). Quindi AFAIK, a meno che non sia stato configurato un set di caratteri multi-byte come GBK, gli attacchi di iniezione sql multi-byte come questa vulnerabilità nota in MySQL GBK non dovrebbe essere un problema.
- Ci sono altre considerazioni / passaggi che mancano nella funzione di sanitizzazione che sto analizzando?
Capisco che l'utilizzo di query parametrizzate sia la soluzione più ovvia. Tuttavia, in questo caso, sono responsabile di A) determinare se il progetto corrente è sfruttabile e B) fornire una patch per la funzione di sanitizzazione (se necessaria).
modifica Sto fondamentalmente cercando di costruire un carico utile per l'injection di sql a prova di concetto, data la funzione di disinfezione di cui sopra e il seguente utilizzo:
execute( " SELECT foo FROM bar WHERE col='" + my_sanitize($_GET['input']) + "'" )
Data la progettazione della funzione di sanitizzazione corrente (rimuovere le barre rovesciate e le virgolette singole doppie), esiste un modo per rompere le virgolette singole come nell'esempio di utilizzo precedente?
Grazie per l'assistenza!