Впервые за десять лет найден способ взлома WordPress напрямую через основной код. Владельцы сайтов срочно обновляют систему, команда разработчиков выпускает патчи, а хакеры ищут новые векторы атаки. Уязвимость wp2shell позволяет получить полный контроль над сервером.
Для изучения уязвимости используется готовая лабораторная среда из репозитория FullHunt. Там находится полный набор экспериментальных материалов и различные варианты эксплуатации, включая способы создания учётных записей через бэкдор-скрипты.
Внимание: статья предназначена для специалистов по информационной безопасности, проводящих тестирование с согласия владельца. Автор не несёт ответственности за использование информации в незаконных целях. Разработка вредоноса и несанкционированное вмешательство в системы преследуются по закону.
Запуск лабораторной среды:
git clone https://github.com/fullhunt/wp2shell-scan.git
cd wp2shell-scan
cd testbed
docker compose up --build
Затем откройте в браузере http://localhost:8080/ и установите WordPress. Используйте любые данные для администратора.
После установки запустятся два контейнера с общим разделом файлов. Это позволяет процессу базы данных писать в WordPress, но пока недостаточно. База работает от собственного пользователя без прав на запись в /var/www/html. Выполните:
docker exec testbed-wordpress-1 chmod 777 /var/www/html/
Если имя контейнера отличается, подставьте своё.
Уязвимость CVE-2026-63030
CVE-2026-63030 позволяет вмешаться в маршрутизацию REST API на эндпоинте пакетной обработки запросов:
/wp-json/batch/v1
/?rest_route=/batch/v1
Атакующий строит запрос так, чтобы запутать процессы валидации и фактического выполнения. Внутри работают три массива данных:
$requests— исходный список запросов. Содержит объектыWP_REST_RequestилиWP_Error, если объект некорректен.$validation— результаты проверки каждого запроса. Каждый элемент либоtrue, либоWP_Error.$matches— готовый список методов для выполнения. Хранит путь API, имя функции и её аргументы.
Система предполагает синхронизацию между $validation и $matches. WordPress сравнивает элементы по индексу. Если в $validation стоит true, выполняется соответствующий обработчик из $matches.
Нормальный сценарий:
$validation → $matches
true → callback1
WP_Error → callback2
true → callback3
Но хакер может сместить индексы через неправильный URL, и массивы рассинхронизируются:
$validation → $matches
WP_Error → callback1
true → callback3
WP_Error → (пусто)
В этом случае функция callback3 выполнится без надлежащей проверки разрешений, потому что WordPress смотрит на элемент с индексом 2 в $validation, где стоит true, и запускает соответствующий обработчик из $matches.
