Iniezione SQL - Automatizzazione dell'impronta digitale del DBMS

4

Ho un problema in cui spero che qualcuno possa aiutare riguardo al rilevamento delle impronte digitali del DBMS usando sql injection, in modo scripted / automatizzato per determinare in modo accurato e affidabile il DBMS.

Sono in procinto di scrivere uno strumento di iniezione sql da zero, ma sto riscontrando problemi nel trovare un modo / un numero di modi per imprimere in modo affidabile il DBMS. (Sono consapevole che ci sono già molti strumenti eccellenti, ma per questo progetto deve essere scritto da zero).

Esecuzione manuale:

L'impronta digitale del DBMS manualmente è molto più facile in quanto è più facile osservare le modifiche e il comportamento della pagina, tuttavia quando si cerca di farlo in modo automatico con uno script / programma diventa molto più difficile monitorare il comportamento di la pagina.

Automazione di questo utilizzando uno scanner / fuzzer:

Sono consapevole che un modo possibile è analizzare i messaggi di errore restituiti e vedere se contengono determinati messaggi di errore relativi a un particolare DBMS, ma nei casi in cui ciò non è possibile ho bisogno di un altro modo di fare questo.

Il problema che sto riscontrando:

Ho anche giocato con i metodi di concatenazione delle stringhe e.g ...

Questo utilizza il fatto che diversi DBMS gestiscono la concantenazione delle stringhe con operatori diversi. La concatenazione viene eseguita in diversi DBMS come:

MS SQL : 'string1' + 'string2'
MYSQL : CONCAT('string1','string2')
Oracle : 'string1' || 'string2' or CONCAT('string1','string2')

http://example/index.php?id=1+UNION+SELECT+NULL, CONCAT('sql',+'injection'),NULL,NULL  <-- MYSQL
http://www.example.com/abc.php?id=1 AND 'str1str2' ='str1'+'str2'         <-- MSSQL
http://www.example.com/abc.php?=1 AND 'str1str2'=CONCAT('str1','str2')    <-- MYSQL
http://www.example.com/abc.php?=1 AND 'str1str2'=CONCAT('str1','str2')    <-- ORACLE
http://www.example.com/abc.php?=1 AND 'str1str2'='str1'||'str2'   <-- ORACLE

Posso presumibilmente utilizzare questo metodo per vedere se la stringa viene stampata sulla pagina o se la pagina cambia o se viene generato un errore ... e così via

ma da alcuni test ho fatto un certo numero di questi metodi di concatenazione che sembrano funzionare su un numero di DBMS (es. usando il simbolo + funziona sia su MSSQL che su MySQL), che non è utile quando sono cercando di determinare in modo definitivo quale DBMS sia.

L'utilizzo di diverso dialetto SQL sembra un altro metodo possibile, vedi link , ma posso trovare pochissime informazioni su questo metodo?

Conosci il modo migliore / più affidabile per l'impronta digitale del DBMS in modo automatico / con script?

il tuo aiuto è molto apprezzato, grazie

    
posta perl-user 11.04.2013 - 12:25
fonte

2 risposte

2

Se ti piace automatizzare le impronte digitali, ti consiglio di utilizzare più di un solo indicatore, perché a volte capita di essere un po 'complicato ...

Anche io odio quegli attacchi temporali a volte abbastanza utili ... Ecco un altro suggerimento su diversi dialetti sql ...

(MSSQL) link ; waitfor delay '0: 0: 10' -

(MySQL) link ; se 1 = 1 BENCHMARK (1000000000, MD5 (1))

(Postgre) link ; seleziona pg_sleep (10);

    
risposta data 15.04.2013 - 18:22
fonte
1

Hai preso in considerazione il modo in cui SQLMap fa il suo fingerprinting? Dice che usa:

error messages, banner parsing, functions output comparison and specific features such as MySQL comment injection.

    
risposta data 11.04.2013 - 20:11
fonte