Inyección de SQL ciego: ¿Se puede ejecutar una cadena hexadecimal como parte de la consulta?

1

Lo siento de antemano si esta es una pregunta noobish, pero parece que no puedo encontrar la expresión correcta para obtener la respuesta en google o aquí. Soy bastante nuevo en SQL y estoy trabajando en un desafío de SQLi que es Una inyección ciega. La página no devuelve información a menos que ejecute una consulta con éxito o use comillas en un patrón que no he podido identificar, en cuyo caso dice "no puede hacer eso". Es silencioso si causa algún tipo de error con su entrada. Como resultado, no he podido averiguar qué es el backend, qué variante de SQL se está utilizando, cuál es el nombre de la base de datos o cuáles son los nombres de las tablas.

La sentencia que se está ejecutando debe ser algo como " SELECT * FROM table WHERE title=' ". El sitio me permitirá volcar todas las entradas de la tabla desde la que está consultando inyectando something' OR '1' = '1 . Sé que hay otra tabla en la base de datos que contiene información que necesito obtener (una marca), pero si intento algo como something' UNION SELECT * FROM users WHERE '1' = '1 , me devuelve "no se puede hacer eso". Incluso después de un montón de bromas con él, no he podido averiguar qué criterios filtra entre comillas. La declaración de UNION que probé tiene la misma cantidad de caracteres de comillas que la declaración OR '1' = '1 que HACE ejecutar, y agregar comillas superfluas que no cambian el significado de la consulta (agregar comillas aleatorias de apertura y cierre, poner una comilla simple en un comentario en medio de la consulta) a veces activa el "no se puede hacer eso" y a veces no lo hace. No he podido identificar un patrón.

Mi pregunta es la siguiente: ¿hay alguna manera de que pueda engañarlo haciéndome pensar que estoy usando el número / patrón de comillas correcto, como un patrón que ya sé que funciona, pero también incluye una declaración UNION codificada en hexadecimal? que se ejecutaría como parte de la consulta? He estado probando cosas como something' OR '1' = '1 CONVERT(varbinary(max), <hex code for ' UNION SELECT * FROM users WHERE '1' = '1>) pero no obteniendo ningún resultado. Dado que la inyección es ciega, no puedo saber si estoy haciendo algo que es un error de sintaxis (¿esa declaración CONVERTIR convierte realmente el código hexadecimal en ascii que luego se ejecutaría como parte de la consulta?) O si mi lógica está desactivada. Si alguien pudiera hacerme saber si lo que estoy haciendo tiene sentido y / o señalarme la dirección correcta, eso sería muy apreciado.

¡Gracias!

    
pregunta noodlesandnoodles 06.12.2015 - 01:05
fuente

2 respuestas

2

Para que un UNION tenga éxito, ambos SELECT s necesitan seleccionar el mismo número (y posiblemente los tipos de datos compatibles) de las columnas.

Entonces, su primera tarea sería identificar el número de columnas en su inicial SELECT . Puede hacer esto con la cláusula ORDER BY especificando la posición numérica de la columna que se ordenará por:

' ORDER BY 1,'

Esto terminaría la consulta de la siguiente manera:

SELECT * FROM table WHERE title='' ORDER BY 1,''

Una posición de columna no existente daría como resultado un error. Entonces solo incremente el número hasta que obtenga un error (o respuesta falsa).

Luego, puedes construir tu segundo SELECT con ese número exacto de columnas y UNION con el primero. Dependiendo de los tipos de DBMS y de columna, es posible que deba jugar un poco con los tipos de columna del segundo SELECT para encontrar tipos compatibles.

    
respondido por el Gumbo 06.12.2015 - 08:47
fuente
0

La razón por la cual la aplicación es vulnerable es simple. Supongamos que la aplicación vulnerable se ve así:

  

SELECCIONE * DE los elementos WHERE itemid = ' $ id '

Cuando se ejecuta esta consulta, la vulnerabilidad le permite modificarla para que se vea así:

  

SELECCIONA * DE LOS ítems DONDE itemid = ' algo' O '1' = '1 '

Esperamos que pueda ver cómo ha cambiado la consulta SQL para devolver todas las entradas de la tabla de elementos.

Para aprovechar esto y ejecutar una consulta completamente nueva, deberías hacer algo como esto:

  

SELECCIONE * DE los elementos WHERE itemid = ''; SELECCIONAR * DESDE usuarios DONDE '1' =   '1 '

¿Esto te señala al menos en la dirección correcta?

    
respondido por el Jonathan Gray 06.12.2015 - 01:48
fuente

Lea otras preguntas en las etiquetas