Lab: SQL injection attack, listing the database contents on Oracle – Portswigger [Write Up]

Este laboratorio contiene una vulnerabilidad de inyección SQL sobre el filtro de la categoría de producto.

Utilizando un ataque UNION podremos modificar la query de la petición que se envía para recuperar los datos de otras tablas para la base de datos en Oracle.

El objetivo es poder logarse en el panel de login como el usuario «administrator«.
Para ello iremos iterando en la consulta que hace la petición GET al servidor que aloja una BBDD en Oracle.
La idea es ir consiguiendo los datos de el número de columnas de la tabla, el nombre de la tabla y el nombre de las columnas hasta llegar a ver el nombre de los usuarios y sus 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 con el botón derecho sobre la petición (o Control+R).

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 adaptado a Oracle y similar al ejercicio de lab para bases de datos no Oracle:

'+UNION+SELECT+NULL+FROM+dual--

Sólo con un NULL nos devolverá un error 500 del servidor, por lo que probamos a añadir otro NULL a la consulta:

'+UNION+SELECT+NULL,NULL+FROM+dual--

y efectivamente el servidor nos devuelve un 200 por lo que en principio en la base de datos de Oracle hay dos columnas (en realidad hay tres).

Ahora ya sabiendo esto, vamos a ver qué tipo de información hay en esa tabla, para ello modificamos la query y jugamos con el valor ‘a’ para ver si admite strings o cadenas de texto:

'+UNION+SELECT+'a',NULL+FROM+dual--
'+UNION+SELECT+NULL,'a'+FROM+dual--

y en ambas posiciones de la tabla, me devuelve un 200, por lo que admite strings.

Con esta información, ahora puedo aplicar el siguiente payload específico para bases de datos en Oracle. De esta forma estaremos extrayendo el nombre de todas las tablas que se encuentren en la BBDD.

'+UNION+SELECT+table_name,NULL+FROM+all_tables--

Una vez enviada y ok 200, vamos a la respuesta del navegador y vamos a buscar el nombre de la tabla que contenga credenciales de usuarios, en mi caso por ejemplo he encontrado una tabla llamada «USERS_HEUICR» (la segunda parte de tu nombre de tabla variará).

Ahora que conocemos el nombre de la tabla, vamos a intentar sacar cuáles son los nombre de las tablas.

Hay que tener en cuenta que la lógica de los servidor en SQL es por jerarquía de lo más general (el servidor) a lo más profundo (los datos de credenciales) pasando por los nombres de las tablas y sus filas y columnas.

Por lo que en este caso ya tenemos el nombre de las tablas por lo que nos quedará saber el nombre de las filas y columnas y así poder sacar las credenciales del usuario «administrator».

Para sacar el nombre de las columnas, modificamos la query con estos valores:

'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_HEUICR'--

Misma lógica, enviamos la petición, y en este caso lo que vamos a buscar son los nombres de las columnas de esa tabla de usuarios llamada «USERS_HEUIC».

Vemos que hay tres columnas con estos nombres.

Por tanto volvemos a modificar la query con este payload:

'+UNION+SELECT+USERNAME_WUWIMI,PASSWORD_CDMQKO+FROM+USERS_HEUICR--

De esta forma estamos resolviendo esa consulta que significa que, del nombre de la tabla que hemos encontrado llamada «USERS_HEUICR» vamos a tratar de sacar toda la data que hay en ella. Para ello, necesitamos saber el nombre de las columnas de esa tabla, y como ya las extrajimos «USERNAME_WUWIMI» (para los usuarios), y «PASSWORD_CDMQKO» (para las contraseñas), ahora lanzamos la consulta y así podremos ver los usuarios y sus contraseñas para esa tabla de USERS_HEUICR.

La petición efectivamente da 200, y si la vemos en el navegador, tenemos las credenciales:

Y ya, sabiendo la contraseña del usuario «administrator», procedemos a ir al panel de login y autenticarnos:

Te dejo este vídeo explicativo para que puedas hacerlo tú paso a paso:

Otros posts relacionados