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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-1581-Analysis-Lab — Воспроизводит CVE-2026-1581 — неаутентифицированную time-based SQL-инъекцию в wpForo Forum <=2.4.14, с Docker-лабораторией и PoC для демонстрации уязвимости и проверки патча. | Kitploit
Инструменты/GitHubGitHub/rootdirective-sec/cve-2026-1581-analysis-lab
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubrootdirective-sec/cve-2026-1581-analysis-lab

CVE-2026-1581-Analysis-Lab

Воспроизводит CVE-2026-1581 — неаутентифицированную time-based SQL-инъекцию в wpForo Forum <=2.4.14, с Docker-лабораторией и PoC для демонстрации уязвимости и проверки патча.

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

Популярное

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

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

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

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

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

CVE-2026-1581 — wpForo Forum (<= 2.4.14) Неаутентифицированная Time-Based SQL-инъекция (ORDER BY)

ภาษาไทย


Краткое резюме

ПолеДетали
ID CVECVE-2026-1581
ПлагинwpForo Forum
Затронутые версии<= 2.4.14
Исправленная версия2.4.15
Тип уязвимостиНеаутентифицированная Time-Based SQL-инъекция (ORDER BY)
Оценка CVSS7.5 (Высокая)
Вектор CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
  • CVE-2026-1581 — это неаутентифицированная Time-Based SQL-инъекция в плагине wpForo Forum (<= 2.4.14). Параметр wpfob используется в выражении ORDER BY с применением только текстовой санитизации, что позволяет неаутентифицированному злоумышленнику внедрять произвольные SQL-выражения и читать данные из базы данных.

  • Вендор исправил эту проблему в версии 2.4.15, заменив sanitize_text_field() на wpforo_sanitize_orderby(), который применяет контекстно-зависимый белый список.


Область применения и безопасность

  • Запускать только на localhost + Docker Compose.

  • PoC представляет собой time-based доказательство задержки для демонстрации разницы между уязвимой и исправленной версиями.

  • Не использовать против любых систем без явного разрешения.


Доказательства вкратце

  • Доказательство версии: Страница /community/ загружает /wp-content/plugins/wpforo/assets/js/frontend.js?ver=2.4.14 (уязвимая) против 2.4.15 (исправленная).

  • Доказательство кода: sanitize_text_field(WPF()->GET['wpfob']) → wpforo_sanitize_orderby(..., context, default)

  • Доказательство поведения: wpfob=modified,(SELECT SLEEP(5)) вызывает задержку ~5 секунд на уязвимой версии; исправленная версия отвечает почти без задержки.


Что я обнаружил в CVE-бюллетене

  • В CVE-бюллетене указано только, что это time-based SQL-инъекция через параметр wpfob, исправленная в версии 2.4.15. На момент анализа публичного PoC не было.

  • Поэтому этот отчёт был построен на основе сравнения исходного кода между версиями 2.4.14 и 2.4.15, отслеживания пути параметра от HTTP-ввода через санитизацию до точки его использования при формировании SQL-запроса — чтобы понять первопричину и воспроизвести проблему.

vulnx CVE-2026-1581


1) Анализ на основе исходного кода

1.1 Поиск wpfob

Начав с поиска wpfob в исходном коде, было обнаружено, что страница Recent берёт значение напрямую из параметра GET и присваивает его аргументу orderby.

find wpfob

Уязвимая версия (2.4.14) — themes/classic/recent.php:

  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';

Исправленная версия (2.4.15) — тот же файл, санитизатор заменён:

  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

Почему именно recent.php? Потому что это доступный маршрут, где wpfob напрямую присваивается $args['orderby'].


1.2 Поток данных к SQL: ORDER BY ...

После установки $args['orderby'] он попадает в конструктор запросов wpForo для формирования выражения ORDER BY.

Конкатенация ORDER BY (уязвимая версия 2.4.14)

classes/Topics.php:

SQL builder: ORDER BY concatenation in Topics.php

classes/Posts.php:

SQL builder: ORDER BY concatenation in Posts.php

Пояснение

  • sanitize_text_field() только удаляет/очищает строку — он не применяет белый список допустимых имён столбцов.
  • Поскольку orderby конкатенируется напрямую в ORDER BY <orderby>, злоумышленник может внедрять произвольные SQL-выражения в позицию ORDER BY.

Ссылка: https://developer.wordpress.org/reference/functions/sanitize_text_field/


1.3 Патч / Основные изменения (2.4.14 → 2.4.15)

1.3.1 Diff: recent.php

32c32
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
74c74
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.2 Diff: wpforo.php

1036c1036
< 					$args['orderby'] = sanitize_text_field( $get['wpfob'] );
---
> 					$args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' );
1077c1077
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
1153c1153
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.3 Новая функция патча: wpforo_sanitize_orderby()

Версия 2.4.15 вводит контекстно-зависимый белый список санитизатора, который возвращает значение по умолчанию, если входные данные отсутствуют в разрешённом списке:

whitelistor


2) Дизайн лаборатории (Уязвимая vs Исправленная)

2.1 Сервисы в Docker Compose

  • wp_vuln (WordPress + wpForo 2.4.14) → http://localhost:8081
  • wp_patched (WordPress + wpForo 2.4.15) → http://localhost:8082
  • db_vuln / db_patched (MariaDB)
  • seed_vuln / seed_patched — использует wp-cli для установки WordPress, установки плагина, создания страницы /community/ с шорткодом [wpforo], настройки постоянных ссылок, генерации .htaccess и создания артефактов проверки.

2.2 Тестовый маршрут

Из чтения исходного кода wpfob явно используется на странице recent:

  • http://localhost:8081/community/recent/?view=opened
  • http://localhost:8082/community/recent/?view=opened

3) Воспроизведение: Доказательство задержки

Перед тестированием должна существовать как минимум 1 тема и 1 сообщение.

3.1 Почему "требуются сообщения"

  • Это уязвимость инъекции в ORDER BY.
  • Если в wpForo нет тем или сообщений, запрос может вернуть 0 строк — в этом случае сортировка на стороне БД не выполняется, путь кода может не вычислять выражение ORDER BY, и задержка не наблюдается — ложный отрицательный результат.
Скачать инструмент