
Аутентифицированный IDOR / Нарушенный контроль доступа в плагине Tutor LMS
Отказ от ответственности: Этот репозиторий создан только в образовательных целях и для этичного раскрытия информации. Уязвимость была ответственно сообщена вендору и исправлена. Не используйте эту информацию для эксплуатации систем без соответствующих полномочий.
Уязвимость небезопасной прямой ссылки на объект (IDOR) / нарушенного контроля доступа была обнаружена в плагине Tutor LMS для WordPress (версии <= 3.9.5). Эта ошибка позволяет пользователю с низкими привилегиями и ролью Tutor Instructor выполнять несанкционированные массовые действия, такие как изменение статуса публикации или окончательное удаление курсов, принадлежащих другим инструкторам или администраторам.
Перехватывая легитимный серверный запрос и изменяя параметр ID курса, злоумышленник может обойти предусмотренные механизмы контроля доступа. В реальных сценариях это позволяет злоумышленникам саботировать курсы конкурентов на маркетплейсе с несколькими инструкторами, вызывая прямые сбои в работе, потерю дохода и репутационный ущерб.
<= 3.9.53.9.6Корень проблемы заключается в отсутствии проверок авторизации на уровне объектов в обработчике массовых действий плагина.
Файл: tutor/classes/Course_List.php
Функция: course_list_bulk_action()
1. Непроверенные идентификаторы объектов:
Функция принимает управляемые пользователем входные данные (bulk-action и bulk-ids) непосредственно из HTTP-запроса. Хотя плагин проверяет, что у пользователя есть общая возможность управлять курсами, он совершенно не проверяет принадлежность курсов, соответствующих конкретным ID, переданным в массиве bulk-ids.
2. Выполнение без проверки принадлежности:
Когда запускается путь обновления статуса (update_course_status()) или путь удаления (bulk_delete_course()), код перебирает предоставленные злоумышленником ID. Он выполняет операции с базой данных (например, обновление cp_posts.post_status) с использованием предложения WHERE ID IN (...) без добавления условия, гарантирующего $post_author == $current_user_id.
Поскольку обработчик не обеспечивает авторизацию на уровне объектов, любой инструктор с доступом к рабочему процессу массовых действий может манипулировать произвольными ID курсов.
Следующие шаги демонстрируют, как аутентифицированный инструктор Tutor может изменить статус курса другого инструктора.
course_id, принадлежащий другому инструктору (жертве) (например, ID: 27)./wp-admin/admin.php?page=tutor). Выберите любой курс, которым вы владеете, выберите действие по изменению статуса (например, «черновик») и нажмите «Применить».POST-запрос к /wp-admin/admin-ajax.php.status на trash (или pending, private).id с вашего ID курса на ID курса жертвы (27).{"success":true}. Курс жертвы успешно перемещается в корзину и исчезает из публичной части сайта.