Come sapere quale database si trova dietro un'applicazione web?

14

Ho letto che diversi database (mysql, sql server, ...) hanno diverse vulnerabilità e che sono vulnerabili ad alcune iniezioni SQL specifiche.

Quando un utente malintenzionato tenta di eseguire un attacco di database contro un sito Web (come l'iniezione SQL) identifica innanzitutto il tipo di database e, dopo aver eseguito l'attacco, pensa al database rilevato.

In che modo questa precedente ispezione viene eseguita dall'attaccante? Usando alcune domande speciali? Ci sono strumenti specifici? Non ho trovato alcuna informazione su questo.

    
posta user674887 10.12.2012 - 12:54
fonte

4 risposte

12

Supponiamo che tu abbia una query come questa:

$q="SELECT username, joindate FROM users WHERE username LIKE '%" . $search . "%' LIMIT 20";

Ora immagina di controllare $search tramite un parametro. Di solito, restituiamo le password utente nel campo joindate come questo:

$search="' UNION SELECT username, password FROM users; -- -";

Come tale la query diventa:

SELECT username, joindate FROM users WHERE username LIKE '%' UNION SELECT username, password FROM users; -- - %' LIMIT 20

La parte dopo il doppio trattino è un commento, quindi viene ignorata e otteniamo tutte le combinazioni di nome utente e password aggiunte come nuovi record alla fine del set di dati, dopo i record legittimi. Impressionante!

Ma ora vogliamo adattare questo in modo che possiamo trovare il nome del database, per ulteriori indagini sul loro database. Su MySQL, possiamo usare la funzione DATABASE() :

$search="' UNION SELECT DATABASE(), 1; -- -";

L'uso di 1 qui è di riempire il campo joindate , che non stiamo usando.

Su MSSQL possiamo fare esattamente lo stesso, ma con DB_NAME() :

$search="' UNION SELECT DB_NAME(), 1; -- -";

Entrambi questi trucchi aggiungeranno una singola riga alla fine del set di risultati, contenente il nome del database.

Possiamo quindi espandere questo trucco per usare VERSION() su MySQL o @@VERSION su MSSQL, che restituisce la versione corrente del database. Per Oracle e PL / SQL è possibile verificare l'esistenza della tabella v$version , semplicemente eseguendo una query e verificando l'errore.

    
risposta data 10.12.2012 - 13:05
fonte
9

Oltre alle altre risposte, un metodo che uso per il fingerprinting del database (specialmente dove l'iniezione è cieca e non i dati restituiti) è la differenza di sintassi tra i motori di database. C'è un buon esempio sulla diapositiva 34 di questa presentazione che tendo ad usare.

Quindi un buon esempio è la concatenazione di stringhe. MS-SQL e DB2 usano + mentre Oracle PL / SQL e PostGRES usano ||, quindi puoi inserirlo nelle stringhe e osservare il comportamento dell'applicazione. Se si comporta come se la stringa fosse concatenata, potrebbe essere un'iniezione.

    
risposta data 10.12.2012 - 13:35
fonte
4

Uno dei modi più semplici per un utente malintenzionato di determinare quale database viene utilizzato da un'applicazione potrebbe causare l'errore dell'applicazione in qualche modo con una query del database.

Quindi se la gestione degli errori non è abilitata all'interno dell'applicazione (che spesso non lo è) verrà mostrato l'errore del database. Questi sono in genere abbastanza dettagliati e puoi determinare il database da quello.

Vale anche la pena di prenderlo in considerazione se si conosce una delle seguenti lingue in cui è scritta l'applicazione web, il framework utilizzato, la piattaforma che viene utilizzata, il provider di hosting e.t.c. possono tutti aiutare a capire quale database viene utilizzato. Ad esempio, se stanno usando asp molto probabilmente useranno MSSQL e se stanno usando PHP probabilmente MySQL. Questo non è vero tutto il tempo ovviamente, ma se tu dovessi indovinare per dire un attacco di iniezione di siluro cieco, il suo altro modo di restringere le cose.

    
risposta data 10.12.2012 - 12:58
fonte
0

Ci sono diversi metodi per farlo. Tuttavia, si noti che non è necessario conoscere il tipo di database per eseguire un attacco. Sapendo che può fornire vettori di attacco aggiuntivi o alternativi, ma non è necessario per l'iniezione SQL.

La maggior parte dei database fornisce funzioni o dizionari di dizionario che possono essere utilizzati per identificare il tipo e la versione del database. Questi differiscono tra i fornitori, ma se hai trovato un punto di iniezione sql generale, puoi provare ciascuno di essi fino a ottenere una risposta valida.

Esistono inoltre differenze sintattiche tra molti diversi dialetti di SQL. Ad esempio, Oracle ha la sintassi (+) per rappresentare i join esterni. Esistono spesso sottili differenze nei tipi di dati disponibili, come il tipo di testo di Postgres (che Oracle non ha) o nel modo in cui vengono gestite le sequenze / le colonne autoincrementanti, ecc.

A volte, puoi dirlo semplicemente recuperando i dettagli del driver o del connettore del database. A seconda dell'ambiente, del linguaggio ecc., Questo può o meno essere banale.

    
risposta data 14.12.2012 - 04:26
fonte

Leggi altre domande sui tag