
# Docker-лаборатория для воспроизведения и проверки CVE-2026-56011, неаутентифицированной XSS-уязвимости в MapPress Maps для WordPress, с целями для сравнения уязвимой и пропатченной версий.
Этот репозиторий содержит локальный Docker-стенд для воспроизведения и проверки CVE-2026-56011 — неаутентифицированной уязвимости межсайтового скриптинга (Cross-Site Scripting), затрагивающей MapPress Maps для WordPress.
MapPress Maps для WordPress — это плагин WordPress, используемый для отображения карт на страницах и в записях WordPress. Уязвимое поведение затрагивает путь рендеринга карт в iframe, доступный через параметр запроса mappress=embed.
Данный стенд сравнивает две версии MapPress:
| Service | MapPress version | Purpose | URL |
|---|---|---|---|
| vuln | 2.97.3 | Vulnerable comparison target | http://localhost:8081 |
| patched | 2.97.4 | Patched comparison target | http://localhost:8082 |
Демонстрируемый путь проверки в этом локальном стенде:```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)
Уязвимая цель использует этот URL, открываемый вручную в браузере:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
Ожидаемый уязвимый результат:```text Click on the rendered MapPress component → alert(1) pops up
Запатченная цель использует тот же payload против 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
Ожидаемый результат после применения патча:```text Click on the rendered MapPress component → no alert appears
Эта лабораторная работа намеренно использует только ручную проверку через браузер. Она не включает PoC-скрипт, автоматизацию браузера, кражу учётных данных, внешние обратные вызовы, вредоносное ПО, закрепление в системе, действия после эксплуатации или атаки на внешние системы.
## Подтверждённые факты
| Утверждение | Доказательства | Как проверить в этой лабораторной работе |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
| CVE-2026-56011 затрагивает MapPress Maps для WordPress. | Публичные уведомления об уязвимостях определяют затронутый плагин WordPress как MapPress Maps для WordPress. | Изучите раздел References и проверьте плагин, установленный в обеих целях Docker. |
| Уязвимая версия для сравнения в этой лабораторной работе — MapPress 2.97.3. | Сервис `vuln` собирает плагин с использованием `MAPPRESS_VERSION: 2.97.3`. | Изучите `docker-compose.yml` и `vuln/Dockerfile`. |
| Исправленная версия для сравнения в этой лабораторной работе — MapPress 2.97.4. | Сервис `patched` собирает плагин с использованием `MAPPRESS_VERSION: 2.97.4`. | Изучите `docker-compose.yml` и `patched/Dockerfile`. |
| В MapPress 2.97.4 было добавлено соответствующее исправление экранирования в iframe. | Официальный журнал изменений плагина для 2.97.4 гласит: `Added: escape in iframe`. | Изучите официальный журнал изменений плагина WordPress и сравните уязвимый и исправленный исходный код. |
| Уязвимый исходный код вставляет имя карты в атрибут `id` веб-компонента без кавычек. | В 2.97.3 `mappress_map.php` рендерит `<mappress-map id={$name} ...>`. | Сравните исходный код версии 2.97.3 с исходным кодом версии 2.97.4. |
| Исправленный исходный код заключает значение `id` в кавычки и экранирует его. | В 2.97.4 `mappress_map.php` рендерит `id="` с помощью `esc_attr($name)`. | Сравните diff патча между версиями 2.97.3 и 2.97.4. |
| Путь iframe доступен без аутентификации. | MapPress регистрирует `template_redirect`, когда присутствует `$_GET['mappress']`. | Запросите `/?mappress=embed...` из браузера без входа в систему. |
| Путь iframe считывает атрибуты карты из запроса. | `template_redirect()` преобразует `$_GET` в аргументы карты и вызывает рендерер iframe. | Изучите `mappress.php` и воспроизведите ручной URL. |
| Уязвимая цель допускает внедрение атрибутов через `name`. | Специально сформированное значение name может выйти за пределы незакавыченного атрибута `id` и превратиться в `onclick=alert(1)`. | Откройте уязвимый ручной URL и щёлкните отрендеренный компонент MapPress. |
| Исправленная цель блокирует тестируемое поведение внедрения атрибутов. | Исправленный вывод сохраняет полную полезную нагрузку внутри закавыченного атрибута `id`. | Откройте исправленный ручной URL и щёлкните отрендеренный компонент MapPress. |
## Допущения и неизвестные
Эта лабораторная работа использует MapPress 2.97.3 в качестве уязвимой цели для сравнения, поскольку публичные уведомления указывают, что затронуты версии до 2.97.3 включительно, а diff исходного кода показывает уязвимый рендеринг атрибута без кавычек в этой версии.
Эта лабораторная работа использует MapPress 2.97.4 в качестве исправленной цели для сравнения, поскольку публичные уведомления указывают 2.97.4 как исправленную версию, а официальный журнал изменений сообщает, что в путь iframe было добавлено экранирование.
Тестируемое уязвимое поведение — это неаутентифицированный путь рендеринга iframe:```text
GET /?mappress=embed&name=<crafted-value>
Эта лабораторная работа посвящена ручному выполнению в браузере безвредной alert-нагрузки:```text name=cve56011 onclick=alert(1)
Лабораторный стенд не пытается доказать цепочку доставки хранимых данных. Некоторые публичные уведомления классифицируют уязвимость как хранимую XSS. Этот репозиторий сосредоточен на подтверждённом исходным кодом приёмнике рендеринга iframe и поведении «уязвимая версия против исправленной», которое можно воспроизвести локально через неаутентифицированный маршрут `mappress=embed`.
Лабораторный стенд не демонстрирует:
* сохранение полезной нагрузки,
* компрометацию учётной записи WordPress,
* кражу сессии администратора,
* кражу nonce,
* внешние обратные вызовы,
* сбор данных при слепой XSS,
* кражу учётных данных,
* дамп базы данных,
* вредоносное ПО,
* персистентность,
* или атаки на системы, не относящиеся к лабораторному стенду.
Ручная проверка в браузере доказывает значимое для безопасности различие в рендеринге:```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
Корневая причина CVE-2026-56011 — некорректное кодирование вывода для значения name карты, когда MapPress рендерит веб-компонент в пути вывода карты через iframe.
Уязвимый путь кода принимает атрибуты рендеринга карты из запроса и в конечном итоге отображает пользовательский HTML-элемент:```html <mappress-map ...>
В MapPress 2.97.3, имя карты вставляется непосредственно в атрибут `id` без кавычек и без экранирования в контексте атрибута:```php
return "<div></div>\r\n<mappress-map id={$name} {$atts}>\r\n$pois\r\n</mappress-map>\r\n";
Это небезопасно, поскольку значение используется в контексте HTML-атрибута. Если атакующий контролирует name, значение, содержащее пробел, может завершить предполагаемое значение id и ввести новый атрибут.