Inyección simple de SQL

1

Estoy entrenando mis conocimientos de SQLInjection en una herramienta de entrenamiento hecha por mi universidad. En un determinado lvl hay un visor de producto simple que obtiene una fila basada en una identificación. Así que la consulta me debe algo como SELECT * FROM products WHERE id = ? Hay una capa de seguridad simple que filtra algunos caracteres (y combinaciones de caracteres) como OR y similares.

La siguiente entrada me da cuatro resultados en lugar de uno: 1 | 1 is not null

OBJETIVO: conseguir que los usuarios pasen

Información adicional: Hay una tabla de usuario con una columna de contraseña. El usuario buscado tiene el 'nombre' 'Piet'

¿Cómo puedo hacer que mi inyección funcione de manera que devuelva la contraseña en algún lugar?

    
pregunta Cmaster 02.06.2016 - 16:21
fuente

2 respuestas

2

¿Tal vez inyectar un union ? Necesitará saber qué columnas devuelve la consulta base. Supongamos que determina que la consulta original está regresando:

SELECT id, productName, productDescription, createdDate FROM Products where ID = 1

Puede crear una consulta UNION que coincida con la misma estructura de columna pero consulta otra tabla. Entonces si pasas lo siguiente en lugar de 1 : 1 UNION SELECT null, userName, userPassword, null FROM users

Creará la siguiente consulta:

SELECT id, productName, productDescription, createdDate 
FROM Products 
where ID = 1 
UNION 
SELECT null, userName, userPassword, null 
FROM users

Lo que básicamente agrega otra consulta que llega a la tabla de usuario y devuelve el nombre de usuario / contraseña.

Lo ideal sería que te diera la contraseña porque la contraseña sería salted / hash, pero si el ejercicio te pide que obtengas la contraseña, probablemente no lo esté. Solo tenga en cuenta que, en un escenario del mundo real, eliminará / modificará sus contraseñas para protegerse de que su base de datos se vea comprometida.

    
respondido por el Abe Miessler 02.06.2016 - 16:42
fuente
0

Depende completamente de qué caracteres se filtran realmente.

Mi primer intento sería una inyección usando:

UNION SELECT

Puede probarlo rápidamente con: id = 1 UNION ALL SELECT * FROM productos .

Si obtiene todos los productos en lugar de uno solo, funciona. Luego tienes que adivinar el número de columnas para los productos y su tipo (hay muchas formas de hacerlo, google es tu amigo).

Si productos es una tabla de 4 columnas con tipos de datos (varchar, varchar, int, int):

id=1 UNION ALL SELECT (name,password,0,0) FROM products

Te dará el nombre: combinación de contraseña.

Puede haber muchas otras formas de obtener lo que desea, enlace podría ayudarte.

    
respondido por el MadWard 02.06.2016 - 16:40
fuente

Lea otras preguntas en las etiquetas