JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Vulnerabilidades de control de acceso y escalada de privilegios
  • ¿Qué es el control de acceso?
  • Modelos de seguridad de control de acceso
  • Tipos de modelos de seguridad de control →
  • Controles de acceso verticales
  • Controles de acceso horizontales
  • Ejemplos de controles de acceso rotos
  • Security By Obscurity → Seguridad Por Oscuridad
  • Control de acceso roto como resultado de una mala configuración de la plataforma →
  • ¿Cuales son los marcos para solucionarlos actualizandolos?
  • Algunos controles de seguridad para el acceso pueden ser eludidos:
  • Control de acceso roto como resultado de discrepancias en la coincidencia de URL →
  • Escalada de privilegios Horizontal →
  • Vulnerabilidad IDOR (Insecure Direct Object Referente):(Vulnerabilidad de Referencia Directa a Objetos)
  • Casos comunes de IDOR
  • Ejemplo con código PHP estándar
  • Solución →
  • Escalada de privilegios horizontal a vertical
  • Referencias inseguras a objetos directos (IDOR)
  • Ejemplos de IDOR
  • Vulnerabilidad IDOR con referencia directa a archivos estáticos
  • Vulnerabilidades de control de acceso en procesos de varios pasos →
  • Control de Acceso basado en Referentes →
  • Cómo prevenir vulnerabilidades en el control de acceso
  1. PortSwigger WebAcademy
  2. Server Side Topics

Acess Control

PreviousLaboratorio: SSRF básico contra el servidor localNextLaboratorio: funcionalidad de administración desprotegida

Last updated 7 months ago

Vulnerabilidades de control de acceso y escalada de privilegios

En esta sección, describimos:

  • Escalada de privilegios.

  • Los tipos de vulnerabilidades que pueden surgir con el control de acceso.

  • Cómo prevenir vulnerabilidades en el control de acceso.


¿Qué es el control de acceso?

El control de acceso es o son las restricciones que se tiene sobre a que cosas o quien puede acceder a ciertos elementos o interfaces, el control de acceso controla ello, el control de acceso depende de la autenticación y la gestión de sesiones:

  • La autenticación: Confirma que el usuario es quien dice ser.

  • La gestión de sesiones: identifica que solicitudes HTTP posteriores hace ese usuario.

  • El control de acceso: Determina si el usuario puede realizar o no tales acciones, tales como solicitudes HTTP especificas.

Los controles de acceso rotos son comunes y a menudo presentan una vulnerabilidad de seguridad crítica. El diseño y la gestión de controles de acceso es un problema complejo y dinámico que aplica restricciones comerciales, organizativas y legales a una implementación técnica. Las decisiones de diseño del control de acceso deben ser tomadas por humanos, por lo que el potencial de errores es alto.

Modelos de seguridad de control de acceso

¿Qué son los modelos de seguridad de control de acceso?

Los modelos de seguridad de control de acceso son independientes de la tecnología de una aplicación web y se implementan en los servidores, sistemas operativos, redes, sistemas de gestión de Bases de Datos. y son un conjunto de reglas definidas de control de acceso para los diferentes entornos de una aplicación web.

Tipos de modelos de seguridad de control →

  1. Control de acceso programático: Este tipo de control de acceso se basa en una matriz de privilegios a la cual se accede mediante programación, y dentro de ella se almacenan todo tipo de grupos, usuarios, registro y el flujo como tal, ahora bien, esto con el fin de que se controla el acceso especifico para cada persona o grupo dentro de la aplicación, lo que este tipo de modelo de seguridad conlleva es que es muy granular.

  1. Control de acceso discrecional (DAC): Con control de acceso discrecional los accesos están a recursos o funciones están restringidos según el tipo de usuario, o grupos con permisos elevados, cada lider de grupo o que tenga permiso a una funciones o recurso especifico puede otorgar acceso a otro usuario, este tipo de control de acceso resulta ser muy granular en complejidad por ende es un poco complejo de implementar en diseño y gestión.

  1. Control de acceso obligatorio (MAC): Este sistema de control está controlado centralmente y tiene restringido el control a todo tipo de usuario o grupos los cuales a diferencia del sistema DAC que podía dar permisos de acceso a sus recursos o delegarlos en este caso ningún usuario puede delegar permisos ni modificar reglas de acceso, en este caso todos están restringidos al acceso y todo es mediante autorizaciones centrales, tipo a lo militar mamaguevo.

  2. Control de acceso basado en roles (RBAC): Este modelo de control de acceso está basado especificamente en la creación de diferentes roles con permisos especificos y se otorgan los roles a cada tipo de usuario dependiendo de que proposito tienen X usuario dentro de la aplicación, También cabe mencionar que a algunos usuarios se les definen multiples roles dependiendo de las funcionalidades que tengan que ejercer dentro de la aplicación, Este tipo de control y rol otorgado a un usuario o grupo puede ser removido en caso tal de que ya no sean parte más de la aplicación o funcionalidad especifica, esto hace que el modelo sea simplemente eficaz, simple y facil de implementar, sin embargo se debe mantener el nivel para los casos en los que se creen muchos roles no sería muy efectivo, debe ser regulado y equilibrado.


Controles de acceso verticales

Son los controles de acceso que restringen el acceso valga la redundancia a todo tipo de funciones confidenciales para ciertos tipos de usuarios especificos.

Ahora bien con los controles de acceso vertical se le puede dar a un usuario diferentes funcionalidades dependiendo de la jerarquía de permisos que tenga por ejm: Un Admin puede tener varías funcionalidades como eliminar o modificar a otro usuario, sin embargo un user no podría hacer eso.

Por eso para un user normal se restringe el acceso a las funciones confidenciales de eliminar o modificar un user, sin embargo un Admin si puede modificar o eliminar, esto porque el acceso vertical se aplica diferente dependiendo del tipo de usuario.

Controles de acceso horizontales

Los controles de acceso horizontales son mecanismos que restringen el acceso a recursos a usuarios especificos.

Con controles de acceso horizontal, diferentes usuarios tiene acceso a un subconjunto de funcionalidades o recursos del mismo tipo, Por ejm: una aplicación bancaria permitirá ver las transacciones y realizar pagos desde sus propias cuentas, eso si un usuario no podría hacer esto para la cuenta de otros usuarios solo para la propia, en este caso se aplica la restricción a recursos para cada usuario especifico y a su vez se mantiene el acceso del mismo tipo para muchos usuarios con las mismas caracteristicas.

Ejemplos de controles de acceso rotos

Las vulnerabilidades de control de acceso roto existen cuando un usuario puede acceder a recursos o realizar acciones que se supone que no debería poder realizar.

Escalada de privilegios verticales

Si un usuario puede acceder a recursos o funcionalidades a las cuales no tiene permiso, en ese caso estariamos hablando de una escalada de privilegios vertical, por ejm: un usuario común y corriente que obtiene acceso a la interfaz de administrador y puede eliminar cuentas de usuario, entonces se trata de una escalada de privilegios vertical.

¿Cuales son las funciones confidenciales?

  • Son esas funciones las cuales se deben restringir y esconder de los usuarios normales, ya que son privadas y contienen caracteristicas mucho más avanzadas y de más acceso a la aplicación, un usuario normal no debe saber porque se puede prestar para malos actos o cosas malas, por ello es mejor prevenir que lamentar.

¿Cuales son algunos ejemplos?

  1. Por ejm una interfaz de admin/ en la misma aplicación para poder modificar/eliminar usuarios de la misma aplicación, esto se consideraría una funcionalidad confidencial la cual debe ser restringida para ciertos tipos de usuarios especificos, y solo los usuarios con permisos pueden acceder a ella.

Funcionalidad desprotegida

  • En su forma más basica una funcionalidad desprotegida para una escalada de privilegios vertical ocurre cuando una aplicación no protege adecuadamente las funcionalidades confidenciales que tiene o no aplica las protecciones adecuadas.

    • Por ejm: la interfaz de administrador se supone debería estar accesible desde la pagina de bienvenida de administrador, sin embargo muchas veces está accesible es desde la pagina de bienvenida de User normal, lo cual no está bien, se supone debería estar separada la interfaz admin/ de usernormal.

Por ejemplo, un sitio web puede alojar funciones confidenciales en la siguiente URL:

<https://insecure-website.com/admin>

Cualquier usuario puede acceder a esto, no solo los usuarios administrativos que tienen un enlace a la funcionalidad en su interfaz de usuario. En algunos casos, la URL administrativa puede revelarse en otras ubicaciones, como el robots.txtarchivo:

<https://insecure-website.com/robots.txt>

Incluso si la URL no se divulga en ninguna parte, un atacante puede usar una lista de palabras para forzar la ubicación de la funcionalidad confidencial y a esto se llama FUZZING.

Controles de acceso dependientes del contexto →

Los controles de acceso dependientes del contexto restringen el acceso a los recursos o funcionalidades al usuario según el estado de la aplicación o la interación del usuario con la misma, en este caso si un usuario hace algo que no debía hacer su acceso queda restringido.

Los controles de acceso dependientes del contexto restringen e impiden que un usuario realice acciones en el orden incorrecto, EJM: un usuario desde una pagina minorista de compras facilmente la aplicación puede restringir a un usuario que intenta realizar una accion en el orden incorrecto como puede intentar modificar los productos del carrito de compras cuando ya compró y pagó los productos del carrito de compras.

Security By Obscurity → Seguridad Por Oscuridad

Este es un concepto en el hacking el cual trata de volver las cosas de forma mucho más impredecible añadiendo elementos impredecibles u “oscuros” dificiles de acertar o adivinar por un hacker o atacante, por ejm para el caso de lo que estamos viendo:

  • Una pagina que intenta ocultar las funciones confidenciales de la misma, en este caso la url del panel de admin mediante una URL con un nombre de interfaz impredecible, asi →

    • https://insecure-website.com/administrator-panel-yb556

Este concepto ya lo tenía en la cabeza pero referente a criptografía, lo que hablaba el profe Jorge Ramios.

  • Entonces con la URL es posible que un atacante o hacker no pueda adivinar directamente la url eso es cierto, sin embargo es posible que la aplicación aún filtre la URL a los usuarios, además la URL puede divulgarse en JavaScript que construye la interfaz de usuario según la función del usuario.

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

Aqui vemos como se construye un enlace simbolico para un usuario si ese usuario es usuario de tipo Administrador, el problema recae en que la URL “Impredecible” de la interfaz de admin se divulga en el mismo Script de JS para todos.


Métodos de control de acceso basados en parámetros →

  • Algunas aplicaciones determinan los derechos de acceso o la función del usuario al iniciar sesión y luego almacenan está información en una ubicación controlable por el usuario. Esto podría ser:

    • Un campo escondido, puede ser dentro del mismo codigo HTML de la aplicación.

    • O puede ser una cookie, la cual puede ser modificada.

    • O un parametro de consulta preestablecido en la URL de la pagina, que facilmente puede ser modificable.

  • Veamos un ejemplo →

La aplicación toma decisiones de control de acceso en función del valor enviado en el parametro preestablecido en la URL:

https://insecure-website.com/login/home.jsp?**admin**=true

https://insecure-website.com/login/home.jsp?**role**=1

Este enfoque claramente es inseguro porque un atacante puede facilmente modificar los valores de los parametros y acceder a funciones las cuales no está autorizado, como funciones administrativas.


Control de acceso roto como resultado de una mala configuración de la plataforma →

  • Algunas aplicaciones imponen controles de acceso en la capa de plataforma, lo hacen restringiendo el acceso a URL’s especificas y métodos HTTP según la función del usuario.

Por ejm una aplicación podría configurar una Regla de restricción de la siguiente manera:

DENY: POST, /admin/deleteUser, managers

Esta regla niega el acceso al POSTmétodo en la URL /admin/deleteUsera los usuarios del grupo de administradores. En esta situación, varias cosas pueden salir mal y provocar omisiones en el control de acceso.

Esto porque algunas aplicaciones permiten varios marcos de encabezados HTTP no estándar que se pueden utilizar para omitir o anular las URL’s en la solicitud original como pueden ser los encabezados: X-Original-URLy X-Rewrite-URL Pero si un sitio web utiliza controles frontales rigurosos para restringir el acceso según la URL, pero la aplicación permite que la URL se anule mediante un encabezado de solicitud, entonces es posible omitir los controles de acceso mediante una solicitud como la siguiente:

POST / HTTP/1.1
X-Original-URL: /admin/deleteUser
...

¿Cuales son los marcos para solucionarlos actualizandolos?

  • React, Django, Express JS, Ruby on Rails y Laravel son marcos de desarrollo web de uso común.

Algunos controles de seguridad para el acceso pueden ser eludidos:

Las aplicaciones pueden ser facilmente eludidas, hay aplicaciones que permiten diferentes métodos de solicitudes HTTP en la plataforma, y los controles de restricción de frontend que vimos anteriormente pueden ser eludidos usando estos metodos, por ejm una URL que está restringida por el control de acceso si un atacante puede lograr hacer diferentes metodos GET o POST en la aplicación, puede eludir el control de acceso que se implementa en la capa de la plataforma.

Vamos a ver un LAB para entender bien el concepto y entender como podemos eludir el control de acceso a la URL o URL’s.

Control de acceso roto como resultado de discrepancias en la coincidencia de URL →

Los sitios web pueden variar en cuanto a cuán estrictamente coinciden con la ruta de una solicitud entrante a un punto final definido. Por ejemplo, pueden tolerar mayúsculas inconsistentes, por lo que una solicitud /ADMIN/DELETEUSERaún puede asignarse al /admin/deleteUserpunto final. Si el mecanismo de control de acceso es menos tolerante, puede tratarlos como dos puntos finales diferentes y, como resultado, no aplicar las restricciones correctas.

Pueden surgir discrepancias similares si los desarrolladores que utilizan el marco Spring han habilitado la useSuffixPatternMatch opción. Esto permite asignar rutas con una extensión de archivo arbitraria a un punto final equivalente sin extensión de archivo. En otras palabras, una solicitud /admin/deleteUser.anything seguiría coincidiendo con el /admin/deleteUser patrón. Antes de Spring 5.3, esta opción estaba habilitada de forma predeterminada. Ahora en otros sistemas, puede encontrar discrepancias sobre si /admin/deleteUser y /admin/deleteUser/ se tratan como puntos finales distintos. En este caso, es posible que pueda evitar los controles de acceso agregando una barra diagonal a la ruta.

Escalada de privilegios Horizontal →

Esta escalada de privilegios nos permite poder acceder a recursos los cuales son propiedad de otros usuarios y no de nosotros, a diferencia de la escalada de privilegios vertical que accede es a funciones confidenciales con usuarios que no tienen permitido el acceso.

Por ejemplo, si un empleado puede acceder a los registros de otros empleados además de a los suyos propios, entonces se trata de una escalada de privilegios horizontal.

Los ataques de escalada de privilegios horizontales pueden utilizar tipos de métodos de explotación similares a los de la escalada de privilegios vertical. Por ejemplo, un usuario podría acceder a la página de su propia cuenta utilizando la siguiente URL:

<https://insecure-website.com/myaccount?id=123>

Si un atacante modifica el idvalor del parámetro por el de otro usuario, podría obtener acceso a la página de la cuenta de otro usuario y a los datos y funciones asociados.

Vulnerabilidad IDOR (Insecure Direct Object Referente):(Vulnerabilidad de Referencia Directa a Objetos)

El IDOR es un tipo de vulnerabilidad que ocurre cuando una aplicación le permite a un usuario acceder directamente a objetos (como recursos, funciones o archivos) en función de la consulta que éste realice, sin realizar el debido control de acceso.

Casos comunes de IDOR

1 – Al solicitar información del usuario

Un sitio web utiliza la siguiente URL para acceder a una página con información de un usuario:

*<https://sitio-inseguro.com/user_info?user_id=998*>

El número de usuario (el valor del parámetro user_id) se utiliza directamente como índice de registro en las consultas que se realizan en la base de datos.

Si no se implementa un control de acceso, un atacante puede simplemente modificar el valor del número de usuario desde la URL y ver la información personal de otros usuarios.

2 – Al cambiar la contraseña de un usuario

Una aplicación mobile utiliza el siguiente endpoint de su API para modificar la contraseña de la cuenta del usuario, actualizando la información de una base de datos en el back-end:

POST /api/v1/editar_cuenta/actualizar_contraseña 
HTTP/1.1 Host: sitio-inseguro.com Cookie: 
session_token=12j3hf6sa8df57re65t4ff8wee5trgf9reg6597th6trf9 
Content-Type: application/json;charset=utf-8 
Content-Length: 46 
{“user_id”:”222“,”password”:”NuevaContraseña“}

Si no se implementa algún un control de acceso, un atacante puede simplemente modificar el valor del parámetro user_id dentro del cuerpo de la solicitud POST para modificar la contraseña de otro usuario.

También, si el atacante cambiara la contraseña de una cuenta administrativa (o cualquier otra con altos privilegios), podría realizar un movimiento vertical de privilegios. Debido a que accede a una función confidencial la cual es administrador.


3 – En archivos estáticos

Supongamos que una empresa de transporte genera certificados de emisión de boletos referidos a sus clientes, los cuales tienen información personal de los mismos.

Sin embargo, los archivos se guardan usando un nombre de archivo incremental, por lo que los clientes acceden a su certificado visitando una URL como la siguiente:

*<https://sitio-inseguro.com/fake-bus/certificados/177.pdf*>

En este escenario, un atacante puede simplemente modificar el nombre del archivo para acceder a certificados de otros usuarios y obtener su información personal.

Ejemplo con código PHP estándar

<?php
$user_id = $_GET[‘uid’];
$user_info = get_user_info($user_id);
[…]

El problema con esto recae en que no valida nada, solo toma el User ID de la pagina y lo almacena para procesarlo, no se valida ni se confirma el ID con algun Token o cookie de sessión, esto hace que sea vulnerable al IDOR siendo facilmente manipulable el ID de user por otro diferente pudiendo acceder a otros recursos de otro users.

Solución →

En el inicio de sesión debes implementar un sistema de cookies y crear las variables de la sesión. En este caso, especificando la siguiente variable:

[…]
$sql = “SELECT * FROM users WHERE email=?;“; //Declaraciones para conectarse a la db
$stmt = mysqli_stmt_init($conn);
mysqli_stmt_bind_param($stmt, “s”, $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
[…]
$_SESSION[‘uid’] = $row[‘uid’]; //Se define uid como una variable de sesion
[…]

Luego, se debe cambiar el elemento afectado por la vulnerabilidad, cambiando el origen del parámetro para que no lo tome de una entrada proveniente del usuario, sino que recupere el valor del parámetro de la sesión actual.

<?php
$user_id = $_SESSION[‘uid’];
$user_info = get_user_info($user_id);
[…]

Aqui ya estamos procesando el ID de user con la cookie unica generada para ese ID unico en especifico, por lo cual si se modifica el ID no coincidirá con la Cookie de sessión original que había sido creada en un principio.


Los JWT tienen la característica de poder estar firmados digitalmente, con el fin de verificar la integridad de la información contenida en los mismos.

Por ejemplo, si se implementan JWT para administrar las sesiones de esta API, se utilizaría un código similar a este:

let payload = {“id“:111};
let token = jwt.sign( payload,’secret‘,  { noTimestamp:true, expiresIn: ‘1h‘ });

Resultando en una cadena de caracteres que conforman el JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTExLCJleHAiOjE2MjE4OTE2NDZ9.Uzv_kQpY649Rvdm96iPWNEaJ457jbIHanVtVF4V6jcM

Ahora bien, debe implementarse en la autenticación de la API y utilizarse como token de sesión. Luego, debe modificarse el elemento con código vulnerable para que utilice el valor suministrado por el JWT. Entonces, el código quedaría similar a lo siguiente:

[…]
router.get(‘/api/v1/profile/user_info’, (req, res) => {
const decoded = jwt.verify(token, ‘secret’);
var user_id = [decoded.id](<http://decoded.id/>)
var db = require(‘../database‘);
db.query(‘SELECT * FROM users WHERE user_id = ?‘, [user_id]) //Se usa ese valor como referencia para ejecutar la consulta SQL
[…]

Vamos a ver un lab para entender bien el concepto de IDOR y la escalada de privilegios Horizontal:

⚠️ Nota

Este es un ejemplo de una vulnerabilidad de referencia directa a objetos (IDOR) insegura. Este tipo de vulnerabilidad surge cuando los valores de los parámetros del controlador de usuario se utilizan para acceder a recursos o funciones directamente.


En algunas aplicaciones, el parámetro explotable no tiene un valor predecible. Por ejemplo, en lugar de un número creciente, una aplicación podría utilizar identificadores únicos globalmente (GUID) para identificar a los usuarios. Esto puede impedir que un atacante adivine o prediga el identificador de otro usuario. Sin embargo, los GUID que pertenecen a otros usuarios pueden revelarse en otras partes de la aplicación donde se hace referencia a los usuarios, como mensajes o reseñas de usuarios.

Con esto en mente, podemos intentar ver y descubrir en el siguiente LAB el GUID del user que nos pida el lab:


Escalada de privilegios horizontal a vertical

A menudo un ataque mediante una escalada de privilegios Horizontal se puede llegar a convertir en una escalada de privilegios Vertical, esto porque cuando un atacante lograr acceder al recurso de password de un usuario o logra restablecerla ahi sabemos que accedemos a un recurso, pero si ese usuario llegase a tener permisos de super usuario o fuese administrador, ya estariamos cambiando a una escalada vertical de privilegios ya que estariamos accediendo a funciones confidenciales las cuales se suponen no son accesibles para todo tipo de usuario.

Un atacante podría obtener acceso a la página de la cuenta de otro usuario utilizando la técnica de manipulación de parámetros ya descrita para la escalada de privilegios horizontal:

<https://insecure-website.com/myaccount?id=456>

Si el usuario objetivo es un administrador de aplicaciones, el atacante obtendrá acceso a una página de cuenta administrativa. Esta página puede revelar la contraseña del administrador o proporcionar un medio para cambiarla, o puede proporcionar acceso directo a una funcionalidad privilegiada.

Vamos a ver un laboratorio de PoC:


Referencias inseguras a objetos directos (IDOR)

¿Qué son las referencias directas a objetos inseguras (IDOR)?

  • Las referencias directas a objetos inseguras, son un tipo de vulnerabilidad de control de acceso que surge cuando una aplicación utiliza entradas que son proporcionadas por el usuario, me explico por ejm: una url que mantiene un ?id=9083 con un numero de 4 digitos en ese caso esa es una entrada que es proporcionada por el user porque dependiendo del user ese numero cambiará por otro, y por ello es que por ahí se puede iniciar un ataque ya que facilmente un user puede llegar a cambiar el ID de user por otros digitos diferentes que sean de un user de tipo admin.

El término IDOR se popularizó por su aparición en el Top Ten de OWASP 2007. Sin embargo, es sólo un ejemplo de muchos errores en la implementación del control de acceso que pueden llevar a que se eludan los controles de acceso .

Las vulnerabilidades de IDOR se asocian más comúnmente con la escalada de privilegios horizontal, pero también pueden surgir en relación con la escalada de privilegios vertical.

Ejemplos de IDOR

Hay muchos ejemplos de vulnerabilidades de control de acceso en las que se utilizan valores de parámetros controlados por el usuario para acceder a recursos o funciones directamente.

Vulnerabilidad IDOR con referencia directa a objetos de base de datos →

Considere un sitio web que utiliza la siguiente URL para acceder a la página de la cuenta del cliente, recuperando información de la base de datos back-end:

<https://insecure-website.com/customer_account?customer_number=132355>

Aqui por ejm vemos que la pagina usa una URL con un customer_number=132355 fque es el indice de registro directo que se indexa para la busqueda directa en la base de datos del backend, para este caso concreto podemos darnos cuenta como tan solo con cambiar el numero de indice del customer_number por otro podríamos estar accediendo a otro registro de la cuenta de otro cliente, y en ese caso ya estaríamos aplicando una escalada de privilegios horizontal evitando los controles de acceso.

Y otro caso significativo podría ser que nosotros cambiasemos al usuario por otro usuario con privilegios y en ese caso ya estaríamos creando una escalada de privilegios tanto horizontal como vertical, otras explotaciones podrían ser explotar la filtración de contraseñas o modificar parametros una vez que uno como atacante haya llegado a la paginas de las cuentas de usuario.

Vulnerabilidad IDOR con referencia directa a archivos estáticos

Las vulnerabilidades de IDOR a menudo surgen cuando los recursos confidenciales se encuentran en archivos estáticos en el sistema de archivos del lado del servidor. Por ejemplo, un sitio web puede guardar las transcripciones de mensajes de chat en el disco usando un nombre de archivo incremental y permitir a los usuarios recuperarlas visitando una URL como la siguiente:

<https://insecure-website.com/static/12144.txt>

En esta situación, un atacante puede simplemente modificar el nombre del archivo para recuperar una transcripción creada por otro usuario y potencialmente obtener credenciales de usuario y otros datos confidenciales.

Vulnerabilidades de control de acceso en procesos de varios pasos →

Muchas aplicaciones implementan procesos seguidos unos de otros que son fundamentales para lo que se quiere lograr, y en cada proceso se validan y se crean controles de acceso asignados, ahora bien muchas veces los programadores en la aplicación llegan a validar los primeros 2 controles “pasos” con los requeridos controles de acceso sin embargo dejando despejado y vulnerable el paso 3, que vamos a ver detalle un ejemplo que puede ser vulnerable y que pasos son o pueden ser en una aplicación:

Por ejemplo, la función administrativa para actualizar los detalles del usuario podría implicar los siguientes pasos:

  1. Cargue el formulario que contiene detalles para un usuario específico. (paso rigurosamente protegido)

  2. Envíe los cambios. (paso rigurosamente protegido)

  3. Revisar los cambios y confirmar. (paso vulnerable)

De esta forma una aplicación podría llegar a implementar los pasos y controles de acceso rigurosos pero para los 2 primeros pasos con el pensamiento de: “Si ya hizó los 2 primeros pasos ya se validó el acceso de ese usuario”, sin embargo puede ser para un atacante facil en estos casos, ya que se podría buscar la forma para llegar directamente a la solicitud que contiene el paso 3 que es el vulnerable e intentar de esta forma eludir el control de acceso, obteniendo acceso NO autorizado.

Control de Acceso basado en Referentes →

Algunos sitios web implementan en los controles de acceso el encabezado referer que es el que indica la pagina que inició la solicitud, ahora bien este encabezado HTTP puede enviarse en las solicitudes.

Y por ejm una aplicación puede mantener de forma solida el control de acceso a la interfaz de /admin sin embargo sub interfaces de esta interfaz como admin/deleteUser puede ser que se inspecciones con el referer y en ese caso si añadimos al referer la interfaz /admin, podemos entonces permitir la solicitud (aunque tecnicamente no es correcto, claro).

En este caso, Refererun atacante puede controlar completamente el encabezado. Esto significa que pueden falsificar solicitudes directas a subpáginas confidenciales proporcionando el Refererencabezado requerido y obtener acceso no autorizado.

Control de acceso basado en la ubicación

Algunos sitios web imponen controles de acceso basados en la ubicación geográfica del usuario. Esto puede aplicarse, por ejemplo, a aplicaciones bancarias o servicios de medios donde se aplican la legislación estatal o restricciones comerciales. Estos controles de acceso a menudo pueden eludirse mediante el uso de servidores proxy web, VPN o la manipulación de mecanismos de geolocalización del lado del cliente.


Cómo prevenir vulnerabilidades en el control de acceso

Las vulnerabilidades de control de acceso se pueden prevenir añadiendo un enfoque de defensa, aplicando algunos principios que vamos a ver:

  • Nunca confiar en la ofuscación para el control de acceso, en este caso debemos fiarnos de proteger los controles de acceso que creemos ante cualquier ataque que involucre ofuscaciones de cualquier tipo en cualquier tipo codificación.

  • A menos que un recurso esté creado para ser accesible publicamente, se debe crear un control de acceso de forma predeterminada, no importa que tipo de recurso o pagina publica a como de lugar debe tener un control de acceso de forma predeterminada ya que es la forma de garantizar de que no se pueda acceder por ninguna parte o recurso de una pagina o empresa.

  • Utilizar un unico mecanismo de control de acceso, en la medida de lo posible en todos los recursos o subdominios de una pagina principal o recurso principal de una organización, esto con el fin de mantener un control centralizado respecto a los controles de acceso en la organizacion o pagina principal, ya que si se usan diversos controles de acceso en diferentes recursos puede caber la posibilidad muy alta de que uno de esos controles de acceso contenga un pequeño fallo o vuln, lo mejor es usar un unico control de acceso enfocarse bien en ese y que sea robusto, por supuesto.

  • A nivel de código, haga obligatorio que los desarrolladores declaren el acceso permitido para cada recurso y deniegue el acceso de forma predeterminada.

  • Auditar constante y de forma detallada periodicamente los controles de acceso creados con el fin de garantizar que funcionen según lo diseñado.

Vamos a ver un LAB para poner en practica la teoría:

Eso es todo por esta vulnerabilidad comunmente conocida como Control de Acceso

Gracias por leerme, un abrazo y que la fuerza te acompañe!

🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
🍗Laboratorio: Referencias directas a objetos inseguros
🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
⛄Laboratorio: Control de acceso basado en referentes