Come si impedisce questo tipo di attacco SQL injection?

16

La nostra azienda utilizza diversi strumenti (Veracode, Appscan, ecc.) per verificare che le nostre applicazioni soddisfino i requisiti minimi di sicurezza. Ho ereditato un'applicazione legacy che ha diversi difetti. Sono riuscito a mitigare la maggior parte delle vulnerabilità, ma sto avendo problemi a risolvere il prossimo perché semplicemente non so cosa stia facendo. Nel nostro rapporto, sembra che stia cambiando una delle nostre variabili POST in

25%27+having+1%3D1--+

Che cos'è questo e cosa sta facendo in modo efficace? Cosa posso fare per prevenire questo tipo di attacco?

    
posta Jeff 11.12.2012 - 17:40
fonte

3 risposte

26

Quando questa stringa viene decodificata dal suo modulo con codifica url diventa la seguente:

25' having 1=1--

Questa stringa, se inserita come è, ad esempio, nella seguente funzione di query del database (PHP):

mysql_query("SELECT * FROM users WHERE username = '$username'");

Diventa questo:

mysql_query("SELECT * FROM users WHERE username = '25' having 1=1--'");

Da notare che il% 27 (') esce dall'argomento nella clausola WHERE e continua la parte eseguibile dell'istruzione. Il - dopo 1 = 1 rende il resto dell'istruzione un commento che non viene eseguito.

Si suppone che l'istruzione HAVING in SQL venga utilizzata all'interno di query che utilizzano l'operatore GROUP BY e non dovrebbe riuscire nelle query che non lo fanno. La mia ipotesi è che questa stringa viene utilizzata per verificare semplicemente la presenza di una variabile non salvata che viene inserita in una query eseguita.

Per prevenire questo tipo di attacco, suggerirei di utilizzare una buona funzione di risanamento dell'input o query parametrizzate. L'implementazione di questo dipende dall'ambiente di programmazione in questione.

Addizione : l'uso normale di 1 = 1 nelle query di SQL injection consiste nel restituire tutte le righe, annullando qualsiasi altra condizione WHERE. Un esempio di input potrebbe essere:

a' OR 1=1 --

Quando inserito come parametro $ password in una query come:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

L'affermazione diventa:

SELECT * FROM users WHERE username = 'mark' AND password = 'a' OR 1=1 --

Il set di dati risultante includerà tutte le voci nella tabella "utenti", poiché 1 = 1 è sempre true.

    
risposta data 11.12.2012 - 18:08
fonte
6

quello che vedi è un vettore di attacco SQL Injection abbastanza standard. Il codice che sta aggiungendo può modificare le istruzioni SQL se l'input non è gestito correttamente dall'applicazione (ma suppongo che l'hai risolto dal titolo). C'è una buona descrizione del problema che menziona questo vettore in questo documento di NGS / NCC.

Per mitigare il problema è necessario assicurarsi che l'input per l'applicazione sia adeguatamente convalidato o scappato in modo che non possa modificare le query SQL sottostanti nel database.

Un buon punto per iniziare con questo sarebbe il Foglio elettronico dell'iniezione di OWASP SQL

    
risposta data 11.12.2012 - 18:08
fonte
1

L'alternativa a una query con parametri è di sfuggire all'input. Il modo in cui esegui questo correttamente dipenderà dalla tua piattaforma e dal tuo database. Ad esempio, su PHP e con il database mysql usa mysql_real_escape_string (). Inoltre, se lo fai devi sempre usare le virgolette singole nell'SQL, anche per i numeri.

Potresti pensare di poter sostituire le virgolette singole in una stringa per renderlo sicuro, ma ciò non è sufficiente. Le virgolette singole possono essere rappresentate in altri modi. Maggiori dettagli qui: exploit di caratteri multibyte - PHP / MySQL

    
risposta data 11.12.2012 - 23:14
fonte

Leggi altre domande sui tag