¿Qué es la inyección ciega y cómo simular el problema?

0

¿Qué es la inyección ciega de SQL y en qué se diferencia de la inyección SQL normal? ¿Cómo puedo simular un problema de inyección ciega?

    
pregunta Ron 26.05.2014 - 06:36
fuente

3 respuestas

1

Como su nombre lo indica, la técnica inyecta SQL, pero mientras está "ciega": en respuesta a la solicitud, no recibirá un mensaje de error que muestre la presencia de la vulnerabilidad de inyección SQL, como:

  

Comillas sin cerrar después de la cadena de caracteres ''.

El hecho de que no pueda deducir la presencia de la vulnerabilidad no significa que no esté allí.

Un método común para probar esto es permitir que el servidor imponga un retraso en la respuesta: si el servidor responde de inmediato, no es vulnerable. Si toma más tiempo (por ejemplo, 10 segundos), es vulnerable.

OWASP tiene una gran página de en ella, y hay mucha más información disponible en SlideShare y en foro InterN0T .

    
respondido por el ndrix 26.05.2014 - 07:13
fuente
0

Una inyección SQL se llama ciega si el atacante no puede ver el resultado de la inyección, pero, por ejemplo, solo se usa internamente. En su lugar, el atacante solo puede notar que la aplicación se comporta de manera diferente en diferentes muestras de inyección.

Una técnica para explotar una inyección ciega de SQL es usar álgebra booleana donde el atacante intenta inyectar condiciones adicionales, que son ya sea siempre verdadero (tautología) o siempre falso (contradicción).

Un ejemplo de "inyección de SQL ciega basada en boolean 'es inyectar una condición que siempre es verdadera:

… OR 1=1 OR …

Si esto se inyectara en la cláusula WHERE , sería cierto para cada fila y, por lo tanto, devolvería un conjunto de resultados diferente al de inyectar lo siguiente, que siempre es falso y, por lo tanto, devuelve un conjunto de resultados vacío:

… AND 1=2 AND …

Aquí hay un ejemplo: imagina las siguientes dos sentencias de SQL. El primero es inyectable pero su resultado no es visible para el usuario, pero solo se usa en la segunda declaración:

SELECT vendor_id FROM products WHERE id = $product_id LIMIT 1
SELECT name FROM vendors WHERE id = $vendor_id LIMIT 1

Con product_id=123 AND 1=1 la aplicación puede devolver Acme y con product_id=123 AND 1=2 la aplicación puede devolver con un error que indica que no se puede encontrar el producto / proveedor. A partir de este comportamiento, el atacante puede razonar que si la condición inyectada es verdadera Acme se devuelve mientras que para una condición falsa se devuelve un error.

Ahora, si reemplaza el 1=1 / 1=2 con una prueba booleana como users.name = 'admin' AND users.password LIKE 'secre%' , puede leer datos arbitrarios de la base de datos carácter por carácter: si se devuelve Acme , la contraseña del administrador comienza con secre , de lo contrario no lo hace.

    
respondido por el Gumbo 30.05.2014 - 19:47
fuente
0

En los resultados de inyección ciega de SQL no aparecen directamente en la página web, en lugar de obtener la respuesta de la página web. Si se carga bien, eso significa que todo el contenido que aparece en la página web o le falta algo de contenido.

Inyectar manualmente el método ciego requiere mucho tiempo, pero sigue siendo interesante, solo necesitas ser bueno en SQL.

Por ejemplo:

site.com/gallery.php?id=1 and 1=1-- - will load fine
site.com/gallery.php?id=1 and (select 1)=1--  - will also load fine

Las versiones de MySQL = > 5 tienen information_schema.tables que puedes usar para:

site.com/gallery.php?id=1 and substring((select concat(1,table_name) from information_schema.tables where table_schema=database()),1,1)=1-- - 

Lo anterior también se cargará bien porque solo estamos tomando el primer carácter utilizando la función de subcadena y comparándola con 1.

La función

substring () te devuelve una parte de la cadena dependiendo del parámetro que hayas especificado.

Si se carga bien, entonces vaya a:

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1)>1-- -

Ahora necesita una tabla ASCII para verificar (puede buscarla en Google):

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1)>96-- -

Si se carga lo anterior, significa que podría ser 'a' a 'z'. Luego ve si responde a 98 pero no a 99, si es así, entonces 99 es el primer carácter del alfabeto, que es 'c'.

Ahora, para el siguiente carácter, debe cambiar la función de subcadena a:

site.com/gallery.php?id=1 and substring(ASCII((select table_name from information_schema.tables where table_schema=database() limit 0,1)),2,1)>96-- -

Esta es la lógica principal que se utiliza en la mayoría de las herramientas de prueba de penetración. Lo he confirmado manualmente utilizando MySQL y MSSQL.

Otra cosa para agregar aquí es que las herramientas seleccionan una palabra clave al verificar con and 1=1 y después de eso, verifica si esa palabra clave aparece o no en la página y toma decisiones.

    
respondido por el Rummy Khan 05.06.2014 - 22:26
fuente

Lea otras preguntas en las etiquetas