Parte: 4 — Seguridad de aplicaciones web · Fuente: PortSwigger Research / Real-World Bug Hunting (Yaworski) ⏱️ Duración estimada: 120 min · Nivel: Experto
Explotar tres clases de ataques del lado del cliente propias de las aplicaciones JavaScript modernas: configuraciones CORS inseguras que exponen datos, uso inseguro de postMessage entre ventanas/iframes, y prototype pollution en JavaScript que puede escalar a XSS o RCE (en Node). Son vectores de moda en el bug bounty actual.
⚠️ Ética: solo en labs propios/autorizados.
Al finalizar, el alumno podrá:
Origin con credenciales.postMessage sin validación de origen.Object.freeze.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Modelo de origen (SOP) y CORS | Base de la seguridad cliente |
| 2 | Configuraciones CORS inseguras | Fuga de datos con credenciales |
| 3 | postMessage inseguro | Comunicación entre ventanas |
| 4 | Prototype pollution: concepto | Contaminar Object.prototype |
| 5 | Gadgets y escalada a XSS/RCE | Impacto real |
| 6 | Herramientas (DOM Invader) | Detección práctica |
| 7 | Defensas por vector | Cierre del fallo |
Origin o permitir null con Access-Control-Allow-Credentials: true. Característica: permite leer datos autenticados cross-origin.event.origin ni los datos.Object.prototype vía claves como __proto__. Característica: afecta a todos los objetos.⚠️ Solo en labs propios.
Origin: https://evil.com y observa si se refleja en Access-Control-Allow-Origin junto a Allow-Credentials: true.fetch con credentials: 'include' para leer datos sensibles cross-origin.null (iframe sandbox) si el servidor lo acepta.event.data sin validar event.origin.innerHTML) y lograr XSS.__proto__[x]=y y un gadget que lo consuma.Object.prototype desde un parámetro y comprueba el efecto global.event.origin, Object.freeze(Object.prototype).Resuelve un lab de CORS que permita exfiltrar datos autenticados y un lab de prototype pollution que escale a XSS, documentando ambos.
Criterio de aceptación: ambos labs quedan resueltos, entregas el exploit CORS (con credentials), el source→gadget de la contaminación y las defensas concretas por vector.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| CORS no refleja Origin | Allowlist estricta; no explotable por reflejo |
Allow-Credentials ausente |
Sin credenciales no hay fuga de datos privados |
| postMessage valida origen | Handler seguro; documenta la fortaleza |
__proto__ filtrado |
La app sanea claves; prueba constructor.prototype |
| Contaminación sin gadget | No hay sink que la consuma; busca otro |
❓ ¿CORS mal configurado es como CSRF? No: CSRF ejecuta acciones; el CORS inseguro permite leer respuestas cross-origin, filtrando datos.
❓ ¿Prototype pollution siempre es explotable? No por sí sola; necesita un gadget que lea la propiedad contaminada. Sin gadget, es un fallo latente.
❓ ¿Por qué validar event.origin en postMessage?
Porque sin ello cualquier página puede enviar mensajes maliciosos que tu handler procesa como confiables.
Clase 112 — Web cache poisoning y HTTP request smuggling