
Laboratorio basado en Docker para reproducir y validar CVE-2026-56011, una vulnerabilidad XSS no autenticada en MapPress Maps para WordPress, con objetivos de comparación vulnerables y parcheados.
Este repositorio contiene un laboratorio Docker local para reproducir y validar CVE-2026-56011, una vulnerabilidad de Cross-Site Scripting no autenticado que afecta a MapPress Maps para WordPress.
MapPress Maps para WordPress es un plugin de WordPress que se utiliza para renderizar mapas dentro de páginas y entradas de WordPress. El comportamiento vulnerable afecta a la ruta de renderización de mapas iframe, que es accesible a través del parámetro de solicitud mappress=embed.
Este laboratorio compara dos versiones de MapPress:
| Servicio | Versión de MapPress | Propósito | URL |
|---|---|---|---|
| vuln | 2.97.3 | Objetivo de comparación vulnerable | http://localhost:8081 |
| patched | 2.97.4 | Objetivo de comparación parcheado | http://localhost:8082 |
La ruta de validación demostrada en este laboratorio local es:```text Unauthenticated browser request → GET /?mappress=embed → request supplies a crafted name value → vulnerable target renders name into an unquoted id attribute → injected onclick handler becomes a standalone HTML attribute → clicking the rendered MapPress component triggers alert(1) → patched target keeps the payload inside a quoted and escaped id attribute → clicking the rendered component does not trigger alert(1)
El objetivo vulnerable utiliza esta URL de navegación manual:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
Resultado vulnerable esperado:```text Click on the rendered MapPress component → alert(1) pops up
El objetivo parcheado usa el mismo payload contra MapPress 2.97.4:```text
http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
Resultado esperado tras el parche:```text Click on the rendered MapPress component → no alert appears
Este laboratorio utiliza intencionalmente solo validación manual mediante navegador. No incluye un script PoC, automatización de navegador, robo de credenciales, callbacks externos, malware, persistencia, actividad post-explotación ni ataques contra sistemas externos.
## Hechos Verificados
| Afirmación | Evidencia | Cómo verificarlo en este laboratorio |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
| CVE-2026-56011 afecta a MapPress Maps para WordPress. | Los avisos públicos de vulnerabilidad identifican el plugin de WordPress afectado como MapPress Maps para WordPress. | Revise la sección Referencias e inspeccione el plugin instalado en ambos objetivos Docker. |
| La versión vulnerable de comparación en este laboratorio es MapPress 2.97.3. | El servicio `vuln` compila el plugin utilizando `MAPPRESS_VERSION: 2.97.3`. | Inspeccione `docker-compose.yml` y `vuln/Dockerfile`. |
| La versión parcheada de comparación en este laboratorio es MapPress 2.97.4. | El servicio `patched` compila el plugin utilizando `MAPPRESS_VERSION: 2.97.4`. | Inspeccione `docker-compose.yml` y `patched/Dockerfile`. |
| MapPress 2.97.4 introdujo la corrección relevante de escape en el iframe. | El changelog oficial del plugin para 2.97.4 dice `Added: escape in iframe`. | Revise el changelog oficial del plugin de WordPress y compare el código fuente vulnerable y el parcheado. |
| El código fuente vulnerable renderiza el nombre del mapa en el componente web `id` sin comillas. | En 2.97.3, `mappress_map.php` renderiza `<mappress-map id={$name} ...>`. | Compare el código fuente de 2.97.3 con el de 2.97.4. |
| El código fuente parcheado entrecomilla y escapa el valor de `id`. | En 2.97.4, `mappress_map.php` renderiza `id="` con `esc_attr($name)`. | Compare el diff del parche entre 2.97.3 y 2.97.4. |
| La ruta del iframe es accesible sin autenticación. | MapPress registra `template_redirect` cuando `$_GET['mappress']` está presente. | Solicite `/?mappress=embed...` desde un navegador sin iniciar sesión. |
| La ruta del iframe lee los atributos del mapa desde la solicitud. | `template_redirect()` asigna `$_GET` a los argumentos del mapa y llama al renderizador del iframe. | Inspeccione `mappress.php` y reproduzca la URL manual. |
| El objetivo vulnerable permite la inyección de atributos a través de `name`. | El valor del nombre manipulado puede salir del atributo `id` sin comillas y convertirse en `onclick=alert(1)`. | Abra la URL manual vulnerable y haga clic en el componente MapPress renderizado. |
| El objetivo parcheado bloquea el comportamiento de inyección de atributos probado. | La salida parcheada mantiene el payload completo dentro del atributo `id` entrecomillado. | Abra la URL manual parcheada y haga clic en el componente MapPress renderizado. |
## Supuestos e Incógnitas
Este laboratorio utiliza MapPress 2.97.3 como objetivo vulnerable de comparación porque los avisos públicos identifican las versiones hasta la 2.97.3 inclusive como afectadas, y el diff del código fuente muestra el renderizado vulnerable del atributo sin comillas en esa versión.
Este laboratorio utiliza MapPress 2.97.4 como objetivo parcheado de comparación porque los avisos públicos identifican la 2.97.4 como la versión corregida, y el changelog oficial indica que se añadió el escape en la ruta del iframe.
El comportamiento vulnerable probado es la ruta de renderizado del iframe sin autenticación:```text
GET /?mappress=embed&name=<crafted-value>
Este laboratorio se centra en la ejecución manual en el navegador de un payload de alerta inofensivo:```text name=cve56011 onclick=alert(1)
El laboratorio no pretende demostrar una cadena de entrega almacenada. Algunos avisos públicos clasifican la vulnerabilidad como XSS almacenado. Este repositorio se centra en el sumidero de renderizado de iframe confirmado por el código fuente y en el comportamiento vulnerable frente al parcheado, que puede reproducirse localmente a través de la ruta no autenticada `mappress=embed`.
El laboratorio no demuestra:
* persistencia de payload almacenado,
* compromiso de cuentas de WordPress,
* robo de sesiones de administrador,
* robo de nonces,
* callbacks externos,
* recolección de XSS ciego,
* robo de credenciales,
* volcado de bases de datos,
* malware,
* persistencia,
* ni ataques contra sistemas ajenos al laboratorio.
La validación manual en el navegador demuestra la diferencia de renderizado relevante para la seguridad:```text
MapPress 2.97.3:
crafted name value becomes executable onclick attribute
MapPress 2.97.4:
crafted name value remains inside the quoted id attribute
La causa raíz de CVE-2026-56011 es una codificación de salida incorrecta para el valor name del mapa cuando MapPress renderiza un componente web dentro de la ruta de salida del mapa iframe.
La ruta de código vulnerable acepta atributos de renderizado del mapa desde la solicitud y finalmente renderiza un elemento HTML personalizado:```html <mappress-map ...>
En MapPress 2.97.3, el nombre del mapa se inserta directamente en el atributo `id` sin comillas y sin escape de contexto de atributo:```php
return "<div></div>\r\n<mappress-map id={$name} {$atts}>\r\n$pois\r\n</mappress-map>\r\n";
Esto es inseguro porque el valor se usa en un contexto de atributo HTML. Si el atacante controla name, un valor que contenga un espacio puede terminar el valor id previsto e introducir un nuevo atributo.