Condición extraña en el punto de inyección de SQL oculto, substr () es válido para exactamente dos caracteres

4

Estoy explotando un punto de inyección de SQL oculto, que toma una variable como nombre de usuario y luego verifica si el nombre de usuario existe en una tabla.

(Se está ejecutando MySQL 5.X con PHP)

Así que estoy usando esto para recuperar todas las bases de datos:

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' #

El primer nombre de la base de datos es radius , por lo que el octavo carácter de hex('radius') es '9'. Con la entrada anterior, la página web muestra que el usuario existe.

Pero cuando proporciono el carácter '7' , también muestra que el usuario existe.

Todo lo demás no se muestra así.

Alguien sabe por qué?

P.S Podría pensar que el punto de inyección es un falso positivo, pero no lo es. Lo he confirmado con SQLmap.

    
pregunta daisy 07.02.2014 - 14:31
fuente

1 respuesta

1

Parece que hay algo extraño en la forma en que estás iterando a través de las comparaciones.

Lo que me hace levantar las cejas cuando lo veo es que estás comparando valores hexadecimales 1 byte a la vez . Esto está técnicamente bien, pero será más difícil reconstruir los nombres de las tablas después.

Por lo tanto, desglosándolo:

  1. Sabes que tienes un nombre de tabla de destino de 'radio'
  2. El valor hexadecimal ASCII de esa cadena que genera hex () es "726164697573"

La comparación de las cadenas debe hacerse de la siguiente manera:

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

Quieres comparar esos valores hexadecimales 2 bytes a la vez:

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' #

Mi conjetura es que hay un error en su código de iteración que está relacionado con la comparación de 1 byte, algún tipo de error de apagado por uno, o una combinación de ambos.

    
respondido por el Bryan Geraghty 12.08.2014 - 20:09
fuente

Lea otras preguntas en las etiquetas