Quali metodi sono disponibili per testare le vulnerabilità di SQL injection?
Esistono diversi modi per testare un'applicazione per vulnerabilità come SQL Injection. I test si suddividono in tre diverse metodologie:
Esempio di MySQL:
http://localhost/test.php?id=sleep(30)
Se questa istruzione SQL viene interpretata dal database, saranno necessari 30 secondi per caricare la pagina.
http://localhost/test.php?id='"
Se la segnalazione degli errori è abilitata e questa richiesta è vulnerabile a sql injection, verrà generato il seguente errore:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"' at line 5
Iniezione basata su tecnologia :
http://localhost/test.php?username=' or 1=1 /*&password=1
In questo caso fornire Tautologia , o una dichiarazione che è sempre vera fornisce un risultato prevedibile. In questo caso il risultato prevedibile sarebbe l'accesso all'attaccante con il primo utente nel database, che è comunemente l'amministratore.
Esistono strumenti che automatizzano l'uso dei metodi sopra descritti per rilevare SQL Injection in un'applicazione web. Esistono strumenti gratuiti e open source come Wapiti e Skipfish che fanno questo. Sitewatch offre un servizio gratuito molto migliore di questi strumenti open source. Posso dirlo perché sono uno sviluppatore di Sitewatch.
È meglio non testare il tuo sito per l'iniezione SQL. È meglio evitare la potenziale iniezione SQL. Non creare mai query SQL eseguendo l'elaborazione delle stringhe da soli quando è presente l'input dell'utente. Utilizzare parametri associati in tutte le query (anche disinfettare tutti i dati dell'utente se possono essere utilizzati in modo dannoso e porre limiti ragionevoli alle domande). Questa è la query sql_execute("select user from user_db where id="+input_id)
non sicura (immagina se è input_id = "1 OR 1==1 --"
), ma stored_procedure = "select user from user_db where id = ? LIMIT 1;"
, sql_execute_with_param(stored_procedure, input_id);
è sicuro.
Ovviamente, questo è solo se stai cercando di rendere sicuro il tuo sito. Se stai cercando di trovare difetti in altre applicazioni è un'altra storia, e potenzialmente contro le FAQ che afferma che questo sito non è per i cappelli neri. Ma OWASP ha un ottimo articolo sui test per Iniezione SQL .
Se stai iniziando da zero suggerirei uno dei seguenti:
Tieni presente, tuttavia, che quando invii input strani e potenzialmente pericolosi a un'applicazione web, hai una probabilità significativa di danneggiare l'integrità della tua applicazione.
Puoi rompere completamente la tua app web, oppure puoi memorizzare strani input nel database dell'applicazione che poi vengono estratti e analizzati in un secondo momento - e forse anche non dalla tua applicazione.
La regola generale per questo tipo di test è semplice: non hai terminato i test fino a quando non hai ripristinato un backup noto. Non dovresti considerare la tua applicazione in condizioni operative normali dopo un test di iniezione automatizzato fino a quando non lo hai fatto.
Leggi altre domande sui tag sql-injection