HTTP Verb Tampering es un tipo de ataque web en el que se utiliza una petición HTTP que no debería producirse normalmente dentro del protocolo. Esto puede permitir a un atacante robar información, modificar datos o realizar otra actividad maliciosa. Para proteger a tus usuarios y a ti mismo de tales ataques, debes entender qué es HTTP Verb Tampering y cómo mitigar los ataques.
Descripción de HTTP Verb Tampering
La HTTP Verb Tampering (o manipulación de verbos HTTP) es un ataque que aprovecha las vulnerabilidades de los mecanismos de autenticación y control de acceso de los verbos HTTP (también conocidos como métodos HTTP).
Muchos mecanismos de autenticación sólo limitan el acceso a los métodos HTTP más comunes, permitiendo así el acceso no autorizado a recursos restringidos por otros métodos HTTP.
Contexto de los Métodos HTTP
Como mencionaba anteriormente, esta vulnerabilidad tiene que ver con el error de configuración del control de acceso para los métodos del protocolo HTTP. La autenticación contundente no está habilitada para todos los métodos de servidor web HTTP permitidos.
Veamos algunos métodos HTTP:
GET
– se utiliza para recuperar información de un servidor en un URI determinado.HEAD
– igual que GET, pero el servidor sólo envía las cabeceras y la cadena de estado sin el cuerpo del mensaje HTTP.POST
– se utiliza para enviar datos a un servidor.PUT
– se utiliza para descargar el contenido de la solicitud a un URI determinado.DELETE
– elimina el recurso especificado en el URI.CONNECT
– convierte la conexión existente en un túnel.OPTIONS
– se utiliza para obtener los parámetros de la conexión HTTP actual.TRACE
– crea un bucle de retorno por el que el cliente puede ver lo que está pasando con el mensaje en todos los nodos de transmisión.
Hay otros como PATCH
, PROPFIND
, PROPATCH, MKCOL
, COPY
, MOVE
, LOCK
, UNLOCK
, SEARCH
, POLL
, NOTIFY
y otros. Seguramente habrá más novedades en el futuro.
Descripción del Ataque
Muchos mecanismos de autenticación del servidor web utilizan controles de acceso y autenticación basados en verbos. Dichos mecanismos de seguridad incluyen reglas de control de acceso para solicitudes con métodos HTTP específicos. Por ejemplo, un administrador puede configurar un servidor web para permitir el acceso sin restricciones a una página web mediante peticiones HTTP GET
, pero restringir las peticiones POST
sólo a los administradores. Sin embargo, muchas implementaciones de mecanismos de seguridad basados en verbos aplican las reglas de seguridad de manera insegura, permitiendo el acceso a recursos restringidos mediante métodos HTTP alternativos (como HEAD) o incluso cadenas de caracteres arbitrarias.
Por ejemplo, Java Platform Enterprise Edition (Java EE) admite la autenticación basada en verbos y el control de acceso a través del archivo web.xmlconfiguration
. En Java EE, se puede limitar el acceso a los directorios admin/ para los usuarios “admin” añadiendo lo siguiente a web.xml
:
<security-constraint>
<web-resource-collection>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
Estas reglas de seguridad garantizan que las peticiones GET o POST a los directorios /admin
por parte de usuarios que no son administradores serán bloqueadas. Sin embargo, las peticiones HTTP a los directorios admin/ que no sean GET o POST no se bloquearán. Mientras que una petición GET de un usuario no administrador será bloqueada, una petición HEAD del mismo usuario no lo será. A menos que el administrador configure explícitamente el servidor web para denegar todos los métodos que no sean GET y POST, el mecanismo de control de acceso se puede eludir simplemente utilizando métodos diferentes que sean compatibles con el servidor.
En algunos servidores web -por ejemplo, Apache 2.2/PHP- es incluso posible saltarse el mecanismo de control de acceso utilizando cadenas de caracteres arbitrarias para los métodos HTTP. Estos servidores web implementan gestores por defecto para las peticiones que no están vinculadas a un método HTTP específico. A diferencia de un Servlet HTTP en el que una petición GET sólo se gestiona si se define un doGet()
, algunos servidores web intentan procesar todos y cada uno de los métodos, incluidos los desconocidos. Así, sustituyendo un método legítimo por uno arbitrario (MPRV en lugar de GET), el atacante puede aprovechar las vulnerabilidades de la lógica de procesamiento interna y saltarse el mecanismo de control de acceso.
Control de Seguridad | Permite verbos HTTP en la política | HEAD puede estar en la política | Política Eludible |
---|---|---|---|
All Java EE (web.xml) | Sí | Sí | Sí |
APP.NET Authz | Sí | Sí | Sí (no usar deny all) |
SiteMinder | Sí | Sí | No (posiblemente si la protección de recursos por defecto = unprotected) |
.htaccess | Sí | Sí | Sí (si no se utiliza <LimitExcept>) |
Ejemplo y Desafío CTF: HTTP Verb Tampering
Para ejemplificar el ataque HTTP Verb Tampering, utilizaremos el desafío en root-me.org, llamado “HTTP – Verb tampering“. Da 15 puntos por resolver el puzzle, que es un poco más difícil que el nivel de entrada. Puedes encontrar otros desafíos en +100 Sitios web que te enseñan cómo hackear legalmente.
Solución
Ir a la página de empleo:
http://challenge01.root-me.org/web-serveur/ch8/
El sistema de autenticación se activa y pide un nombre de usuario y una contraseña.
No hay nada más que podamos hacer aquí. Abre una línea de comandos y utiliza curl para enviar una solicitud al servidor.
curl http://challenge01.root-me.org/web-serveur/ch8/
Por defecto, curl
envía la petición utilizando el método GET. La respuesta que obtenemos es un 401 Authorization Required. Al mismo tiempo, vemos que el servidor utiliza un servidor web Apache.
Cambia el método a POST.
curl -X POST http://challenge01.root-me.org/web-serveur/ch8/
El resultado es el mismo. 401 Authorization Required.
Comprueba si el administrador ha configurado la autenticación para todos los métodos. Cambia el método a OPTIONS
.
curl -X OPTIONS http://challenge01.root-me.org/web-serveur/ch8/
El resultado es el contenido de la página.
Aquí está la bandera: a23e$dme96d3saez$$prap
Valídalo.
Si la bandera encaja, ganamos 15 puntos. ¡Bien hecho!
Prevención del Ataque HTTP Verb Tampering
Los ataques de manipulación de verbos aprovechan los fallos de configuración en el mecanismo de control de acceso o las vulnerabilidades en el código de los gestores de peticiones. Como se presenta en el ejemplo anterior, bloquear las peticiones que utilizan métodos HTTP no estándar no es suficiente porque en muchos casos un atacante puede utilizar un método HTTP legítimo como HEAD.
Entonces:
- Limita la lista de métodos HTTP disponibles en el servidor web.
- Si configuras la autenticación, asegúrate de que está activada para todos los métodos HTTP disponibles.
El servidor web también debe manejar correctamente los métodos HTTP inexistentes. Por ejemplo, vamos a especificar el método ES_GEEKS
:
curl -X ES_GEEKS http://challenge01.root-me.org/web-serveur/ch8/
En el caso de Apache + .htaccess, no utilices las restricciones verbales de HTTP ni uses LimitExcept.
Consulta la referencia de OWASP para obtener más información sobre cómo solucionar este problema en otras plataformas.