In parole semplici:
Le tipiche applicazioni web sono a tre livelli (browser + server web + database di back-end). Quando un utente accede a un sito Web, il suo browser riceve html e js che sono prodotti da pagine Web statiche e generati dinamicamente utilizzando il codice lato server (ad es. Php, asp). Quando si effettua l'accesso, per istanze, si invia la password e il nome utente al server Web, che elabora tali parametri e applica la logica di autenticazione pre-programmata (in php, asp). Poiché la logica richiede verifiche utilizzando un database che memorizza i dati degli utenti e consente la semplice verifica: username corrisponde alla password. Quindi, la logica lato server prende i tuoi argomenti e interroga il database (ad esempio MySQL).
SELECT * FROM Users WHERE username='your_supplied_username' AND password='your_supplied_password';
Il database lo elabora e restituisce (se il database è progettato correttamente) solo una corrispondenza (nome utente e password corrisponde) o zero (password errata) che "rappresentano te".
Che dire di SQL Injection Bro?
Non sono il tuo fratello, fratello: P. Uno sviluppatore sciatto prenderà i parametri inviati da te e li inserirà direttamente nei campi your_supplied_ *. Se l'utente non fosse malizioso, questo non sarebbe affatto un problema. Eppure, per un malintenzionato, questo apre una porta enorme per gli attacchi. Se hai familiarità con SQL, sai che E richiede che entrambe le espressioni sinistra e destra valgano per essere vere. Inoltre, in SQLi, il carattere di commento "-" è un utile amico, quindi, cosa succede se scrivo my_username '; -?
SELECT * FROM Users WHERE username='your_supplied_username';--' AND password='your_supplied_password';
Il codice lato server prenderà il mio input, lo applicheremo alla query con stringhe e lo invierò al database. Il database interpreterà "-" come un commento che escluderà:
' AND password='your_supplied_password';
pur mantenendo:
SELECT * FROM Users WHERE username='your_supplied_username'
Questa è una query valida che sarà facilmente valutata come vera. Ora, il comportamento qui varia. Se il nome utente è univoco (in genere lo è), verrà restituito un solo record. In caso contrario, verranno restituiti più record e il codice del server Web (ad es. Php) in genere selezionerà il primo. Se hai familiarità con SQL, ora puoi ottenere query creative e concatenate, utilizzare i caratteri jolly e scatenarti. Ora la domanda è:
Come sviluppatore, cosa posso fare?
Ora, questo dipende dal linguaggio lato server che si sta usando, ma le primitive di codifica sono tipicamente identiche allo stesso modo. Puoi sfuggire a sequenze speciali usando php ( link ) o utilizzare istruzioni preparate ( link ).
Come faccio a sapere se il server soffre di SQLi?
È possibile eseguire strumenti come SQLMap o SQLNinja. Puoi anche andare ai moduli e scrivere
'gibberish
dove si spera che si confonda il parser di query php e si verifichi un errore mostrato nel browser (errore dell'istruzione SQL). Esistono altre tecniche come l'iniezione di un'istruzione di sospensione nelle query per verificare se il database si blocca per alcuni secondi prima di tornare. Come meccanismo di difesa, dovresti sempre elaborare i tuoi errori SQL sul codice lato server prima di inviarli all'utente per evitare fughe di notizie.
Stai al sicuro;)