Practica SQL Injection en DVWA En el entorno de entrenamiento que brinda DVWA nos muestra una sección dedicada al SQL Inject, con la cual demostraremos el procedimiento seguido para conseguir las contraseñas de los 5 usuarios disponibles en la base de datos.
Comúnmente se usa ese campo de texto para ingresar un numero de id (1-5) y obtener el nombre y apellido, si se ingresa un id que no está en el rango, simplemente no muestra datos ni error.
Lo primero que hicimos fue probar una de las pautas dadas en clase por el profesor para comprobar la vulnerabilidad de la página.
Según lo visto, este fragmento de sentencia sql debería hacer que los datos de la consulta sean traídos sin tener en cuenta si el id es el buscado o no debido al or y a la identidad matemática usada. Traerá los registros que tengan un id y ya. Al dar clic en el botón pasa lo siguiente:
Aun cuando la ejecutamos según lo indicado, no parece haber pasado mayor cosa. Después de estudiar y profundizar un poco mas en el entorno vemos que cuenta con tres niveles diferentes de seguridad siendo high el mayor, low el más bajo pasando por médium. Entonces lo que tenemos que hacer es configurar nuestro entorno en low para así poder aplicar las estrategias y obtener algún resultado.
Una vez hecho esto, procedemos a aplicar una vez más nuestro pedazo de código sql en la caja de texto con lo que podemos obtener el siguiente resultado (Por la razón dicha anteriormente)
Bien, ahora que sabemos que el fragmento funciona, podemos expandirlo con un “union” y agregarle una segunda sentencia sql que nos extraiga las contraseñas de la aplicación. Una primera idea fue realizar un select donde trajéramos todos los registros de la tabla “users”.
Pero nos encontramos con este error que nos dice que la sintaxis sql esta mal, y esto es debido a la comilla de la sentencia sql dentro de la vista php que espera cerrar otra comilla que juntas encierran un valor char, sin embargo nosotros no tuvimos esto en cuenta.
Se nos ocurre entonces usar esa comilla para cerrar un where con el nombre del administrador así
Pero nos encontramos con este error que nos dice que el número de columnas de cada sentencia no es el mismo y no se puede hacer el “union”.
Entonces en vez de usar el asterisco para traer todas las columnas, pasamos a traer únicamente la clave del usuario, que se nos ocurrió que su nombre más lógico para la columna seria password, y el primer nombre cuya columna ya sabemos que se llama first_name luego de echarle una mirada al código fuente de la pagina de entrenamiento.
Y ahí está! Además de traer todos los registros de la tabla (primer select, el que está en la página) también trajo la columna password y la columna first_name del usuario con nombre “admin” (con la ayuda del unión y la sentencia inyectada).
Nos damos cuenta entonces que la contrase ña de “admin” esta codificada en md5, por lo que hacemos uso de una página para encontrar cual es el valor real de esa cadena de texto, que como ya sabíamos previamente, es “password”
Luego de esto, nuestra intención era repetir este procedimiento con cada uno de los 4 registros restantes, por lo cual continuamos con el usuario “Gordon”
Obtenemos la contraseña
Y la decodificamos
Sin embargo, decidimos encontrar una sentencia de forma que al ser inyectada nos trajera todas las contraseñas de todos los usuarios entonces mejoramos la sentencia para que haga lo que queremos. Organizamos primero que muestre el nombre de usuario y
después que muestre la contraseña, y ordenamos el final de la sentencia inyectada para que no hayan problemas con la comilla de la sentencia de la página.
Y de una sola vez tenemos todas las contraseñas de todos los usuarios.
No queda más que usar la pagina ya mostrada para decodificar el resto de las contraseñas.
Completamos así nuestro ataque SQL injection y damos fin a este tutorial.
Thank you for interesting in our services. We are a non-profit group that run this website to share documents. We need your help to maintenance this website.