AzkOsDev / write-ups / idor-cuentas-pqrs

volver

hallazgo de seguridad

Vulnerabilidad crítica cvss (9.3) de control de acceso que permitía tomar el control de cualquier cuenta

Con una cuenta de usuario estándar, sin contraseñas ajenas ni privilegios administrativos, fue posible cambiar el correo y la contraseña de otra cuenta, y leer las PQRS de cualquier usuario simplemente cambiando un número en la URL.

CWE
639 / 862
Clase
Broken Access Control / IDOR
CVSS v4.0
9.3 · Crítico
Contexto
Auditoría autorizada
01

Resumen

Durante una prueba de seguridad web se identificaron dos vulnerabilidades de tipo Insecure Direct Object Reference (IDOR), ambas originadas por el mismo problema de fondo: la aplicación autentica correctamente a los usuarios, pero no comprueba si tienen autorización sobre el recurso concreto que están pidiendo.

Con una cuenta creada por el proceso normal de registro —sin permisos especiales, sin contraseñas de nadie más— fue posible modificar el correo y la contraseña de otra cuenta, y leer PQRS que no pertenecían al usuario autenticado.

Ninguno de los dos hallazgos depende de errores exóticos: basta con cambiar un identificador dentro de una solicitud legítima.

02

Modificar cuentas ajenas

La funcionalidad de edición de cuenta recibe un identificador de usuario en la solicitud y no valida que corresponda al usuario autenticado. Usando dos cuentas de prueba —attacker y victim—, ambas creadas sin privilegios especiales, bastó con reemplazar la referencia al recurso propio por la del otro usuario para que el servidor procesara el cambio sin objetar nada.

Con eso quedó abierta la puerta a cambiar tanto el correo electrónico como la contraseña de la cuenta víctima, sin conocer su contraseña actual ni tener sesión activa como ella.

Usuario autenticado: attacker

Recurso solicitado: victim

Autorización: no validada

Resultado: modificación exitosa de correo y contraseña

Al afectar directamente los mecanismos de acceso a la cuenta —correo y contraseña—, el impacto potencial va desde la pérdida de acceso del propietario legítimo hasta un account takeover completo, incluyendo cuentas con privilegios más altos si comparten el mismo flujo vulnerable.

Petición GET al perfil de la víctima mostrando sus datos reales antes del ataque
fig. 1 · perfil real de la víctima consultado con el ID de su cuenta, estando autenticado con la cuenta de attacker
Petición PUT sobre el ID de la víctima cambiando el correo y el nombre de la cuenta
fig. 2 · desde la sesión de attacker, un PUT sobre el ID de la víctima cambia su correo — el servidor responde 200 OK sin validar propiedad
El mismo perfil de la víctima mostrando los datos ya modificados por el atacante
fig. 3 · Consultando un perfil diferente al propio con un ID
03

Leer PQRS ajenas

Al radicar una PQRS, la aplicación entrega un identificador secuencial y predecible (1001, 1002, 1003…). El problema no es únicamente que el identificador sea adivinable, sino que consultar cualquiera de ellos devuelve la información sin comprobar si pertenece al usuario que hace la solicitud.

Usuario autenticado: attacker

PQRS creada: 1001

PQRS solicitada: 1002 (de otro usuario)

Autorización: no validada

Resultado: información expuesta

Esto habilita la lectura de datos personales, de contacto o de negocio contenidos en PQRS de otros usuarios, además de facilitar la enumeración masiva de todos los registros existentes en el sistema.

Petición POST /radicar respondiendo con un número de radicado secuencial
fig. 4 · el endpoint /radicar devuelve un número correlativo (PQRSD-SU-2026-000017), fácil de predecir a partir de una radicación propia
Comprobante de radicación PQRSD-SU-2026-000002 con los datos completos de la solicitud
fig. 5 · comprobante completo obtenido al consultar un radicado ajeno, con la descripción de los hechos y la respuesta oficial del caso
Modal de consulta de estado mostrando la respuesta oficial de una PQRS ajena
fig. 6 · el mismo radicado consultado desde el formulario público de "estado de mi solicitud", sin ningún control de propiedad
04

Severidad (CVSS v4.0)

9.3 / 10 · Crítico

CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/AU:Y/R:A/V:D/RE:L

AV — Vector
Red (N)
AC — Complejidad
Baja (L)
AT — Requisitos
Ninguno (N)
PR — Privilegios
Ninguno (N)
UI — Interacción
Ninguna (N)
VC / VI — Confid. / Integridad
Alto (H)
VA — Disponibilidad
Ninguna (N)
AU — Automatizable
Sí (Y)
R — Recuperación
Automática (A)

La puntuación crítica responde a que el ataque se ejecuta sin autenticación privilegiada, sin interacción de la víctima y de forma remota, comprometiendo por completo la confidencialidad e integridad de las cuentas afectadas.

05

Recomendaciones

La corrección de fondo es la misma para ambos hallazgos: verificar, en cada operación sensible, que el usuario autenticado sea realmente el propietario del recurso que intenta leer o modificar —autenticación y autorización no son lo mismo—.

  • Validar autorización a nivel de objeto en cada endpoint sensible, no solo la sesión activa.
  • No confiar en identificadores enviados por el cliente para localizar recursos.
  • Exigir reautenticación para cambios de contraseña o correo.
  • Invalidar sesiones activas tras un cambio de credenciales.
  • Usar identificadores no predecibles (UUID) como defensa complementaria, no como control principal.
  • Registrar y monitorear accesos e intentos de acceso a objetos ajenos.
06

Conclusión

Autenticar a un usuario responde a "¿quién eres?". Autorizarlo responde a "¿puedes hacer esto, con este recurso?". Son preguntas distintas, y confundirlas es lo que convirtió un simple ID en la URL en la llave de cualquier cuenta del sistema.

Corregir estos dos hallazgos con controles de autorización a nivel de objeto elimina de raíz la clase de vulnerabilidad, más allá de cualquier parche puntual.

#cybersecurity #pentesting #idor #brokenaccesscontrol #cvss #bugbounty #ethicalhacking #websecurity