
Детектор CVE-2026-87902. Класс LFI в WordPress get_page_template. Только обнаружение. Авторизованная лаборатория.
Детектор CVE-2026-87902 для WordPress Core.
get_page_template() можно направить так, чтобы разрешение шаблона страницы включало читаемый локальный .php-файл за пределами активной темы. WPSniper фингерпринтит сайт, выбирает опубликованный page_id, проверяет класс include и выводит VULN только тогда, когда сильный баннер PEAR уникален для тела пробы.
Только детект. Никаких веб-шеллов. Никакого pearcmd config-create. Никакого выполнения команд ОС.
python3 WPSniper.py -u https://lab.wordpress.local --shell
Пайплайн:
subfinder -d lab.example -silent | httpx -silent | python3 WPSniper.py -t 8
Ограниченная область. Своя лаборатория. Это и есть вся лицензия на запуск.
WordPress строит имя шаблона страницы из производной от URL, url-декодированной переменной запроса pagename:
page-{$pagename}.php
Затем locate_template() включает этот файл. В уязвимых сборках разрешённый путь не принудительно остаётся внутри разрешённой директории темы. Двойное URL-кодирование обхода в pagename переживает sanitize_title достаточно долго, чтобы get_page_template() декодировал его один раз и вышел за пределы дерева темы.
Перед закрытым include стоят два предусловия:
page- (WordPress документирует page-templates/ — Twenty Twelve, Twenty Fourteen, Neve, Hestia, Sydney и другие)..php-цель. Детектор использует стандартные баннеры PEAR CLI как оракул include. Он его не создаёт.RCE — это возможное продолжение, когда эти условия плюс записываемый/исполняемый гаджет совпадают. Это продолжение отсутствует в данном репозитории.
Автор находки по CVE: Robert (ressl) через WordPress HackerOne. Advisory: GHSA-7hp8-65ch-5whp.
Таблица версий встроена. 4.7.0–7.1.1 — уязвимое окно. Исправленные точки: 7.1.2, 7.0.6, 6.9.9, 6.8.10 … вплоть до 4.7.37.
Маркетинговая страница, где в блог-посте написано «pearcmd», — это не попадание.
VULN только когда всё это верно:
?page_id=PEAR Version:, Usage: pear, PEAR_Config, Commands for pear, config-create, DEPRECATED: PEAR commands, pear.php)pearcmd / PEAR сам по себе отбрасывается, особенно если он уже присутствовал в базовом HTMLINFO = уязвимая версия и/или директория page-templates, include не закрыт. Не заводите critical на INFO.
SAFE = исправленная ветка, или include идентичен базовому.
SKIP = не WordPress, плохой URL.
/etc/passwd — неправильный оракул для этой CVE. locate_template() добавляет .php. Интерактивная команда passwd существует, чтобы вы сами это увидели. Появление блока root:x:0:0: необычно и должно проверяться вручную.
python3 -m pip install -r requirements.txt
python3 WPSniper.py -u https://lab.wordpress.local
Требуется requests.
--shell игнорируется в пайплайне. Это сделано намеренно.
python3 WPSniper.py -u https://lab.wordpress.local --shell
[email protected] ▶
1 fp version / theme / patched?
2 pages REST published pages
3 theme page-templates directory
4 probe PEAR include + baseline diff (no write)
5 diff same, print Δ + tokens
6 passwd try …/etc/passwd (this class includes *.php)
7 include P include a .php path without suffix
8 save last body → /tmp/wpsniper-probe.html
9 help
0 exit
Каждая проба выводит полный URL и готовый к копированию curl. Используйте его в отчёте. Не придумывайте второй запрос.
7 include предназначен для авторизованного лабораторного файла, который вы уже разместили. Пример имени в тексте справки — это маркер-свидетель, а не дроппер.
WPSniper v1.3 CVE-2026-87902 get_page_template LFI
[radar] target https://lab.wordpress.local
[radar] generator=6.8.3 theme=twentytwelve status=affected
[radar] page_id=2
[radar] theme dir /wp-content/themes/twentytwelve/page-templates/ → 403
VULN lab.wordpress.local unique=['PEAR Version:','Usage: pear'] Δlen=+18420
patched 7.1.2 · 7.0.6 · 6.8.10 · backports to 4.7.37
Хост на этой странице — лабораторная метка. Живые имена хостов клиентов не должны попадать в публичный скриншот.
Обновитесь до 7.1.2 или бэкпорта для вашей ветки:
7.0.6 · 6.9.9 · 6.8.10 · 6.7.9 · 6.6.9 · 6.5.12 · 6.4.12 · 6.3.12 · 6.2.13 · 6.1.14 · 6.0.16 · 5.9.18 … вплоть до 4.7.37.
7.1.2 также требует, чтобы разрешённый путь шаблона оставался внутри разрешённой директории темы. Это и есть настоящее исправление, а не правило WAF.
pearcmd config-create, никакой обёртки system()/etc/passwd в качестве основного подтвержденияЕсли вам нужна находка: приложите curl, который WPSniper уже вывел, уникальные сильные токены и несовпадение базового дайджеста.
Только авторизованное тестирование безопасности. Запуск этого против хоста, которым вы не владеете или на который у вас нет письменного разрешения, — ваша проблема, а не проблема инструмента.
mitsec · Yunus Emre Öztaş
| Шаг | Действие | Сигнал |
|---|
| 1 | Главная + generator + /feed/ | WordPress? версия? слаг темы? |
| 2 | REST /wp-json/wp/v2/pages или page_id= в HTML | Опубликованная страница, чтобы путь шаблона действительно сработал |
| 3 | GET /wp-content/themes/{slug}/page-templates/ | 200 / 401 / 403 = директория существует |
| 4 | Базовый ?page_id=N против пробы pagename= | Дайджест тела + уникальные сильные токены PEAR |
| Флаг | Значение |
|---|
-u URL | Одна цель |
-l file | Список URL |
| stdin | subfinder | httpx | WPSniper |
-t N | Потоки для списка (по умолчанию 6) |
-q | Тихие строки + сводка |
--shell | Интерактивная проба для одного -u |
--timeout | Секунды (по умолчанию 14) |