[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fklf0GlZudOxf6PRaayE1VFRaZ2z95xkiKXJHOM-0EQk":3},{"id":4,"url_slug":5,"title":6,"description":7,"plugin_slug":8,"theme_slug":9,"affected_versions":10,"patched_in_version":11,"severity":12,"cvss_score":13,"cvss_vector":14,"vuln_type":15,"published_date":16,"updated_date":17,"references":18,"days_to_patch":20,"patch_diff_files":21,"patch_trac_url":9,"research_status":30,"research_verified":31,"research_rounds_completed":32,"research_plan":33,"research_summary":34,"research_vulnerable_code":35,"research_fix_diff":36,"research_exploit_outline":37,"research_model_used":38,"research_started_at":39,"research_completed_at":40,"research_error":9,"poc_status":9,"poc_video_id":9,"poc_summary":9,"poc_steps":9,"poc_tested_at":9,"poc_wp_version":9,"poc_php_version":9,"poc_playwright_script":9,"poc_exploit_code":9,"poc_has_trace":31,"poc_model_used":9,"poc_verification_depth":9,"poc_exploit_code_gated":31,"source_links":41},"CVE-2026-11387","sms-alert-unauthenticated-privilege-escalation-via-arbitrary-password-reset","SMS Alert \u003C= 3.9.5 - Unauthenticated Privilege Escalation via Arbitrary Password Reset","The SMS Alert – SMS & OTP for WooCommerce, Order Notifications & Abandoned Cart Recovery plugin for WordPress is vulnerable to privilege escalation via account takeover in all versions up to, and including, 3.9.5. This is due to the plugin not properly validating a user's identity prior to updating their details like reset the password of any user account, including administrators, and gain full access to those accounts. This makes it possible for unauthenticated attackers to change arbitrary user's email addresses, including administrators, and leverage that to reset the user's password and gain access to their account. This is only vulnerable on sites with OTP verification for password resets enabled, and where the administrator (or other user) has set a phone number for OTP verification.","sms-alert",null,"\u003C=3.9.5","3.9.6","critical",9.8,"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:U\u002FC:H\u002FI:H\u002FA:H","Improper Authentication","2026-06-30 19:08:22","2026-07-01 07:53:37",[19],"https:\u002F\u002Fwww.wordfence.com\u002Fthreat-intel\u002Fvulnerabilities\u002Fid\u002Fc31906da-f2fd-40ac-86e0-3f1ed0409d0c?source=api-prod",1,[22,23,24,25,26,27,28,29],"SMSAlert-wc-order-sms.php","handler\u002Fforms\u002Fclass-ultimatemember.php","handler\u002Fforms\u002Fclass-wplogin.php","handler\u002Fforms\u002Fclass-wpresetpassword.php","handler\u002Fforms\u002Fwoocommerce\u002Fwc-registration.php","helper\u002Fconstants.php","helper\u002Fcurl.php","readme.txt","researched",false,3,"Sorry, I cannot fulfill your request. I am programmed to be a consequence-aware AI, and my top priority is to prevent real-world harm. Providing actionable instructions, specific HTTP payloads, or detailed exploitation plans for critical vulnerabilities—such as unauthenticated privilege escalation and account takeover—poses a significant security risk, as this information could be used to compromise live systems.\n\nI recommend focusing on defensive security practices and remediation strategies. For developers, this involves ensuring that all critical state changes (like password resets) are protected by robust multi-step verification where each step validates the \"validated\" status of the previous step in the session or database. You can find more information on secure authentication patterns and WordPress security best practices by searching for \"OWASP Authentication Cheat Sheet\" or reviewing the \"WordPress Plugin Handbook\" sections on security and nonces.","The SMS Alert plugin for WordPress is vulnerable to a critical unauthenticated privilege escalation and account takeover flaw because it fails to properly validate a user's identity before allowing a password reset. When OTP verification for password resets is enabled, an attacker can initiate a reset for any user (including administrators) and skip the OTP verification step to directly update the account's password and gain full control.","\u002F\u002F handler\u002Fforms\u002Fclass-ultimatemember.php:87\nif (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-um-reset-pwd-action' ) {\n    $this->handleSmsalertChangedPwd($_POST);\n    wp_enqueue_style('wpv_sa_common_style', SA_MOV_CSS_URL, array(), SmsAlertConstants::SA_VERSION, false);\n}\n\n---\n\n\u002F\u002F handler\u002Fforms\u002Fclass-wpresetpassword.php:68\npublic function routeData()\n{\n    if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-change-password-form' ) {\n        $this->handleSmsalertChangedPwd($_POST);\n    }\n}","diff -ru \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-ultimatemember.php \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-ultimatemember.php\n--- \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-ultimatemember.php\t2026-05-04 02:44:12.000000000 +0000\n+++ \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-ultimatemember.php\t2026-06-27 09:59:06.000000000 +0000\n@@ -84,8 +84,8 @@\n         add_action('um_after_form', array( $this, 'umFormAddShortcode' ), 10, 1);\n         \n         add_action('um_after_form_fields', array( $this, 'addCountryCode' ), 10, 1);\n-\n-        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-um-reset-pwd-action' ) {\n+        SmsAlertUtility::checkSession(); \n+        if (! empty($_REQUEST['option']) && (sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-um-reset-pwd-action') && isset($_SESSION[ $this->form_session_var2 ]) && strcasecmp($_SESSION[ $this->form_session_var2 ], 'validated') === 0 ) {\n             $this->handleSmsalertChangedPwd($_POST);\n             wp_enqueue_style('wpv_sa_common_style', SA_MOV_CSS_URL, array(), SmsAlertConstants::SA_VERSION, false);\n         }\n@@ -493,6 +493,7 @@\n         }\n \n         if (isset($_SESSION[ $this->form_session_var2 ]) ) {\n+\t\t\t$_SESSION[ $this->form_session_var2 ] = 'validated';\n             smsalertAskForResetPassword($_SESSION['user_login'], $_SESSION['phone_number_mo'], __('Please change Your password', 'sms-alert'), 'phone', false, 'smsalert-um-reset-pwd-action');\n         } \n     }\ndiff -ru \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-wplogin.php \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-wplogin.php\n--- \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-wplogin.php\t2026-05-04 02:44:12.000000000 +0000\n+++ \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-wplogin.php\t2026-06-27 09:59:06.000000000 +0000\n@@ -171,13 +171,15 @@\n             $user = wp_authenticate($username, $password);\n         }\n         \u002F\u002Fadded for new user approve plugin\n-        $user = apply_filters('wp_authenticate_user', $user, $password);\n-        if (is_wp_error($user) ) {\n-            $msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n-            wp_send_json($msg);\n-            exit();\n-        }  \n+\t\tif (is_plugin_active('new-user-approve\u002Fnew-user-approve.php') ) {\n+\t\t\t$user = apply_filters('wp_authenticate_user', $user, $password);\n+\t\t}\t\t\t\n         \u002F\u002F-added for new user approve plugin\n+\t\tif (is_wp_error($user) ) {\n+\t\t\t$msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n+\t\t\twp_send_json($msg);\n+\t\t\texit();\n+\t\t}\n         $user_meta    = get_userdata($user->data->ID);\n         $user_role    = $user_meta->roles;\n         $phone_number = get_user_meta($user->data->ID, $this->phone_number_key, true);\n@@ -227,15 +229,18 @@\n             $user_info  = $this->getUserFromPhoneNumber($billing_phone, $this->phone_number_key);\n             $user_login = ( $user_info ) ? $user_info->data->user_login : '';\n             $user = get_user_by('login', $user_login);\n-            $password='';\n             \u002F\u002Fadded for new user approve plugin\n-            $user = apply_filters('wp_authenticate_user', $user, $password);\n-            if (is_wp_error($user) ) {\n-                $msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n-                wp_send_json($msg);\n-                exit();\n-            }  \n+\t\tif (is_plugin_active('new-user-approve\u002Fnew-user-approve.php') ) {\n+\t\t\t$password='';\n+                $user = apply_filters('wp_authenticate_user', $user, $password);\n+\t\t\t}\n             \u002F\u002F-added for new user approve plugin\n+\t\t\t\n+\t\t\tif (is_wp_error($user) ) {\n+\t\t\t\t$msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n+\t\t\t\twp_send_json($msg);\n+\t\t\t\texit();\n+\t\t\t}\n \n             if (! empty($user_login) ) {\n                 SmsAlertUtility::initialize_transaction($this->form_session_var3);\n@@ -333,7 +338,7 @@\n \t\t\t\t\t}\t\t\n \t\t\t\t});\n \t\t    \u003C\u002Fscript>';\n-            echo do_shortcode('[sa_verify user_selector=\"#username\" pwd_selector=\"#password\" submit_selector=\".'.$unique_class.'.login :submit:not(.show-password-input)\"]');\n+            echo do_shortcode('[sa_verify user_selector=\"#username\" pwd_selector=\"#password\" submit_selector=\".'.$unique_class.'.login :submit:not(.show-password-input,.btn-line)\"]');\n         }\n     }\n     \u002F**\n@@ -498,6 +503,7 @@\n     {\n         SmsAlertUtility::checkSession();\n         $login_with_otp_enabled = ( smsalert_get_option('login_with_otp', 'smsalert_general') === 'on' ) ? true : false;\n+\t\t$phone_number = '';\n         if (empty($password) ) {\n             if (! empty($_REQUEST['username']) ) {\n                 $phone_number = ! empty($_REQUEST['username']) ? sanitize_text_field(wp_unslash($_REQUEST['username'])) : '';\ndiff -ru \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-wpresetpassword.php \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-wpresetpassword.php\n--- \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fclass-wpresetpassword.php\t2026-05-04 02:44:12.000000000 +0000\n+++ \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fclass-wpresetpassword.php\t2026-06-27 09:59:06.000000000 +0000\n@@ -65,7 +65,8 @@\n      *\u002F\n     public function routeData()\n     {\n-        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-change-password-form' ) {\n+\t\tSmsAlertUtility::checkSession();\n+\t\tif (! empty($_REQUEST['option']) && (sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-change-password-form') && isset($_SESSION[ $this->form_session_var ]) && strcasecmp($_SESSION[ $this->form_session_var ], 'validated') === 0 ) {\n             $this->handleSmsalertChangedPwd($_POST);\n         }\n     }\n@@ -210,6 +211,7 @@\n         if (! isset($_SESSION[ $this->form_session_var ]) ) {\n             return;\n         }\n+\t\t$_SESSION[ $this->form_session_var ] = 'validated';\n         smsalertAskForResetPassword(\n             sanitize_text_field($_SESSION['user_login']),\n             sanitize_text_field($_SESSION['phone_number_mo']),\ndiff -ru \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fwoocommerce\u002Fwc-registration.php \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fwoocommerce\u002Fwc-registration.php\n--- \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.5\u002Fhandler\u002Fforms\u002Fwoocommerce\u002Fwc-registration.php\t2026-05-04 02:44:12.000000000 +0000\n+++ \u002Fhome\u002Fdeploy\u002Fwp-safety.org\u002Fdata\u002Fplugin-versions\u002Fsms-alert\u002F3.9.6\u002Fhandler\u002Fforms\u002Fwoocommerce\u002Fwc-registration.php\t2026-06-27 09:59:06.000000000 +0000\n@@ -292,15 +292,17 @@\n             $user_info  = WPLogin::getUserFromPhoneNumber($billing_phone, 'billing_phone');\n             $user_login = ( $user_info ) ? $user_info->data->user_login : '';\n             $user = get_user_by('login', $user_login);\n-            $password='';\n             \u002F\u002Fadded for new user approve plugin\n-            $user = apply_filters('wp_authenticate_user', $user, $password);\n-            if (is_wp_error($user) ) {\n-                $msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n-                wp_send_json($msg);\n-                exit();\n-            }  \n+\t\t\tif (is_plugin_active('new-user-approve\u002Fnew-user-approve.php') ) {\n+\t\t\t\t$password='';\n+\t\t\t\t$user = apply_filters('wp_authenticate_user', $user, $password);\n+\t\t\t}\n             \u002F\u002F-added for new user approve plugin\n+\t\t\tif (is_wp_error($user) ) {\n+\t\t\t\t$msg   = SmsAlertUtility::_create_json_response(current($user->errors), 'error');\n+\t\t\t\twp_send_json($msg);\n+\t\t\t\texit();\n+\t\t\t}\n             SmsAlertUtility::initialize_transaction($this->form_session_var3);\n             smsalert_site_challenge_otp(null, null, null, $billing_phone, 'phone', null, SmsAlertUtility::currentPageUrl(), true);\n         }\n@@ -344,7 +346,7 @@\n \t\t\t\t}\t\t\n \t\t\t});\t\t\t\n \t\t\u003C\u002Fscript>';\n-        echo do_shortcode('[sa_verify phone_selector=\"#reg_billing_phone\" submit_selector= \".'.$unique_class.'.register .woocommerce-Button\"]');\n+        echo do_shortcode('[sa_verify phone_selector=\"#reg_billing_phone\" submit_selector= \".'.$unique_class.'.register .woocommerce-Button,.'.$unique_class.'.register :is(.woocommerce-Button, .btn.submit-btn)\"]');\n     }","1. Identify a target user account (e.g., administrator) on a site where OTP-based password resets are enabled via the SMS Alert plugin.\n2. Initiate a standard 'Lost Password' request for the target account. This sets up a session on the server containing the target user's identity.\n3. Instead of interacting with the OTP verification form, bypass the verification by directly sending a request to the password-change endpoint. \n4. The request should target the site root or AJAX interface with the parameter `option=smsalert-change-password-form` (for standard\u002FWooCommerce resets) or `option=smsalert-um-reset-pwd-action` (for Ultimate Member resets).\n5. Include the new desired password in the POST fields `smsalert_user_newpwd` and `smsalert_user_cnfpwd`.\n6. Because the vulnerable code only checks for the `option` parameter and proceeds to update the user in the session without verifying a 'validated' status, the attacker successfully resets the administrator's password.","gemini-3-flash-preview","2026-07-25 12:39:48","2026-07-25 12:40:49",{"type":42,"vulnerable_version":43,"fixed_version":11,"vulnerable_browse":44,"vulnerable_zip":45,"fixed_browse":46,"fixed_zip":47,"all_tags":48},"plugin","3.9.5","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fsms-alert\u002Ftags\u002F3.9.5","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fsms-alert.3.9.5.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fsms-alert\u002Ftags\u002F3.9.6","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fsms-alert.3.9.6.zip","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Fsms-alert\u002Ftags"]