Впервые за десять лет найден способ взлома 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.