it-swarm.dev

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

Ho letto che database diversi (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 SQL injection), innanzitutto identifica il tipo di database e, successivamente, esegue l'attacco pensando al database rilevato.

Come viene eseguita questa precedente ispezione dall'attaccante? Stai usando delle domande speciali? Ci sono strumenti specifici? Non ho trovato alcuna informazione al riguardo.

14
user674887

Supponiamo che tu abbia una domanda come questa:

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

Ora immagina di controllare $search Tramite un parametro. Di solito lo faremmo restituire le password dell'utente nel campo joindate in questo modo:

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

Pertanto 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 tutte le combinazioni di nome utente e password vengono aggiunte come nuovi record alla fine del set di dati, dopo i record legittimi. Eccezionale!

Ma ora vogliamo adattare questo in modo da poter 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 è per 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 su di essa e verificando la presenza di un errore.

12
Polynomial

Oltre alle altre risposte, un metodo che uso per l'impronta digitale del database (specialmente quando l'iniezione è cieca e non vengono restituiti dati) sono le differenze di sintassi tra i motori di database. C'è un buon esempio sulla diapositiva 34 di questa presentazione che tendo a usare.

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

9
Rory McCune

Uno dei modi più semplici per un utente malintenzionato di determinare quale database viene utilizzato da un'applicazione sarebbe quello di 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 generalmente abbastanza dettagliati e da questo puoi determinare il database.

Vale anche la pena considerare se si conosce una delle seguenti lingue nella quale è scritta l'applicazione web, il framework utilizzato, la piattaforma utilizzata, il provider di hosting e.t.c. tutti possono aiutare a capire quale database viene utilizzato. Ad esempio se stanno usando asp molto probabilmente stanno usando MSSQL e se stanno usando PHP molto probabilmente MySQL. Questo non è sempre vero ovviamente, ma se dovessi indovinare per dire un l'iniezione sql cieca è un altro modo per restringere le cose.

4
Mark Davidson

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

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

Esistono anche differenze sintattiche tra molti dialetti diversi 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/colonne a incremento automatico, ecc.

A volte, puoi dirlo semplicemente ottenendo i dettagli del driver del database o del connettore. A seconda dell'ambiente, della lingua, ecc., Ciò può o meno essere banale.

0
Tim X