Tema 2
Antes de estudiar vulnerabilidades concretas es indispensable entender cómo se comunican el navegador y el servidor, cómo se mantiene el estado del usuario y en qué puntos aparecen datos, decisiones y confianza. Una buena parte de la seguridad web depende de comprender exactamente ese recorrido.
Muchas vulnerabilidades web se entienden mal porque se estudian como listas de ataques o payloads, sin comprender primero cómo funciona una aplicación web en condiciones normales. Sin esa base, es fácil memorizar nombres pero difícil razonar sobre riesgo real.
Una aplicación web es, en esencia, un sistema distribuido que intercambia mensajes entre clientes y servidores. En ese intercambio viajan rutas, parámetros, formularios, cookies, encabezados, archivos, tokens y respuestas. Cada uno de esos elementos puede ser útil para el funcionamiento y también convertirse en un vector de ataque si se maneja con confianza excesiva.
En este tema analizaremos el funcionamiento general de una aplicación web, el rol de HTTP y HTTPS, la diferencia entre autenticación y sesión, el uso de cookies, la noción de estado y la construcción de la superficie de ataque.
Una aplicación web es un conjunto de componentes que permiten a un usuario o sistema interactuar con información y lógica de negocio mediante protocolos web. Aunque el usuario vea solo una interfaz visual, detrás hay múltiples piezas coordinadas.
Entre los componentes más comunes se encuentran:
Desde seguridad, cada una de estas piezas importa porque participa en el procesamiento, almacenamiento o transporte de datos que pueden ser sensibles o críticos.
La mayoría de las aplicaciones web siguen el modelo cliente-servidor. El cliente, normalmente un navegador, envía solicitudes. El servidor las recibe, las procesa y devuelve respuestas.
En apariencia este flujo es simple, pero implica varias decisiones de seguridad:
HTTP, HyperText Transfer Protocol, es el protocolo de aplicación que define cómo se intercambian solicitudes y respuestas entre clientes y servidores web. Es un protocolo textual, extensible y ampliamente adoptado.
Una solicitud HTTP suele contener:
La respuesta HTTP suele incluir:
Comprender HTTP es esencial porque la mayoría de los ataques web consisten, en el fondo, en manipular solicitudes, respuestas o el significado que la aplicación les asigna.
Los métodos HTTP expresan la intención de la solicitud. Aunque en la práctica algunas aplicaciones los usan de forma desordenada, desde diseño tienen propósitos distintos.
| Método | Uso típico | Consideración de seguridad |
|---|---|---|
| GET | Obtener recursos o datos | No debería producir cambios sensibles de estado |
| POST | Enviar datos o crear recursos | Suele transportar formularios y acciones de negocio |
| PUT | Actualizar o reemplazar recursos | Debe estar bien autorizado y validado |
| PATCH | Actualizar parcialmente | Riesgo de cambios parciales no previstos |
| DELETE | Eliminar recursos | Requiere control estricto por su impacto |
Un error frecuente es implementar acciones críticas por GET porque resultan cómodas. Eso puede facilitar abusos, cacheos indeseados o problemas relacionados con CSRF y automatización.
Desde seguridad conviene imaginar cada solicitud como un paquete de información que la aplicación debe interpretar con cuidado. Nada de lo que venga en una solicitud debe considerarse verdadero por defecto.
Entre los elementos más importantes de una solicitud se encuentran:
Del lado de la respuesta, también hay decisiones críticas:
Una característica fundamental de HTTP es que, por diseño, es stateless, es decir, no mantiene estado entre una solicitud y la siguiente. El protocolo no recuerda automáticamente quién es el usuario, qué hizo antes o si ya inició sesión.
Eso obliga a las aplicaciones a construir mecanismos propios para mantener contexto entre solicitudes. Ese contexto puede incluir:
Buena parte de la seguridad web gira alrededor de cómo se representa, protege y valida ese estado. Si el estado se maneja mal, aparecen problemas de secuestro de sesión, suplantación, acceso indebido o inconsistencia de controles.
Una sesión es el mecanismo por el cual la aplicación asocia múltiples solicitudes con un mismo contexto de usuario. Gracias a la sesión, un sistema puede reconocer que varias peticiones pertenecen a la misma persona autenticada.
En muchos sistemas, la sesión se representa mediante un identificador único que el navegador envía en cada solicitud posterior. Ese identificador suele almacenarse en una cookie, aunque también puede transportarse por otros medios.
Desde seguridad, una sesión debe cumplir varias condiciones:
Estos tres conceptos suelen confundirse, pero cumplen funciones distintas.
Una aplicación puede autenticar correctamente y aun así fallar en autorización. También puede autorizar bien pero gestionar mal las sesiones. Por eso estas áreas deben analizarse por separado.
Las cookies son pequeños fragmentos de información que el servidor indica al navegador que almacene y reenvíe en solicitudes posteriores al mismo contexto. Son uno de los mecanismos más comunes para sostener sesiones y preferencias.
Una cookie puede contener:
Desde seguridad, las cookies son muy importantes porque a menudo representan la identidad activa del usuario. Si un atacante roba una cookie de sesión válida, puede suplantar a la víctima sin conocer su contraseña.
No alcanza con usar cookies; deben configurarse correctamente. Algunos atributos reducen riesgos importantes.
| Atributo | Función | Riesgo mitigado |
|---|---|---|
| Secure | Indica que solo se envíe por HTTPS | Exposición por tráfico no cifrado |
| HttpOnly | Impide acceso desde JavaScript | Robo por ciertos escenarios de XSS |
| SameSite | Restringe envío en contextos cross-site | Mitigación parcial de CSRF |
| Expires / Max-Age | Define vida útil | Persistencia excesiva de sesiones |
Estos atributos ayudan, pero no reemplazan un diseño correcto de autenticación, expiración e invalidación de sesiones.
HTTPS es HTTP transportado sobre TLS. Su función es proteger la comunicación entre cliente y servidor contra observación y manipulación durante el tránsito.
Cuando HTTPS está bien implementado, aporta principalmente:
Sin embargo, HTTPS no resuelve por sí solo vulnerabilidades lógicas o de aplicación. Una aplicación con SQL Injection, Broken Access Control o XSS seguirá siendo vulnerable aunque use HTTPS. Lo que cambia es que el canal de comunicación está mejor protegido.
Las aplicaciones web existen para recibir datos: nombres, correos, contraseñas, búsquedas, filtros, comentarios, archivos, montos, identificadores, fechas, acciones. Ese flujo de entrada es necesario para operar, pero también representa una de las mayores fuentes de riesgo.
Las entradas pueden llegar por:
La regla clave es simple: toda entrada externa debe considerarse potencialmente hostil hasta ser validada, normalizada y procesada de forma segura.
Muchas interfaces web validan campos con JavaScript para mejorar experiencia de uso, por ejemplo verificar formato de correo o longitud mínima de contraseña. Eso es útil, pero no constituye seguridad real.
Un atacante puede omitir completamente la interfaz y enviar solicitudes directas mediante proxies, scripts o herramientas de testing. Por eso toda validación relevante debe replicarse y aplicarse en el servidor.
Los encabezados HTTP no son un detalle menor. Muchos influyen directamente en cómo se interpreta una solicitud o cómo se protege una respuesta.
Algunos encabezados relevantes son:
Una mala interpretación o confianza excesiva en estos encabezados puede abrir puertas a bypasses, spoofing, CSRF o errores de control de acceso.
Un flujo común de autenticación incluye varios pasos encadenados:
Los riesgos pueden aparecer en cualquiera de esos pasos: credenciales débiles, enumeración de usuarios, sesiones predecibles, tokens mal protegidos, expiraciones incorrectas o ausencia de invalidación tras logout o cambio de contraseña.
Las aplicaciones modernas no siempre manejan estado de la misma forma. Dos enfoques comunes son sesiones basadas en cookies y autenticación basada en tokens.
En una sesión clásica, el servidor mantiene el estado y el navegador solo almacena un identificador. En un esquema con tokens, parte del contexto o las credenciales puede viajar en el propio token enviado por el cliente.
Ambos modelos pueden ser seguros o inseguros según su implementación. Lo importante es entender que cualquier elemento que represente identidad o privilegios debe tratarse como material sensible.
No todos los recursos de una aplicación requieren autenticación. Algunos son públicos, otros privados y otros administrativos. La seguridad depende de separar con claridad esos contextos.
| Tipo de recurso | Ejemplos | Control esperado |
|---|---|---|
| Público | Inicio, catálogo, documentación | Sin autenticación, pero con protección frente a abuso |
| Privado | Perfil, historial, panel de usuario | Autenticación y autorización por dueño o rol |
| Administrativo | Gestión de usuarios, reportes, configuración | Controles estrictos y monitoreo reforzado |
Muchos problemas de seguridad aparecen cuando esta separación se aplica solo en la interfaz visual, pero no en el backend.
La superficie de ataque de una aplicación web es el conjunto de puntos a través de los cuales un atacante puede interactuar con el sistema, influir en él o extraer información. No se limita a las páginas visibles; incluye toda interfaz expuesta o alcanzable.
La superficie de ataque puede verse como la suma de:
Una parte de la aplicación es visible para cualquier usuario normal: páginas, formularios, botones, menús. Pero otra parte suele estar menos expuesta a simple vista y aun así ser atacable.
Ejemplos de superficie no evidente:
Un atacante no depende de la navegación visual. Puede enumerar rutas, observar tráfico, manipular solicitudes y buscar recursos no documentados.
Imaginemos un usuario que inicia sesión en una tienda online y consulta su historial de compras.
/mi-cuenta/historial.Ahora pensemos dónde pueden aparecer problemas:
Ese ejercicio muestra por qué entender el flujo es más valioso que memorizar nombres aislados.
Secure o HttpOnly.Antes de profundizar en vulnerabilidades concretas, conviene desarrollar una mirada sistemática sobre cualquier aplicación web.
Este enfoque ayuda a razonar sobre la aplicación como sistema, no solo como colección de páginas.
Todo lo visto aquí se conecta directamente con las categorías del OWASP Top 10. Por ejemplo:
En otras palabras, este tema es la base operativa para interpretar correctamente los siguientes.
Comprender el funcionamiento de una aplicación web es un requisito previo para estudiar seguridad con criterio. HTTP, sesiones, cookies, autenticación y superficie de ataque no son conceptos accesorios: son la base sobre la que se construyen tanto la experiencia de usuario como la mayoría de los riesgos.
En el próximo tema comenzaremos con la primera categoría del OWASP Top 10: Broken Access Control, una de las fallas más frecuentes y con mayor impacto en aplicaciones modernas.