Cos'è l'iniezione cieca e come simulare il problema?

0

Cos'è un'iniezione SQL cieca e in che cosa differisce dalla normale iniezione SQL? Come posso simulare un problema di iniezione cieca?

    
posta Ron 26.05.2014 - 06:36
fonte

3 risposte

1

Come suggerisce il nome, la tecnica inietta SQL, ma pur essendo "cieco": in risposta alla richiesta, non riceverai un messaggio di errore che mostra la presenza della vulnerabilità di SQL injection, come ad esempio:

Unclosed quotation mark after the character string ' '.

Il fatto che non sia possibile detrarre la presenza della vulnerabilità non significa che non ci sia.

Un metodo comune per testare questo è lasciare che il server imponga un ritardo nella risposta: se il server risponde immediatamente, non è vulnerabile. Se richiede più tempo (ad esempio, 10 secondi), è vulnerabile.

OWASP ha una grande pagina su di esso, e (molte) ulteriori informazioni sono disponibili su SlideShare e su forum InterN0T .

    
risposta data 26.05.2014 - 07:13
fonte
0

Un'iniezione SQL viene definita cieca se il risultato dell'iniezione non è visibile all'attaccante, ma, ad esempio, viene utilizzato solo internamente. Invece, l'attaccante può solo notare che l'applicazione si comporta diversamente su diversi campioni di iniezione.

Una tecnica per sfruttare un'iniezione SQL cieca utilizza algebra booleana dove l'autore dell'attacco tenta di iniettare condizioni aggiuntive, che sono o sempre vero (tautologia) o sempre falso (contraddizione).

Un esempio di ' l'iniezione SQL cieca basata su booleani ' sta iniettando una condizione che è sempre vera:

… OR 1=1 OR …

Se questo sarebbe stato iniettato nella clausola WHERE , sarebbe vero per ogni riga e quindi restituire un set di risultati diverso rispetto all'iniezione del seguente, che è sempre falso e quindi restituisce un set di risultati vuoto:

… AND 1=2 AND …

Ecco un esempio: immagina le seguenti due istruzioni SQL. Il primo è iniettabile ma il suo risultato non è visibile all'utente ma utilizzato solo nella seconda istruzione:

SELECT vendor_id FROM products WHERE id = $product_id LIMIT 1
SELECT name FROM vendors WHERE id = $vendor_id LIMIT 1

Con product_id=123 AND 1=1 l'applicazione può restituire Acme e con product_id=123 AND 1=2 l'applicazione può tornare con un errore che indica che il prodotto / venditore non può essere trovato. Da questo comportamento l'attaccante può pensare che se la condizione iniettata è vera Acme viene restituita mentre per una condizione falsa viene restituito un errore.

Ora, se sostituisce 1=1 / 1=2 con un test booleano come users.name = 'admin' AND users.password LIKE 'secre%' , è in grado di leggere dati arbitrari dal database carattere per carattere: Se viene restituito Acme , la password dell'amministratore inizia con secre , altrimenti non lo è.

    
risposta data 30.05.2014 - 19:47
fonte
0

In ciechi risultati di iniezione SQL non vengono visualizzati direttamente nella pagina Web, ma si ottiene la risposta della pagina Web. Se carica bene, significa che tutto il contenuto viene visualizzato sulla pagina Web o manca del contenuto.

L'iniezione manuale di blind richiede tempo ma è comunque interessante, devi solo essere bravo in SQL.

Ad esempio:

site.com/gallery.php?id=1 and 1=1-- - will load fine
site.com/gallery.php?id=1 and (select 1)=1--  - will also load fine

Le versioni di MySQL = > 5 hanno informazioni_schema.tables che puoi usare per:

site.com/gallery.php?id=1 and substring((select concat(1,table_name) from information_schema.tables where table_schema=database()),1,1)=1-- - 

Quanto sopra verrà caricato bene perché stiamo prendendo il primo carattere solo usando la funzione substring e confrontandolo con 1.

La funzione

substring () restituisce una parte della stringa in base al parametro specificato.

Se carica bene, allora vai per:

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1)>1-- -

Ora hai bisogno di una tabella ascii da controllare (puoi farlo su Google):

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1)>96-- -

Se il carico sopra, significa che potrebbe essere 'un' a 'z'. Poi vedi se risponde a 98 ma non a 99, se è così, allora 99 è il primo carattere dell'alfabeto, che è 'c'.

Ora per il carattere successivo è necessario modificare la funzione di sottostringa in:

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),2,1)>96-- -

Questa è la logica principale che viene utilizzata nella maggior parte degli strumenti di test di penetrazione. L'ho confermato manualmente usando MySQL e MSSQL.

Un'altra cosa da aggiungere qui è che gli strumenti selezionano una parola chiave quando si verifica con and 1=1 e successivamente, verifica se quella parola chiave appare o meno sulla pagina e prende decisioni.

    
risposta data 05.06.2014 - 22:26
fonte

Leggi altre domande sui tag