Objetivo
Validar vulnerabilidades web de alto impacto
Enfoque
Navegador, servidor, objetos y autorización
Resultado
Demostrar riesgo con pruebas controladas
16.1 Introducción
En el tema anterior vimos inyecciones, donde una entrada se interpreta como instrucción. En este tema estudiaremos otras familias críticas de vulnerabilidades web: XSS, CSRF, SSRF, deserialización insegura y fallas de control de acceso.
Estas fallas pueden permitir ejecución de JavaScript en navegador, acciones involuntarias, acceso a redes internas desde el servidor, manipulación de objetos o acceso indebido a funciones y datos.
La validación debe realizarse con cuentas de laboratorio, endpoints controlados y evidencia mínima, evitando afectar usuarios reales, servicios internos no autorizados o datos sensibles.
16.2 Relación entre estas vulnerabilidades
Aunque son categorías distintas, comparten una causa común: confianza indebida. La aplicación confía en datos, estados, orígenes o permisos que pueden ser manipulados.
| Vulnerabilidad |
Confianza indebida |
Impacto típico |
| XSS |
Contenido de usuario mostrado sin salida segura |
Ejecución de JavaScript en navegador |
| CSRF |
La cookie autenticada basta para ejecutar acciones |
Acciones no intencionadas del usuario |
| SSRF |
El servidor solicita URLs controladas por el usuario |
Acceso a redes internas o metadatos |
| Deserialización insegura |
Objetos recibidos se reconstruyen sin control |
Manipulación lógica o ejecución de código |
| Control de acceso |
El cliente o parámetro decide permisos |
Acceso a datos o funciones indebidas |
16.3 Cross-Site Scripting
XSS ocurre cuando una aplicación permite que contenido controlado por el usuario se ejecute como JavaScript en el navegador. Su severidad depende de dónde se ejecuta, quién lo ve y qué puede hacer la sesión afectada.
Impactos posibles:
- Ejecutar acciones en nombre del usuario.
- Modificar contenido de la página.
- Capturar datos mostrados en pantalla.
- Abusar de APIs accesibles desde el navegador.
- Redirigir a flujos engañosos.
- Afectar cuentas privilegiadas si el payload es almacenado.
Una prueba de XSS no debe robar cookies ni afectar usuarios reales. Un marcador inocuo en cuenta de prueba suele bastar para demostrar ejecución.
16.4 Tipos de XSS
| Tipo |
Descripción |
Riesgo |
| Reflejado |
La entrada vuelve inmediatamente en la respuesta |
Requiere inducir al usuario a visitar un enlace o enviar una petición |
| Almacenado |
El payload queda guardado en la aplicación |
Puede afectar a muchos usuarios, incluso administradores |
| DOM-based |
La ejecución ocurre en el navegador por JavaScript cliente |
Puede no verse claramente en la respuesta del servidor |
| Blind XSS |
Se ejecuta en un panel o contexto no visible para quien prueba |
Puede afectar sistemas internos o moderadores |
16.5 Validación segura de XSS
La validación debe confirmar ejecución en el contexto vulnerable sin capturar información sensible ni afectar usuarios reales.
- Usar cuentas de laboratorio.
- Probar en campos y flujos autorizados.
- Usar payloads inocuos que muestren un marcador de prueba.
- Evitar captura de cookies, tokens o datos personales.
- Limpiar contenido almacenado después de la prueba.
- Registrar URL, parámetro, contexto de salida y rol afectado.
- Evaluar si CSP, HttpOnly y SameSite reducen impacto.
16.6 Prevención de XSS
La prevención depende del contexto de salida. No se escapa igual contenido dentro de HTML, atributo, JavaScript, CSS o URL.
- Escapar salida según contexto.
- Usar plantillas y frameworks de forma segura.
- Validar y normalizar entradas.
- Evitar insertar HTML no confiable.
- Sanitizar contenido rico con librerías confiables.
- Aplicar Content Security Policy como capa adicional.
- Usar cookies HttpOnly y Secure para reducir impacto.
16.7 Cross-Site Request Forgery
CSRF ocurre cuando una aplicación permite que un sitio externo fuerce al navegador de un usuario autenticado a ejecutar una acción. El navegador envía automáticamente cookies, por lo que la aplicación puede creer que la acción fue intencional.
Es especialmente relevante en acciones con cambio de estado:
- Cambiar correo o contraseña.
- Crear, modificar o eliminar registros.
- Enviar formularios administrativos.
- Activar integraciones.
- Realizar transferencias, compras o aprobaciones.
16.8 Validación segura de CSRF
La validación debe usar cuentas y recursos de laboratorio. No se debe inducir a usuarios reales ni ejecutar acciones irreversibles.
- Identificar una acción con cambio de estado.
- Comprobar si existe token CSRF impredecible.
- Verificar si el token está ligado a sesión y acción.
- Revisar SameSite en cookies.
- Probar con una acción reversible de laboratorio.
- Confirmar si requiere reautenticación o MFA.
- Documentar petición, ausencia de control e impacto.
Un endpoint que solo consulta información suele tener menor riesgo CSRF que uno que cambia estado o ejecuta acciones de negocio.
16.9 Prevención de CSRF
- Tokens CSRF únicos, impredecibles y validados en servidor.
- Cookies con SameSite adecuado.
- Validación de Origin o Referer como capa adicional.
- Reautenticación para acciones sensibles.
- No usar GET para acciones con cambio de estado.
- Separar APIs con tokens explícitos en cabeceras cuando aplique.
16.10 Server-Side Request Forgery
SSRF ocurre cuando una aplicación permite que el servidor realice solicitudes hacia destinos influenciados por el usuario. El riesgo aumenta porque el servidor puede alcanzar redes internas, servicios cloud o endpoints que el usuario externo no ve.
Superficies frecuentes:
- Importar imágenes por URL.
- Webhooks configurables.
- Generadores de PDF o capturas.
- Validadores de URL.
- Integraciones con almacenamiento remoto.
- Procesamiento de XML o documentos con referencias externas.
16.11 Validación segura de SSRF
La validación segura debe confirmar que el servidor realiza una solicitud controlada sin escanear redes internas ni consultar metadatos sensibles sin autorización.
- Usar un endpoint controlado por el equipo evaluador.
- Registrar si llega la solicitud y desde qué origen.
- Evitar probar rangos internos no autorizados.
- No consultar endpoints cloud de metadatos salvo permiso explícito.
- Probar restricciones de esquema, host y red de forma gradual.
- Documentar cabeceras, método y comportamiento observado.
16.12 Prevención de SSRF
| Control |
Objetivo |
Cuidado |
| Lista permitida |
Permitir solo destinos esperados |
Validar después de resolver DNS |
| Bloqueo de redes internas |
Evitar acceso a localhost, RFC1918 y metadatos |
Considerar IPv6 y redirecciones |
| Validación de esquema |
Limitar protocolos permitidos |
No aceptar file, gopher u otros esquemas peligrosos |
| Proxy saliente |
Centralizar control y logs |
Aplicar reglas estrictas |
| Timeout y tamaño |
Evitar abuso de recursos |
No corrige SSRF por sí solo |
16.13 Deserialización insegura
La serialización convierte objetos en un formato que puede almacenarse o transmitirse. La deserialización reconstruye esos objetos. Si la aplicación deserializa datos no confiables, un atacante puede alterar estado, tipos, propiedades o incluso provocar ejecución de código según el lenguaje y librerías.
Puede aparecer en:
- Cookies o tokens con objetos serializados.
- Parámetros ocultos.
- Colas de mensajes.
- APIs internas.
- Archivos importados.
- Sesiones almacenadas en cliente.
16.14 Señales de deserialización insegura
- Datos codificados que cambian comportamiento al modificarse.
- Errores que mencionan clases, objetos o serialización.
- Cookies largas con estructuras reconocibles.
- Firmas ausentes o no verificadas.
- Objetos que contienen roles, precios, permisos o estados.
- Uso de formatos nativos de lenguaje para datos no confiables.
No todo dato codificado es vulnerable. El riesgo aparece cuando el servidor confía en contenido manipulable o deserializa tipos peligrosos.
16.15 Validación segura de deserialización
La validación debe empezar por cambios inocuos que demuestren confianza indebida, no por payloads agresivos.
- Modificar un campo no sensible en datos de prueba.
- Observar si el servidor acepta valores alterados.
- Comprobar si existe firma o integridad.
- Evitar gadgets o payloads de ejecución sin autorización explícita.
- No manipular roles o privilegios en cuentas reales.
- Documentar formato, campo, cambio y resultado.
16.16 Prevención de deserialización insegura
- No deserializar datos no confiables en formatos nativos peligrosos.
- Usar formatos simples y validables, como JSON con esquema estricto.
- Firmar y verificar integridad de datos del lado cliente.
- No confiar en roles, precios o permisos enviados por el cliente.
- Aplicar listas permitidas de tipos cuando la deserialización sea inevitable.
- Ejecutar con privilegios mínimos.
- Actualizar librerías con historial de gadgets conocidos.
16.17 Fallas de control de acceso
Las fallas de control de acceso permiten que un usuario acceda a datos o funciones que no le corresponden. Suelen ser críticas porque afectan directamente confidencialidad e integridad.
Tipos comunes:
- Vertical: usuario común accede a función de administrador.
- Horizontal: usuario accede a datos de otro usuario del mismo nivel.
- Por objeto: manipulación de IDs permite acceso a recursos ajenos.
- Por función: endpoint oculto ejecuta acción sin validar rol.
- Por estado: acción permitida en una etapa incorrecta del flujo.
16.18 IDOR y BOLA
IDOR, Insecure Direct Object Reference, ocurre cuando una aplicación expone referencias directas a objetos y no valida correctamente si el usuario puede acceder a ellos. En APIs se habla con frecuencia de BOLA, Broken Object Level Authorization.
| Señal |
Riesgo |
Prueba segura |
| IDs secuenciales |
Acceso a objetos cercanos |
Usar dos cuentas de laboratorio |
| UUID sin autorización |
Difícil de adivinar, pero accesible si se conoce |
Probar recurso de otra cuenta de prueba |
| Filtros por userId |
Consulta de datos de otros usuarios |
Comparar respuestas por rol |
| Endpoint de función admin |
Acciones privilegiadas |
Invocar con usuario no admin de laboratorio |
16.19 Validación segura de control de acceso
La prueba debe usar usuarios y recursos creados para el pentest. No se debe acceder a datos reales de clientes o empleados para demostrar el hallazgo.
- Crear o solicitar cuentas de prueba con roles distintos.
- Crear recursos controlados para cada cuenta.
- Capturar peticiones legítimas.
- Cambiar identificadores o roles de forma controlada.
- Comparar respuestas y permisos reales.
- Registrar impacto sin exponer datos sensibles.
- Detenerse al confirmar acceso indebido.
16.20 Prevención de fallas de autorización
- Validar autorización del lado servidor en cada operación.
- No confiar en controles de interfaz o botones ocultos.
- Implementar políticas centralizadas y consistentes.
- Verificar propiedad del objeto antes de leer, modificar o borrar.
- Usar pruebas automatizadas por rol y por objeto.
- Negar por defecto cuando no exista regla explícita.
- Registrar intentos de acceso indebido.
16.21 Encadenamiento de vulnerabilidades
Estas vulnerabilidades pueden encadenarse. Un XSS puede ejecutar acciones que se parecen a CSRF. Un SSRF puede acceder a endpoints internos que exponen objetos serializados. Un IDOR puede exponer datos que facilitan otra explotación.
- XSS almacenado en panel admin más sesión privilegiada.
- SSRF hacia metadatos cloud más credenciales temporales.
- IDOR que expone token usado en API interna.
- Deserialización que permite modificar rol más control de acceso débil.
- CSRF sobre acción administrativa sin reautenticación.
La severidad final debe considerar la cadena completa, no solo cada hallazgo aislado.
16.22 Evidencia y reporte
La evidencia debe mostrar la vulnerabilidad, el contexto y el impacto sin dañar usuarios ni exponer datos reales.
| Hallazgo |
Evidencia útil |
Evitar |
| XSS |
Marcador inocuo ejecutado en cuenta de prueba |
Robo de cookies o acciones contra usuarios reales |
| CSRF |
Acción reversible en recurso de laboratorio |
Acciones irreversibles o productivas |
| SSRF |
Solicitud hacia endpoint controlado |
Escaneo interno no autorizado |
| Deserialización |
Cambio inocuo aceptado por el servidor |
Payloads de ejecución sin aprobación |
| Control de acceso |
Comparación entre dos cuentas de prueba |
Acceso a datos reales de terceros |
16.23 Errores frecuentes
- Validar XSS robando cookies o datos reales.
- Probar CSRF sobre acciones irreversibles.
- Usar SSRF para escanear redes internas sin autorización.
- Empezar deserialización con payloads de ejecución de código.
- Probar control de acceso con recursos de usuarios reales.
- Confiar en que ocultar botones equivale a autorización.
- No probar APIs porque la interfaz web no muestra la función.
- No limpiar payloads almacenados después de la prueba.
16.24 Flujo práctico de pruebas
Un flujo responsable para estas vulnerabilidades puede ser:
- Mapear flujos, roles, recursos y endpoints.
- Preparar cuentas y datos de laboratorio.
- Probar salidas controladas para XSS.
- Revisar acciones sensibles para CSRF.
- Validar SSRF solo contra endpoints propios o autorizados.
- Analizar objetos serializados con cambios inocuos.
- Comparar autorización entre roles y propietarios.
- Recolectar evidencia mínima.
- Limpiar payloads y recursos de prueba.
- Priorizar hallazgos por impacto real y posibilidad de encadenamiento.
16.25 Qué debes recordar de este tema
- XSS ejecuta código en el navegador y debe validarse con payloads inocuos.
- CSRF abusa de sesiones autenticadas para ejecutar acciones involuntarias.
- SSRF convierte al servidor en origen de solicitudes y puede exponer redes internas.
- La deserialización insegura aparece cuando el servidor confía en objetos manipulables.
- El control de acceso debe verificarse en servidor para cada objeto y función.
- La evidencia debe usar cuentas y datos de prueba, no información real de terceros.
16.26 Conclusión
XSS, CSRF, SSRF, deserialización insegura y fallas de control de acceso muestran que la seguridad web depende de validar contexto, permisos, origen y datos en cada operación. Muchas de estas fallas requieren análisis manual y comprensión del flujo de negocio.
En el próximo tema profundizaremos en pruebas de autenticación, sesiones, MFA y gestión de credenciales, áreas centrales para proteger el acceso a aplicaciones y servicios.