XSS
El cross-site scripting permite colar JavaScript en una página que luego se ejecuta en el navegador de otra persona, con su sesión y sus permisos. Puede ser reflejado (viaja en el enlace), almacenado (queda guardado en la web) o basado en DOM. En estos casos verás de dónde entraba el código, por qué el filtro no lo paraba y cómo se corrigió el escapado.
Guía: XSS, qué es y cómo se busca →XSS reflejado en el parámetro user de un portal SSL VPN del Departamento de Defensa de EE. UU. (CVE-2025-0133)
Un portal SSL VPN expuesto del Departamento de Defensa de EE. UU. reflejaba sin sanear el parámetro user, lo que permitía ejecutar JavaScript en el navegador de quien abriese un enlace preparado, sin necesidad de autenticarse.
2 min
XSS entre cuentas en Basecamp: inyección de opciones de oEmbed encadenada con Turbo para saltarse el nonce de la CSP
Un embed creado en una cuenta se renderizaba sin autenticación bajo cualquier otra cuenta, y el bundle de Turbo cargado desde un CDN permitido firmaba el script del atacante con el nonce de la víctima, dando control de su sesión.
6 min
XSS almacenado en los avisos del panel de WordPress de la plataforma Atomic/Pressable de Automattic
El código de la plataforma Atomic/Pressable imprimía los avisos del escritorio de WordPress sin escapar, y uno de ellos incluía el nombre de una opción leída de la base de datos: un valor manipulado ejecutaba JavaScript en plugins.php.
4 min
XSS almacenado en la vista previa de adjuntos de Roundcube, explotable con cookie tossing desde otro subdominio
La acción display-attachment de Roundcube servía en línea los adjuntos HTML subidos al redactar un correo, sin CSP. Combinado con cookie tossing desde un subdominio vulnerable, permitía tomar la cuenta de otro usuario.
4 min
XSS DOM almacenado en WordPress: un Contributor se convierte en administrador vía Quick Edit
En sitios WordPress con más de 10.000 usuarios, un Contributor podía guardar HTML codificado en su nombre público. Al pulsar Quick Edit sobre su post, el administrador ejecutaba ese código y acababa creando una cuenta de administrador controlada por el atacante.
5 min
XSS reflejado sin autenticación en un script CGI heredado en Perl de Essity
Un formulario de registro en Perl, olvidado en /cgi-bin/ de un dominio de Essity, devolvía un parámetro tal cual en el HTML. Bastaba un enlace para ejecutar JavaScript en ese origen, sin necesidad de sesión.
3 min
Rails: allowed_uri? daba por buenas URLs javascript: partidas con caracteres de control codificados como entidades
El ayudante Rails::HTML::Sanitizer.allowed_uri? devolvía true para valores como java script:alert(1). El navegador los convierte en javascript: y los ejecuta al pulsar el enlace.
4 min
DOM XSS en el nombre de fichero del importador de Fizzy (Basecamp) permite robar la cuenta con un solo clic
La vista previa del importador de cuentas de Fizzy pintaba el nombre del .zip con innerHTML. Un nombre de fichero preparado inyectaba un botón que, usando la sesión y el token CSRF de la víctima, cambiaba su email y permitía tomar la cuenta.
5 min
XSS de un clic en Fizzy (Basecamp): paginación de Turbo y blobs HTML sin adjuntar para robar un token de escritura
Un atacante con cuenta propia conseguía ejecutar JavaScript en el origen de Fizzy cuando una víctima de otra cuenta abría una URL de tablero público, y con ello crear y exfiltrar un token de escritura de la víctima.
8 min
XSS reflejado en el asistente de IA de help.shopify.com mediante un saludo en Markdown inyectado por CSRF
Un formulario de otra web podía fijar el saludo del asistente de IA de help.shopify.com. Ese saludo se mostraba como Markdown, y un enlace javascript: ejecutaba código en la sesión de la víctima.
3 min
XSS almacenado en la exportación HTML de Rocket.Chat, inyectable sin cuenta desde el LiveChat
La exportación de salas a HTML de Rocket.Chat (y la descarga de datos personales) volcaba los mensajes sin escapar. Un visitante anónimo del LiveChat podía colar código que se ejecutaba al abrir el fichero exportado.
5 min
XSS almacenado en el editor Trix 2.1.16 de Basecamp: atributos serializados que se saltan DOMPurify
Trix 2.1.16 conservaba cualquier atributo data-trix- y, al serializar, aplicaba sin filtrar los atributos guardados en data-trix-serialized-attributes, lo que permitía colar manejadores como onerror en el HTML final.
4 min