2011-01-05 11 views
31

Recentemente il mio sito è stato violato tramite SQL injection. L'hacker ha utilizzato la seguente query per ottenere il mio nome DB. Non riesco a capire questa domanda che hanno scritto.Il sito è stato violato tramite SQL Injection

Query:

=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-- 

Dopo che la query è stata corse ha mostrato un risultato intero, qualcosa come "74545883".

Puoi spiegare come funziona la query?

+7

prego non firmare le vostre domande, sappiamo chi sei – sethvargo

+1

è che l'unica voce che hai nel tuo registro? –

+6

prego non firmare le vostre domande - per un attimo, mi chiedevo che cosa significa firmare una query mysql dire :) –

risposta

0

Prima di tutto, la query sembra codificata in HTML. Sostituisci i %20 con spazi e diventerà un po 'più leggibile. Inoltre stanno convertendo parte della query in una rappresentazione esadecimale di qualcosa. Prova anche la decodifica esadecimale di quella parte dell'istruzione.

Un rischio di iniezione SQL viene creato quando si tenta di creare un SQL dinamicamente come stringa e quindi inviarlo al DBMS. Immaginate una stringa come questa memorizzato nel sistema per l'uso in una barra di ricerca, ecc:

SELECT * FROM SOME_TABLE WHERE SOME_COLUMN=

per completare la query e lasciare che l'attacco in, avrebbero bisogno di fare il loro ingresso in questo modo:

'x' or 1=1

In quel caso la query diventerà:

SELECT * FROM SOME_TABLE WHERE SOME_COLUMN='x' or 1=1

SOME_COLUMN potrebbe essere una qualsiasi variabile, non importa dove fallisce, la cosa che conta è che 1=1 è SEMPRE vero, quindi potenzialmente l'attaccante può accedere a ogni riga in quella tabella.

Ora che lo sapete, passate attraverso il vostro codice e sostituite ogni query creata dinamicamente con una dichiarazione preparata. Il sito OWASP ha un sacco di risorse per la codifica difensiva così:

www.owasp.org

3

La query restituito il nome del database utilizzando DATABASE(), poi convertito a un valore esadecimale utilizzando la funzione HEx().

Una volta che avevano questo potrebbero usare UNHEX funzione

Date un'occhiata ai UNHEX esempi

mysql> SELECT UNHEX('4D7953514C'); 
     -> 'MySQL' 
mysql> SELECT 0x4D7953514C; 
     -> 'MySQL' 
mysql> SELECT UNHEX(HEX('string')); 
     -> 'string' 
mysql> SELECT HEX(UNHEX('1267')); 
     -> '1267' 

E 'bene sapere come sono arrivati ​​in, ma, tutto sommato, è necessario risolvere il problema il codice per evitare SQL Injection.

+0

@astander - ha chiesto come la query ha funzionato. l'ho interpretato come "come hanno bypassato la mia (mancanza di) prevenzione", non "cosa fa ognuna di queste funzioni qui dentro". Sento che una persona dovrebbe essere in grado di eseguire una query su Google per "mysql HEX", ma un novizio non può essere in sintonia con la fuga query e comuni mysql tentativi di iniezione, sì? – sethvargo

+2

Se si riesce a Google che, si può google SQL Injection ... –

+0

googling "mysql HEX" gli dirà che cosa fa la funzione (come hai collegato), ma googling "iniezione mysql" non è intenzione di dirgli il motivo HIS query particolare è stato violato ... – sethvargo

19

Sembra un overflow attack. Sono UNION -ed con la query esistente.sostituzione di tutta la vostra %20 con (spazio) in quanto i suoi frutti con codifica URL:

=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536- 

rottura verso il basso:

  1. il =-999.9 è solo finendo la query corrente
  2. 0x31303235343830303536 è NULL - sono solo corrispondente al numero di colonne nella tua query esistente. Se disponevi di e users con 4 colonne, lo UNION deve disporre di 4 colonne. Di conseguenza, hanno appena usato i valori NULL per popolare quelle colonne.
  3. la vera confusione è nello CONCAT(). Essi stanno combinando 126, 39, il nome del database come valore esadecimale, 39, e 126
  4. -- è un commento mysql - ignora il resto della tua query dopo

A giudicare da questo attacco, ho il sospetto che si è non wrapping input in mysql_real_escape_string(), che ha permesso di attaccare per saltare fuori dalla tua query ed eseguire il proprio.

Vedere owasp.org per ulteriori informazioni.

+1

unhex (0x31303235343830303536) ha dato '% H V'. Forse un biglietto da visita? È un numero enorme - tra 2^78 e 2^79. –

+0

potrebbe essere mysqls max_int - un tentativo di overflow? – sethvargo

+2

grazie per il downvote senza commenti – sethvargo

5

Questa non è la query completa, in realtà la persona ha inserito questa stringa nella tua app Web.

Ora, prima sostituire% 20 con uno spazio vuoto nella parte dell'unione, si ottiene:

SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-- 

Sembra come l'utente ha messo la stringa in un luogo in cui ti aspettavi un numero. Quindi, vedi che prima c'è un numero (999.9) per completare la condizione originale della query. Quindi, viene aggiunta una parte UNION. Infine, dopo la parte UNION, i caratteri del commento vengono aggiunti (-) in modo tale che il resto della query (che potrebbe essere aggiunta dal sistema) venga aggirato.

Siamo in grado di formattare il codice per una migliore comprensione:

SELECT 
    concat 
    (
     0x7e, 
     0x27, 
     Hex(cast(database() as char)), 
     0x27, 
     0x7e 
    ), 
    0x31303235343830303536, 
    0x31303235343830303536, 
    0x31303235343830303536 

Ora, sottostringa della prima colonna del risultato conterrà la forma esadecimale codificata del tuo nome datbase. In realtà, dovrebbe essere circondato da virgolette singole (0x27), poi di nuovo circondati da ~ (0x7e)

1
-999.9 UNION ALL SELECT 
CONCAT('Hex(cast(database() as char))'), 
0x31303235343830303536, 
0x31303235343830303536, 
0x31303235343830303536 

Penso che è necessario disporre di altre voci presenti nel registro, se non sapeva di prima mano che si dispone di 3 colonne .

1

Questo è un esempio di iniezione utilizzando Havij Il 0x7e e 0x27 conforme a ~ e 'goduto sarà utilizzata per inquadrare la visualizzazione HTML come id = 999999,9 + unione + all + selezionare + 0x31303235343830303536, (seleziona + concat (0x7e, 0x27, unhex (Hex (cast (sample_tbl.name + as + char))), 0x27,0x7e) + da + test.sample_tbl + Order + by + id + limit + 0,1) + - Questa query renderà ~ 'Alfred' ~ che è il valore del campo del nome della colonna, dalla tabella sample_tbl nella tabella test

~ 'r3dm0v3_hvj_injection' ~ è il codice firma Havij unhex 0x7233646D3076335F68766A5F696E6A656374696F6E in base alle http://www.string-functions.com/hex-string.aspx

+0

Hanno provato la stessa iniezione MySQL sul mio Web, ma hanno provato a pagina senza query di database, tutto si basa sui file :-) – qub1n

-1

Sì ha ottenuto la forma esadecimale del nome del database, che si dice è '74.545.883'. Facendo clic su Unhexing avrebbe ottenuto il nome reale del database.

Problemi correlati