Come ottenere l'output di un'iniezione SQL?

9

Questo è solo per scopo di apprendimento. Voglio ottenere tutti i nomi utente e le password da una tabella in un server MySQL, dove "virgolette" sono state disattivate. Nell'input per il nome utente: inserisco qualcosa come:

username'; SELECT * FROM users;

Ma come posso ottenere l'input della mia query di iniezione? Ho fatto qualche ricerca e ho trovato sp_makewebtask nel server Microsoft SQL, che può emettere il file .html in una cartella di condivisione. Come posso farlo in MySQL? O c'è un modo migliore? Grazie mille.

    
posta Jack Owen 09.10.2013 - 22:07
fonte

4 risposte

5

Il problema con il tuo approccio è che PHP non sta per (Okay, come indicato di seguito nei commenti, è possibile, ma è improbabile) eseguire più di una query simultanea e stai chiudendo la query iniziale con un punto e virgola, quindi cercando di crearne uno nuovo all'inizio di SELECT . Dovresti UNION o UNION ALL li.

username'; SELECT * FROM users;

Dovrebbe essere simile a:

username='admin' UNION ALL SELECT CONCAT(username, 0x3A, password) AS details FROM users LIMIT 0,1;

Leggi questo link per la sintassi UNQL di MySQL link

Esistono due tipi principali di SQL Injection, sono Blind e basati su errori.

Blind è dove non si otterrà alcun output dalla query fornita, si potrebbe semplicemente notare un pezzo di testo o immagine o qualcos'altro mancante dalla pagina, e si deve enumerare attraverso varie opzioni per ottenere il risultato desiderato.

Basato sugli errori, come suggerisce il nome, dove lo script genera un errore, puoi vedere esattamente cosa devi fare. Vedrai almeno il risultato dell'iniezione da qualche parte sulla pagina o nel codice sorgente della pagina.

In tutti i casi, dovresti essere in grado di utilizzare la sintassi INTO OUTFILE di MySQL per inviare i risultati dell'interrogazione in un file, assumendo che tu abbia le autorizzazioni giuste per farlo.

link

Questo è per la maggior parte dei casi di iniezione MySQL, tuttavia, ci sono più di due tipi di SQLi, ma per gli scopi di questa conversazione, sono quelli principali che devi sapere.

Questo è un buon tutorial sulle iniezioni SQL: link

    
risposta data 09.10.2013 - 23:06
fonte
3

Beh ci sono strumenti come SQLMap che lo faranno per te, sfortunatamente non sono abbastanza intelligente per sapere esattamente come sono ottenere quei dati. Con SQLMap puoi generare una serie di cose come nomi di database, nomi di tabelle, colonne di tabelle, dati di tabelle e altro.

Posso comunque dare un esempio di come è possibile produrre dati in uno scenario molto specifico. Non parli molto del contesto del tuo attacco SQL Injection, quindi è difficile dire se questo si applicherà nella tua situazione.

Ad esempio, hai una pagina web che genera una piccola tabella come di seguito:

Product Name  | Price   
----------------------
Door knobs    | $5.00
Hammers       | $10.00
Saws          | $12.00

A seconda di come sono configurate le query e la programmazione sottostanti, può essere possibile restituire altri dati che verranno quindi visualizzati in quella tabella. Supponiamo che tu determini che il parametro della stringa di query search sia iniettabile nell'URL sottostante:

http://mysite.com/store.php?search=hardware

Se sei in grado di creare una query come quella seguente (lasciando l'attacco in testo normale a scopo dimostrativo):

http://mysite.com/store.php?search=blah';SELECT username, password FROM USERS where '1'='1

Il sito potrebbe essere programmato in modo tale da prendere solo le due colonne restituite e sputarle sul tavolo.

Ancora una volta, questo è un esempio molto specifico. Il metodo SQLMap sembra funzionare indipendentemente, quindi sarei interessato a sapere se qualcuno sa cosa sta facendo.

    
risposta data 09.10.2013 - 22:44
fonte
3

Normalmente , un valore recuperato da SQL viene visualizzato da qualche parte nella pagina. Ad esempio, se la query sta recuperando un nome ( Select name from users where id=%s ), inserisci qualcosa come 1;select top 1 columnname from (your query here);-- . A seconda del database e dell'implementazione, può esistere o meno un modo per scaricare l'intera tabella con un singolo comando (altrimenti è sempre possibile enumerare le righe della tabella).

In altri casi, si può attirare l'app per visualizzare errori SQL. In tal caso, puoi provare a utilizzare la query (che restituisce un output 1x1) come nome di colonna, ad esempio select (your query here) from somerandomtable; . Di solito, questo restituirà un errore (perché la colonna non esiste) dove verrà esposto il nome della colonna proposta.

    
risposta data 10.10.2013 - 06:45
fonte
0

Puoi farlo rilasciandolo da qualche parte: SELECT ... INTO OUTFILE per esempio. ( link )

Dopo di che, potresti sovrascrivere un campo usando load_file () che restituisce un file come una singola stringa e popola un campo conosciuto in una singola riga che viene letta e visualizzata dall'applicazione.

(es .: "UPDATE Account SET bio = load_file ('/ etc / passwd') WHERE UserName = 'prettypinkponi3s';"

Potresti anche saltare questo passaggio e utilizzare un aggiornamento direttamente nell'iniezione originale. E questo è il punto.

Se si sta iniettando il cieco, è possibile sfruttare la mancanza di convalida dell'input da del database alla lingua di rendering. E devi trovare alcuni valori che ti permetteranno di contenere i dati che stai cercando di esporre. (Foto del profilo, biografie, campi descrittivi, ecc.)

    
risposta data 10.10.2013 - 06:09
fonte

Leggi altre domande sui tag