Cercando di replicare l'attacco di SQL injection

0

OK, quindi ho un sito Web ASP classico e recentemente è stato vittima di qualche iniezione SQL in cui alcune tabelle sono state aggiornate. Non è successo nulla di grave perché non conservo nulla di personale nel database. Ho studiato un po 'e riesco a trovare una risposta alla mia domanda.

Quindi ecco quello che ho trovato finora. Ho l'URL del mio sito web (non quello vero)

www.myWebSite/default.asp?pg=buy&Id=1

Posso semplicemente scrivere una query UPDATE come tale

www.myWebSite/default.asp?pg=buy&Id=1; UPDATE table SET col WHERE something here .

Questo aggiornerà il database e tale, ma questo succede se conosci già tutti i nomi delle tabelle.

Quindi non è affatto l'ideale. La mia domanda è: come ottengo tutte le informazioni della tabella? Ho cercato di ottenere gli errori da lanciare e fare tutto ciò che posso trovare online ma nulla sembra mostrare.

    
posta whisk 01.12.2016 - 15:14
fonte

2 risposte

2

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.

    
risposta data 01.12.2016 - 15:29
fonte
0
www.myWebSite/default.asp?pg=buy&Id=1 UNION ALL select table_name,'','' from all_tables; 

in base al numero di colonne restituite dalla query originale, dovrai regolare il numero di colonne che chiedi da tutte le_tables.

quanto sopra è sintassi Oracle. Per mysql sarebbe qualcosa di simile a

select table_name,'','' from information_schema.tables
    
risposta data 01.12.2016 - 15:51
fonte

Leggi altre domande sui tag