Ci sono molti modi per ottenere informazioni dai database tramite SQL Injection (tecniche simili possono funzionare anche per altre vie di iniezione).
In primo luogo, c'è un errore basato - si crea deliberatamente una richiesta non valida e la pagina web ti restituisce in modo utile un'istruzione SQL completa con ciò che non va. Puoi usare questo per indovinare i nomi delle tabelle e confermare se hai ragione. Questo funziona solo con siti web che non sono configurati correttamente: le pagine 500 (errore del server) non dovrebbero MAI restituire mai le informazioni di debug / stack / database. Questi dati devono essere registrati e un messaggio amichevole e non specifico deve essere fornito agli utenti finali.
In secondo luogo, si avvantaggiano delle query che visualizzano i dati. Se hai una pagina che mostra righe di dati, l'attaccante può virare su un'Unione e un'altra selezione, indovinando il numero di colonne che la query si aspetta (puoi farlo per tentativi ed errori) e le tabelle del database che fornire dati tabella / colonna. Ciò fornirà loro tutte le tabelle e le loro colonne e potranno utilizzare tali informazioni per estrarre ulteriori informazioni o danneggiare con aggiornamenti ed eliminazioni.
In terzo luogo, se non è possibile ottenere alcun dato (poiché l'unica istruzione iniettabile non restituisce alcun dato (ad esempio un aggiornamento), è possibile eseguire ciò che viene chiamato Blind SQL Injection. perdita di informazioni solo in base al suo successo e al suo fallimento - puoi indovinare i nomi delle tabelle e vedere se l'aggiornamento ha avuto esito positivo o negativo. Puoi anche indovinare i valori delle colonne e utilizzarli per filtrare i dati - c'è un utente il cui nome inizia con un? b? il secondo carattere è o? che il terzo carattere è b? Oh, c'è un utente di nome Bob. Ovviamente, questo è il miglior script, poiché le perdite di quantità di dati in questo modo richiedono MOLTE richieste, ma non tutte le volte che si potrebbe pensare. SQL Injection può anche essere fatto in base al timing piuttosto che all'errore - in pratica se una condizione è vera, inserisce un sleep e usa la differenza nel tempo di esecuzione della query per determinare se la condizione era vera o falsa.
Speriamo che questo ti aiuterà a trovare più informazioni su ciascuno di questi. Ci sono probabilmente varianti e altre tecniche che non conosco: il mio ruolo non è principalmente il test delle penne, ma piuttosto delle pratiche di sviluppo del software sicure.