¿Cómo saber qué base de datos está detrás de una aplicación web?

14

He leído que las diferentes bases de datos (mysql, sql server, ...) tienen diferentes vulnerabilidades y que son vulnerables a algunas inyecciones de sql específicas.

Cuando el atacante intenta realizar un ataque de base de datos contra un sitio web (como la inyección de SQL), primero identifica el tipo de base de datos y luego realiza el ataque pensando en la base de datos detectada.

¿Cómo realiza esta inspección previa el atacante? ¿Usando algunas consultas especiales? ¿Existen herramientas específicas? No he encontrado ninguna información de esto.

    
pregunta user674887 10.12.2012 - 12:54
fuente

4 respuestas

12

Digamos que tienes una consulta como esta:

$q="SELECT username, joindate FROM users WHERE username LIKE '%" . $search . "%' LIMIT 20";

Ahora imagine que controla $search a través de un parámetro. Por lo general, haríamos que devuelva las contraseñas de usuario en el campo joindate de esta manera:

$search="' UNION SELECT username, password FROM users; -- -";

Como tal, la consulta se convierte en:

SELECT username, joindate FROM users WHERE username LIKE '%' UNION SELECT username, password FROM users; -- - %' LIMIT 20

La parte posterior al guión doble es un comentario, por lo que se ignora, y todas las combinaciones de nombre de usuario y contraseña se adjuntan como nuevos registros al final del conjunto de datos, después de los registros legítimos. Impresionante!

Pero ahora queremos adaptar esto para que podamos encontrar el nombre de la base de datos, para una mayor investigación de su base de datos. En MySQL, podemos usar la función DATABASE() :

$search="' UNION SELECT DATABASE(), 1; -- -";

El uso de 1 aquí es rellenar el campo joindate , que no estamos usando.

En MSSQL podemos hacer exactamente lo mismo, pero con DB_NAME() :

$search="' UNION SELECT DB_NAME(), 1; -- -";

Ambos de estos trucos agregarán una sola fila al final del conjunto de resultados, que contiene el nombre de la base de datos.

Luego podemos expandir este truco para usar VERSION() en MySQL o @@VERSION en MSSQL, que devuelve la versión actual de la base de datos. Para Oracle y PL / SQL puede verificar la existencia de la tabla v$version , simplemente haciendo una consulta en ella y buscando un error.

    
respondido por el Polynomial 10.12.2012 - 13:05
fuente
9

Además de las otras respuestas, un método que utilizo para la toma de huellas dactilares de la base de datos (especialmente cuando la inyección es ciega y no se devuelven datos) son las diferencias de sintaxis entre los motores de base de datos. Hay una buena muestra en la diapositiva 34 de esta presentación que tiendo a usar.

Un buen ejemplo es la concatenación de cadenas. MS-SQL y DB2 usan + mientras que Oracle PL / SQL y PostGRES usan ||, por lo que puede insertarlo en cadenas y observar el comportamiento de la aplicación. Si se comporta como si la cadena estuviera concatenada, es posible que sea una inyección.

    
respondido por el Rоry McCune 10.12.2012 - 13:35
fuente
4

Una de las formas más simples en que un atacante puede determinar qué base de datos está utilizando una aplicación sería hacer que la aplicación cometa un error de alguna manera con una consulta de base de datos.

Luego, si el manejo de errores no está habilitado dentro de la aplicación (que a menudo no lo está), se mostrará el error de la base de datos. Estos suelen ser bastante detallados y se puede determinar la base de datos a partir de eso.

También vale la pena considerar si conoce alguno de los siguientes idiomas, el idioma en el que está escrita la aplicación web, el marco que se está utilizando, la plataforma que se está utilizando, el proveedor de alojamiento e.t.c. todos pueden ayudar a averiguar qué base de datos se está utilizando. Por ejemplo, si están usando asp lo más probable es que estén usando MSSQL y si están usando PHP con más probabilidad MySQL. Obviamente, esto no es cierto todo el tiempo, pero si tiene que adivinar, por ejemplo, un ataque de inyección de sql ciego es otra forma de reducir las cosas.

    
respondido por el Mark Davidson 10.12.2012 - 12:58
fuente
0

Hay varios métodos para hacer esto. Sin embargo, tenga en cuenta que no necesita conocer el tipo de base de datos para realizar un ataque. Saberlo puede proporcionar vectores de ataque adicionales o alternativos, pero no es necesario para la inyección de SQL.

La mayoría de las bases de datos proporcionan funciones o tienen cuentos de diccionarios que pueden usarse para identificar el tipo y la versión de la base de datos. Estos difieren entre los proveedores, pero siempre que haya encontrado un punto de inyección de sql general, puede probar cada uno hasta obtener una respuesta válida.

También hay diferencias sintácticas entre muchos dialectos diferentes de SQL. Por ejemplo, Oracle tiene la sintaxis (+) para representar uniones externas. A menudo hay diferencias sutiles en los tipos de datos disponibles, como el tipo de texto de postgres (que Oracle no tiene) o en cómo se manejan las secuencias / columnas de incremento automático, etc.

A veces, puede saberlo simplemente obteniendo el controlador de la base de datos o los detalles del conector. Dependiendo del entorno, el idioma, etc., esto puede o no ser trivial.

    
respondido por el Tim X 14.12.2012 - 04:26
fuente

Lea otras preguntas en las etiquetas