Este laboratorio contiene una vulnerabilidad de inyección SQL sobre los parámetros de categorías en el listado de productos.
Utilizando un ataque UNION+SELECT y combinándolo con otros valores de nombres de columnas y tablas, podremos ver el usuario y contraseña del «adminstrator» para hacer login.
Mediante una petición por http GET al servidor, manipulando el string con una query maliciosa en el nombre de la categoría, accedemos a ver el nombre de las tablas y columnas, así como los datos de los usuarios y contraseñas. |
Como siempre, este Lab se encuentra dentro del listado de laboratorios de la plataforma de Portswigger Web Security Academy dentro de la vulnerabilidad SQL injection como Practitioner.
Inicialmente lo que hacemos es acceder a la página del laboratorio, y antes de clicar en cualquier categoría, abrimos BurpSuite dentro de Kali, activamos «On» la petición y activamos el FoxyProxy para enviar a Burp la petición y así manipularla.
Clicamos en cualquier categoría, vamos a la petición GET en la pestaña Proxy y la enviamos al Repeater.
Desactivamos la intercepción de la petición en BS, y ya en el Repeater hacemos la inyección de SQL sustituyendo el nombre de la categoría por este código:
'+UNION+SELECT+NULL,NULL--
Incluimos dos veces el valor NULL para enumerar el número de columnas que tendrá la tabla y ver si hay dos. Y es que si le damos a «Send», el servidor nos responde con un código 200, por lo que hay al menos dos columnas.
Si alteramos la consulta con una string ‘a’ en lugar de NULL, vemos que el servidor devuelve un código 200, por lo que la primera columna de la base de datos acepta cadenas de texto.
'+UNION+SELECT+'a',NULL--
Y si hacemos la prueba ahora para la segunda posición de la columna, el resultado es el mismo, por lo que ambos string aceptan cadenas de texto.
'+UNION+SELECT+NULL,'a'--
Ahora vamos a querer extraer el nombre de las tablas para obtener el usuario y contraseña del administrador, que es el objetivo de este Lab.
Asumimos que en el database que hay en backend hay un lostado de credenciales con usuarios y contraseñas que queremos extraer.
Pero antes de ello, vamos a necesitar el nombre de la tabla que aloja esos datos teniendo en cuenta que estamos ante una BBDD No-Oracle:
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
donde:
table_name
es una columna en la tablainformation_schema.tables
que contiene los nombres de todas las tablas en la base de datos.information_schema.tables
es una tabla del sistema que contiene metadatos sobre todas las tablas de la base de datos.
Al enviar la consulta anterior (botón derecho sobre la respuesta 200 -> enviar al navegador), vemos el listado completo con el nombre de las tablas que hay en el backend:
Buscamos en este caso la que nos interesa que tiene que ver con los usuarios. Si haces un control+F en Windows y buscas por «users» te aparecerá el nombre de la tabla, en mi caso aparece «users_mehdra». En tu caso es posible que en lugar de mehdra aparezca otro nombre, da igual, lo importante es encontrar el nombre de la tabla users:
Ya sabiendo el nombre de la tabla, ahora queremos saber el nombre de las columnas, por lo que reescrituramos la query incluyendo el nombre de la tabla de usuarios anterior:
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_mehdra'--
Enviamos de nuevo la petición como el paso anterior, código 200, y la respuesta es:
donde ahora tenemos el nombre de las columnas: password y username (y email). Osea que en realidad la tabla users contiene 3 columnas.
A nosotros solo nos interesa las de usuarios y contraseñas, por lo que alteramos la query de nuevo:
'+UNION+SELECT+username_jktmfx,+password_yxzrnh+FROM+users_mehdra--
Ya tendríamos los datos de los usuarios y contraseñas:
Ahora que tenemos el usuario «administrator» y la contraseña, ya sólo nos queda hacer LOGIN en la página desde la parte de «My account».
Y ya tendríamos resuelto este laboratorio:
Te dejo este vídeo explicativo para que puedas hacerlo tú paso a paso: