Imagina que tienes un castillo medieval con grandes puertas de hierro que protegen todo lo que hay dentro. Fuera del castillo colocas un par de guardias para evitar que los ladrones entren; sin embargo, algo crucial se te olvida: las puertas internas del castillo no tienen cerraduras. Cuando los ladrones ingresen, pueden simplemente pasar de largo, sin que nadie les impida alterar lo que hay dentro del castillo.
Este escenario refleja lo que ocurre con la vulnerabilidad Lack of Server-Side Validation, un defecto que permite a los atacantes burlar los mecanismos de seguridad implementados en el lado del cliente, causando estragos en el sistema. Este tipo de vulnerabilidad puede tener consecuencias devastadoras, sobre todo cuando un atacante obtiene acceso no autorizado a funciones privilegiadas de una plataforma.
¿Cómo se descubrió la vulnerabilidad Lack of Server-side Validation?
Recientemente, nuestro equipo en un pentesting detectó una vulnerabilidad crítica de “Lack of Server-Side Validation”, que ocurre cuando existen controles de seguridad solo en el frontend, pero estos no son replicados o validados adecuadamente en el backend. Este fallo deja abierta una ventana para que un atacante manipule la información del lado del cliente, lo que puede tener graves repercusiones en la seguridad y en el funcionamiento de la plataforma.
A continuación, mostraremos un caso particular de cómo ocurre esta vulnerabilidad.
Paso 1
En primera instancia accedimos a la página de inicio de sesión de la plataforma.
HTTP Request:
POST /users/login HTTP/1.1
Host: api.app-vulnerable.mx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://api.app-vulnerable.mx/
Content-Type: application/json
Content-Length: 67
Origin: https://api.app-vulnerable.mx
Connection: close
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
{"username":"[email protected]","password":"XPdT[REDACTED]j/"}
Paso 2
El servidor responde con información relevante, como el token de sesión, los permisos de acceso, y otros datos importantes. Este paso es crucial porque muestra los datos que pueden ser manipulados si no se validan adecuadamente en el backend.
HTTP Response:
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2024 21:18:22 GMT
Content-Type: application/json
Content-Length: 13570
Connection: close
Vary: Accept, origin
Allow: POST, OPTIONS
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
access-control-allow-origin: *
Strict-Transport-Security: max-age=15724800; includeSubDomains
{"code":3,"status":"Auth success","message":"¡Login exitoso!","data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[REDACTED].VVWjd1zt3k9fDu-a56QveS0S4WHPVfs","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[REDACTED]IZKSojuWX4E4BmB7DNFc","user":{"id":383,"username":"Pentest","email":"[email protected]","first_name":"Pen","last_name":"Test","second_surname":"Test","father_user":383,"mobile":"31[REDACTED]","userconfig_related":[{"variable":"onboarding","value":"1","user":383},{"variable":"maquila","value":"0","user":383},{"variable":"stamping","value":"0","user":383},{"variable":"employees","value":"100","user":383},{"variable":"license","value":"Licencia 100 empleados","user":383},{"variable":"expiration","value":"2024-06-30 00:00:00.000000+00:00","user":383}],"is_owner":true,"is_staff":false,"role":{"id":2,"name":"Admin"},"is_premium":false,"photo":null,"permission_related":[REDACTED"],"plataforma_lite":true,"apply_nps":false}}}
Paso 3
Tras iniciar sesión correctamente, se pudo identificar información detallada sobre el usuario como su tipo de licencia, fecha de vigencia, límite de usuarios permitidos, entre otros.
Para evaluar si la validación de los datos identificados se realizaba
correctamente en el backend, utilizamos la herramienta Burp Suite.
Manipulamos los valores de las claves is_staff, is_dev e is_premium de
“false” a “true” para comprobar si el servidor los validaba correctamente.
A continuación, es posible evidenciar la solicitud manipulada:
HTTP Response:
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2024 21:18:22 GMT
Content-Type: application/json
Content-Length: 13570
Connection: close
Vary: Accept, origin
Allow: POST, OPTIONS
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
access-control-allow-origin: *
Strict-Transport-Security: max-age=15724800; includeSubDomains
{"code":3,"status":"Auth success","message":"¡Login exitoso!","data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[REDACTED]pVVWjd1zt3k9fDu-a56QveS0S4WHPVfs","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[REDACTED]NOIZKSojuWX4E4BmB7DNFc","user":{"id":383,"username":"Pentest","email":"[email protected]","first_name":"Pen","last_name":"Test","second_surname":"Test","father_user":383,"mobile":"31[REDACTED]","userconfig_related":[{"variable":"onboarding","value":"1","user":383},{"variable":"maquila","value":"0","user":383},{"variable":"stamping","value":"0","user":383},{"variable":"employees","value":"100","user":383},{"variable":"license","value":"Licencia 100 empleados","user":383},{"variable":"expiration","value":"2024-06-30 00:00:00.000000+00:00","user":383}],"is_owner":true,"is_staff":true,"role":{"id":2,"name":"Admin"},"is_premium":true,"photo":null,"permission_related":[REDACTED"],"premium_lite":true,"apply_nps":false}}}
Tras realizar el inicio de sesión con los valores manipulados, podemos ver que los datos de la licencia, la fecha de vigencia y los trabajadores activos han sido alterados, lo que indica que la validación en el backend no se está aplicando correctamente.
Descubrimos que existe una sección donde es posible modificar la configuración de usuarios y gestionar las licencias asociadas a la plataforma.
En esta sección, podemos gestionar la información de todos los usuarios registrados, lo que revela un punto débil en la plataforma: un atacante podría modificar las licencias y la información de los usuarios si la validación en el servidor no se realiza correctamente.
Para confirmar la gravedad de la vulnerabilidad, realizamos una prueba en la que modificamos la cuenta de un usuario cambiando su tipo de licencia y otros detalles importantes.
Finalmente, los cambios realizados en la cuenta se aplican correctamente, lo que demuestra que la vulnerabilidad afecta directamente la integridad de los datos y permite manipular información sensible dentro de la plataforma.
Solución
La mitigación de esta vulnerabilidad se centra en la validación adecuada de todos los datos del lado del servidor. A continuación, escribimos un ejemplo básico de cómo se podría implementar esta validación utilizando Node.js para garantizar que los datos manipulados en el cliente no afecten la integridad de la plataforma:
const express = require('express');
function verifyToken(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1]; // "Bearer <token>"
if (!token) {
return res.status(403).json({ message: 'No token provided' });
}
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(401).json({ message: 'Invalid token' });
}
req.user = decoded;
next();
});
}
function isPremiumAuthorized(req, res, next) {
if (req.user.is_premium) {
return next();
} else {
return res.status(403).json({ message: 'Forbidden: Insufficient permissions' });
}
}
app.get('/premium', verifyToken, isPremiumAuthorized, (req, res) => {
res.json({ message: 'Premium access granted' });
});
});
Conclusión
La vulnerabilidad “Lack of Server-Side Validations” no es solo una brecha técnica; es una puerta abierta para que los atacantes obtengan acceso no autorizado a funcionalidades premium de una plataforma, lo que puede derivar en pérdidas económicas significativas. Afortunadamente, con las prácticas adecuadas de validación y una revisión constante de la seguridad en el backend, esta vulnerabilidad puede ser mitigada.
En Hackmetrix, entendemos la importancia de proteger tu plataforma de posibles ataques. Nuestro servicio de ethical hacking está diseñado para identificar y solucionar vulnerabilidades antes de que puedan ser explotadas. Con nuestra experiencia y las mejores herramientas, podemos ayudarte a blindar tu plataforma y proteger tu negocio de riesgos.
Escrito por: Juan David Fernández
Appsec Engineer en Hackmetrix
Otras vulnerabilidades que te gustaría conocer y prevenir: