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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/ressl/cve-2026-87902-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВиртуализация для безопасностиВеб-безопасностьТестирование на ПроникновениеЛаборатории и Практика
GitHubressl/cve-2026-87902-poc

cve-2026-87902-poc

PoC для CVE-2026-87902 — неаутентифицированный обход пути в разрешении шаблонов страниц WordPress (локальное включение PHP, условное RCE) с закреплённой уязвимой лабораторией

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

Популярное

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

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

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

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

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

CVE-2026-87902 — WordPress Core: неаутентифицированный обход пути при разрешении шаблона страницы

Неаутентифицированное локальное включение PHP-файла в WordPress Core через дважды закодированное значение pagename — и, при определённых условиях развёртывания, выполнение PHP-кода с привилегиями учётной записи веб-сервера.

CVECVE-2026-87902
Уведомление вендораGHSA-7hp8-65ch-5whp
РазборCVE-2026-87902: Critical WordPress file inclusion and conditional RCE
ЗатронутоWordPress Core 4.7.0 – 7.1.1 (все ветки, согласно диапазонам по веткам в уведомлении); динамически воспроизведено на 7.0.2
Исправлено7.1.2 (ветка 7.1), 7.0.6 (ветка 7.0) и бэкпорт для каждой ветки вплоть до 4.7.37 (согласно уведомлению)
СлабостиCWE-98 (ненадлежащий контроль имени файла при include), CWE-22 / CWE-23 (обход пути)
CVSS v3.1CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H — 8.1 High
CVSS v4.0 (дополнительно)CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N — 9.2 Critical
Аутентификацияотсутствует — без учётной записи, cookie, nonce, сессии, плагина или исходящего запроса
Взаимодействие с пользователемотсутствует
АвторRobert Ressl — ressl.ch
PoC проверен2026-09-22 на лабораторном стенде в этом репозитории — см. Проверенные результаты

Краткое описание

WordPress разрешает шаблон страницы через цепочку, которая нигде не доказывает, что выбранный файл остаётся внутри корня темы:

  1. pagename и page_id — публичные переменные запроса, которые WP::parse_request() принимает из анонимного тела POST.
  2. Дважды закодированный обход пути в pagename переживает раннюю санитизацию запроса как экранированные октеты %xx (wp_basename() не видит %2f как разделитель, а sanitize_title_with_dashes() намеренно сохраняет корректные октеты).
  3. Затем корректный page_id выбирает реальную опубликованную страницу, тогда как вредоносный pagename остаётся в объекте запроса.
  4. Позже get_page_template() вызывает urldecode() для этого значения и добавляет кандидата, такого как page-templates/../../../../../../../usr/local/lib/php/pearcmd.php, в иерархию шаблонов.
  5. locate_template() и финальный загрузчик шаблона проверяют только существование, читаемость и суффикс .php/.html — но никогда то, что канонический путь по-прежнему находится внутри разрешённого корня темы — и затем выполняет include.

Это неаутентифицированный примитив удалённого локального включения файла в WordPress Core. На протестированной официальной среде выполнения (wordpress:php8.3-apache, которая включает PEAR и не загружает php.ini, поэтому register_argc_argv имеет значение On), включение было сцеплено через pearcmd.php из PEAR: первый анонимный запрос заставляет config-create записать контролируемый атакующим PHP-код в /tmp, второй анонимный запрос включает этот файл и выполняет его от имени www-data.

Отсутствие ограничения пути в Core и есть уязвимость. PEAR — лишь один зависящий от окружения маршрут от включения к выполнению кода — это не зависимость WordPress, и он присутствует или пригоден не во всех развёртываниях.

Первопричина

Проверенные местоположения в исходном коде (WordPress 7.0.2):

#РасположениеРоль
1wp-includes/class-wp.php:18,322-330pagename и page_id — публичные переменные запроса, и они читаются из $_POST
2wp-includes/class-wp-query.php:2205sanitize_title_for_query( wp_basename( $query_vars['pagename'] ) ) — %2f не является разделителем для wp_basename()
3wp-includes/formatting.php:2283-2289sanitize_title_with_dashes() сохраняет корректные октеты %xx вместо их удаления
4wp-includes/template.php:492$pagename_decoded = urldecode( $pagename ); — обход пути становится активным после санитизации
5wp-includes/template.php:722-736locate_template() конкатенирует кандидата под каждым корнем темы и вызывает только file_exists()
6wp-includes/template-loader.php:116-132realpath() нормализует путь, затем include выполняется без канонической проверки нахождения внутри корня
7wp-includes/canonical.php:42-47redirect_canonical() завершается досрочно для не-GET/HEAD, поэтому POST не канонизируется и не отбрасывается

Предусловия

Автономному примитиву включения требуется:

#ПредусловиеПричина
1Опубликованная, анонимно доступная страница, выбранная числовым page_idстраница должна быть возвращена запросом после неудачи поиска по имени пути
2Отсутствие более раннего разрешаемого пользовательского шаблона страницыкорректный назначенный шаблон упорядочен перед вредоносным кандидатом
3Каталог верхнего уровня в активной (дочерней или родительской) теме, имя которого начинается с page-, например page-templates/WordPress добавляет фиксированный префикс page-, поэтому обход .. не может начаться с позиции 0; каталог должен лишь существовать и быть проходимым — он не обязан быть доступным для записи
4Выбранный локальный .php-файл, который существует и читаем пользователем PHPзагрузчик проверяет is_file()/is_readable() и требует суффикс .php
5Отсутствие ограничения файловой системы, блокирующего этот файлopen_basedir или политика MAC могут предотвратить включение

Продемонстрированному этапу с PEAR дополнительно нужны читаемый pearcmd.php (вместе с его зависимостями), register_argc_argv=On для веб-SAPI и доступный для записи выходной каталог. В производственных файлах php.ini устанавливается register_argc_argv=Off; протестированный образ не загружает php.ini, поэтому применялось скомпилированное значение по умолчанию (On). Это важное ограничение на распространённость продемонстрированной цепочки выполнения кода.

Поставляемые темы Twenty Twenty-Three/Four/Five не содержат каталога page-* верхнего уровня, поэтому стандартному лабораторному стенду нужна фикстура, описанная ниже. Пользовательские темы могут законно использовать структуру page-templates/ (документация WordPress).

В уведомлении зафиксировано, где эти условия встречаются в поставляемом ПО: условие темы выполняется для устаревших тем Twenty Twelve и Twenty Fourteen и для сторонних тем, таких как Neve, Hestia и Sydney, тогда как переход через PEAR применим к официальному Docker-образу PHP и к конфигурациям cPanel по умолчанию, работающим на PHP старше 8.5. (Twenty Twelve и Twenty Fourteen обе поставляются с каталогом page-templates/ верхнего уровня; остальные утверждения принадлежат уведомлению.) Этот репозиторий не измеряет, как часто применима полная цепочка.

Быстрый старт

./lab/up.sh            # WordPress 7.0.2 + MySQL 8.4 + the page-* fixture, installed and ready
python3 cve-2026-87902.py   # two anonymous POSTs, prints the proof marker

cve-2026-87902.py требует Python 3.6+ (только стандартная библиотека) и по умолчанию обращается к лабораторному стенду по http://127.0.0.1:8091. Ожидаемый вывод:

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