Un metodo più veloce di Blind SQL Injection?

2

Blind SQL Injection è basato su test VERO / FALSO. Ecco un esempio:

is first letter A? --> NO
is first letter B? --> YES
is second letter A? --> NO
...
is last letter X? --> YES

Non è un metodo veloce. Sai qualcosa di meglio per indovinare la parola dal database più velocemente?

    
posta Mark Q. 12.06.2012 - 15:52
fonte

4 risposte

6

Il tuo approccio a questo problema è pessimo. Stai cercando di trovare lettere nella complessità temporale lineare: O(n) . Confronto di lettere, una dopo l'altra. Significa che nel modello pessimistico devi controllare l'intero alfabeto. Supponiamo che il tuo alfabeto sia composto solo da lettere minuscole: {a,z} e la tua password è zzz . Avrai 26 tentativi di trovare la prima lettera, 26 tentativi di trovare la seconda lettera e 26 tentativi di trovare l'ultima.

Come accennato sopra, puoi accelerare questo processo. Si noti che l'ordine delle lettere dell'alfabeto è sempre lo stesso (le lettere sono ordinate). Puoi utilizzare la ricerca binaria con O(log(n)) di complessità temporale. Questo metodo è usato dalla maggior parte delle persone. Tuttavia, puoi anche accelerarlo.

Se sappiamo, che la password di ricerca è la parola del dizionario, potremmo usare l'analisi linguistica per costruire i nostri tentativi di iniezione in sql cieca. Potremmo usare le nostre conoscenze sulla frequenza delle lettere nel testo (ad esempio, la lettera più frequente in inglese è "e"). Potremmo anche usare la conoscenza: qual è la probabilità che dopo la lettera X, si verifichi la lettera Y. Potremmo anche provare a indovinare quante lettere X sono nella nostra parola. In questo approccio le espressioni regolari possono aiutarci molto. Definiamo l'intervallo di caratteri a cui verranno associate le funzioni LIKE (per MSSQL ) o REGEXP (per MySQL ). Una spiegazione abbastanza buona dell'espressione regolare negli attacchi sql injection potrebbe essere trovata qui: link

    
risposta data 14.06.2012 - 14:19
fonte
5

Il metodo che stai descrivendo ha una complessità di tempo O (n). Puoi utilizzare una ricerca binaria che ha una complessità di tempo O (log (n)). Credo che sqlmap usi una ricerca binaria, ci sono un certo numero di altre implementazioni .

Alcuni database come MSSQL consentono di eseguire ricerche DNS e questo può essere utilizzato come un canale di comunicazione alternativo con il Banca dati.

Puoi anche scaricare i risultati di una query in un file usando into outfile di MySQL.

Finalmente a volte la sua iniezione non è effettivamente cieca, solo "difficile da vedere". Ciò che intendo è che non è necessario utilizzare sleep() e non è possibile estrarre i dati direttamente con union select , ma se una parte della query è falsa o vera, influisce su parte del pagina. Ho usato questa tecnica di sfruttamento in modulo per macchine semplici , dove se la domanda era vera, è stato trovato un record , se fosse falso, avrei ricevuto un messaggio di errore "Nessun messaggio trovato". Questo può essere usato insieme a una ricerca binaria per accelerare notevolmente il processo di Exfiltrating Data.

    
risposta data 12.06.2012 - 20:46
fonte
4

Puoi fare i tuoi test con sqlmap , che include diversi tipi di attacchi SQLi.

Poiché non includi informazioni sull'ambiente, non sono sicuro su quale altro modo possa aiutarti. Esegui sqlmap utilizzando un tipo di sqli e confronta i tempi di esecuzione, tenendo conto delle variabili che potrebbero gonfiare artificialmente i tempi di esecuzione.

    
risposta data 12.06.2012 - 16:45
fonte
2

Non fare maiuscole e minuscole e suddividerlo in blocchi ...

Il frammento corrente contiene A qualsiasi?

WHERE MID(field1,1,40) LIKE '%a%'

In caso affermativo:

WHERE MID(field1,1,40) LIKE 'a%'
WHERE MID(field1,1,40) LIKE '_a%'
WHERE MID(field1,1,40) LIKE '__a%'

ecc.

    
risposta data 05.10.2012 - 12:21
fonte

Leggi altre domande sui tag