Condizioni strane in cieco punto di iniezione SQL, substr () è valido per esattamente due caratteri

4

Sto sfruttando un punto di iniezione SQL cieco, che accetta una variabile come nome utente, quindi controlla se il nome utente esiste in una tabella.

(È in esecuzione MySQL 5.X con PHP)

Quindi sto usando questo per recuperare tutti i database:

valid_user_name' and (
    SELECT substr(hex(schema_name), 8, 1) 
    FROM information_schema.schemata 
    WHERE schema_name not in ('performance_schema','mysql','information_schema')    
    ORDER BY schema_name limit 0, 1) = '9' #

Il primo nome del database è radius , quindi l'8 ° carattere di hex('radius') è '9'. Con l'input sopra la pagina web mostra l'utente esiste.

Ma quando fornisco il carattere '7' mostra anche che l'utente esiste.

Tutto il resto non viene mostrato così.

Qualcuno sa perché?

P.S Potresti pensare che il punto di iniezione sia un falso positivo, ma non lo è. L'ho confermato con SQLmap.

    
posta daisy 07.02.2014 - 14:31
fonte

1 risposta

1

Sembra che ci sia qualcosa di strano nel modo in cui stai iterando attraverso i confronti.

La cosa che mi fa alzare le sopracciglia quando guardo questo è che stai confrontando i valori esadecimali 1 byte alla volta . Questo è tecnicamente corretto, ma sarà più difficile ricostruire i nomi delle tabelle in seguito.

Quindi, scomposizione:

  1. Sai che hai un nome tabella di destinazione di "raggio"
  2. Il valore esadecimale ASCII di quella stringa generata da hex () è "726164697573"

Il confronto delle stringhe dovrebbe essere fatto in questo modo:

r  a  d  i  u  s
72 61 64 69 75 73

Vuoi confrontare quei valori esadecimali 2 byte alla volta:

valid_user_name' and (
    SELECT substr(hex(schema_name), 7, 2) 
    FROM information_schema.schemata 
    WHERE schema_name not in ('performance_schema','mysql','information_schema')    
    ORDER BY schema_name limit 0, 1) = '69' #

La mia ipotesi è che ci sia un errore nel codice di iterazione che è correlato al confronto a 1 byte, a una sorta di errore "uno per uno" o una combinazione di entrambi.

    
risposta data 12.08.2014 - 20:09
fonte

Leggi altre domande sui tag