
CVE Reproduction: cve-2026-63030_60137-wordpress_rce_reproduction
Обнаружено: Searchlight Cyber (через GPT-5.6 Sol)
Критичность: Критическая — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Статус: Активно эксплуатируется — добавлено в CISA KEV
Псевдоним: «wp2shell»
Это цепочка удаленного выполнения кода без аутентификации в ядре WordPress, состоящая из двух CVE:
| CVE | Компонент | Тип | CWE |
|---|---|---|---|
| CVE-2026-63030 | Пакетная конечная точка WP REST API | Путаница маршрутов / обход контроля доступа | CWE-436 |
| CVE-2026-60137 | Параметр author__not_in в WP_Query | SQL-инъекция | CWE-89 |
По отдельности каждая уязвимость серьезна; вместе они позволяют неавторизованному атакующему выполнить произвольный PHP-код на цели и развернуть веб-шеллы.
REST API WordPress предоставляет пакетную конечную точку по адресу /wp-json/wp/v2/batch. Из-за ошибки в разрешении маршрутов (введенной в переработанном маршрутизирующем промежуточном слое WP 6.9) обработчик пакетов не проверяет корректно, что внутренние подзапросы в пакете наследуют проверки аутентификации и разрешений внешнего запроса. Атакующий может сформировать полезную нагрузку пакета, которая:
wp/v2/users, wp/v2/plugins) без требуемых проверок прав.WP_REST_Server::dispatch() для передачи поддельных параметров маршрута внутренним обработчикам.Это обходит все средства защиты аутентификации для операций чтения и некоторых операций записи в сочетании с провозом параметров.
author__not_inКласс WP_Query принимает параметр author__not_in, предназначенный для исключения записей по идентификаторам авторов. Ошибка приведения типов в методе WP_Query::get_posts() (введенная в рефакторинге очистки запросов WP 6.9) приводит к тому, что значения author__not_in напрямую вставляются в SQL-предложение WHERE без надлежащей параметризации, если они переданы в виде особым образом сформированного ассоциативного массива.
Инъекция происходит в генерируемом SQL post_author IN (...). Вкладывая массивы с фрагментами необработанного SQL, атакующий может выйти за пределы предложения IN и выполнить произвольные операторы UNION / INTO OUTFILE — при условии, что пользователь базы данных имеет привилегию FILE.
Атакующий (без аутентификации)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Обход аутентификации, вызов внутреннего API запросов
│ └─ CVE-2026-60137: Внедрение SQL через author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Веб-шелл развернут в корне веб-сервера
│ └─ RCE достигнуто
Пакетная конечная точка предоставляет вектор; SQLi обеспечивает доставку полезной нагрузки.
| Диапазон версий | Полная цепочка |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Оба CVE присутствуют |
| WordPress 7.0.0 – 7.0.1 | ✅ Оба CVE присутствуют |
| WordPress ≤ 6.8.x | Только CVE-2026-63030 (SQLi не эксплуатируется) |
Патчи были выпущены в WordPress 6.9.5 и 7.0.2 (оба выпущены 2026-07-16).
/wp-json/wp/v2/batch возвращает 200 (не 403/404).--target (см. ниже)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch на WAF / обратном прокси.FILE у пользователя MySQL WordPress.define('DISALLOW_FILE_EDIT', true); и define('DISALLOW_FILE_MODS', true);..php файлы в wp-content/.author__not_in с нецелыми значениями.