Blind SQLi
Last updated
Last updated
El SQLi Blind se considera un ataque a ciegas, es decir, no tenemos errores ni información por parte del servidor. Se pueden dar dos casos:
Boolean-based Blind: donde obtenemos respuestas True/False en función del resultado de la consulta SQL. Dichos cambios son visibles en la página.
Time-based blind: sin cambio para la salida de la condición True/False, basándose en el tiempo de respuesta.
En la primera prueba nos encontramos con un input que si introduces un ID de usuario válido te dice si existe o no. Con esta lógica, tenemos que crear consultas que nos devuelvan True/False para ir adivinando la información que hay en la base de datos.
Como vemos en la primera prueba, que 1=1 nos devuelve un True al existir la igualdad y pasa lo contrario cuando hacemos 1=2.
Vamos a ver los diferentes comandos para poder hacer una Blind manualmente, aunque para estos casos es recomendable usar herramientas tipo SQLMAP por el ahorro de tiempo. (No se van a poner capturas por su mala lectura de código).
Obtenemos la versión de MySQL; en este caso, la versión del servidor es 5, por lo que la segunda consulta nos devuelve True:
Para obtener las siguientes partes de la versión, tenemos que ir desplazando el SUBSTRING, aumentando el primer parámetro:
Lo siguiente que necesitamos es saber las tablas y columnas, por lo que necesitamos saber si tiene soporte para subquery:
Una vez que disponemos de subquery, vamos a averiguar el tamaño del nombre de la base de datos de la tabla que está usando el SELECT, viendo que el nombre de la base de datos es 4.
Teniendo su tamaño, queremos obtener el nombre de la base de datos. Para ello, usamos la función ASCII de MySQL para convertir el valor del SUBSTRING a número ASCII, más fácil de comparar. Empezamos en el primer carácter en minúsculas, que es el 97, y vamos subiendo el valor hasta obtener un False. El primer False es el carácter que buscamos.
Por lo que obtenemos que la primera letra es la "d". Seguimos con la siguiente letra y, como en la versión, cambiamos la posición del substring y comenzamos la búsqueda.
Ya tenemos nuestra "v". Ahora nos quedaría repetir estos pasos hasta finalizar todos los caracteres. Como en el ejemplo anterior de SQL, ahora necesitamos saber la cantidad de tablas que tiene y sus nombres, por lo que empezamos contando cuántas tablas tiene la base de datos.
Ahora que sabemos cuántas tablas tenemos, podemos obtener sus nombres. Pero antes, tenemos que saber la longitud de los nombres. Para acceder a las diferentes tablas, lo hacemos con LIMIT según el siguiente ejemplo:
Repetimos el proceso de ir contando hasta dar con el número total de caracteres:
Para obtener el nombre de la tabla, podemos usar las funciones ASCII y SUBSTRING de antes o usar LIKE, como vamos a ver a continuación:
Vamos repitiendo con las siguientes letras hasta completar las 5 que hemos obtenido en el paso anterior:
Vamos a obtener el número de columnas que tiene la tabla y después su longitud:
Ahora que sabemos cuántas columnas tiene la tabla "users", vamos a determinar la longitud de cada columna:
Tendremos que repetir este proceso para todas las columnas, aumentando el límite como ya hicimos antes.
Cuando tenemos las columnas y sus longitudes, ya podemos empezar a recorrerlas hasta obtener los nombres. Podemos hacerlo con las funciones ASCII y SUBSTRING o con LIKE:
Ahora que ya tenemos toda la estructura de la base de datos, tenemos que extraer los datos. Así que volvemos a repetir el mismo procedimiento:
dvwa
gestbook
users
user
password
Para obtener el total de usuarios disponibles, contamos el total de filas:
Recuperamos el tamaño del primer usuario:
Recuperamos el tamaño del password del primer usuario:
Para recuperar el resto de los usuarios, vamos jugando con LIMIT como hemos estado haciendo hasta ahora. Para finalizar, ya solo nos queda obtener los datos de esos dos campos.
Recuperamos el usuario:
Recuperamos el password:
En DVWA podemos resolver los tres niveles con Boolean-based Blind, pero vamos a hacer unos pequeños ejemplos de cómo hacer Time-based Blind. Para esto, tenemos que usar el tiempo y comprobar mediante un IF si el tiempo de retardo es el marcado en BENCHMARK es igual para ver si son True o False.
Obtener la versión de la base de datos:
Tamaño del nombre de la base de datos:
Tendríamos que repetir todo el proceso que hemos realizado con la otra blind, pero además de ir contando verdadero o falso, hay que esperar el tiempo que le pongamos a BENCHMARK. Por lo tanto, es un proceso muy largo y costoso, y en estos casos, es preferible usar una herramienta como SQLMAP si es posible.
Los ejercicios de nivel medio y difícil se resuelven con sqlmap exactamente igual que los anteriores o a mano realizando todo el proceso que acabamos de ver. Sin embargo, es importante tener en cuenta que el tiempo requerido para completar estos ataques de forma manual puede ser considerablemente largo. Por lo tanto, la utilización de herramientas automatizadas como SQLMAP puede ser una opción más eficiente y efectiva en estos casos.