
IDOR autenticado / Control de acceso roto en el plugin Tutor LMS
Aviso: Este repositorio se crea solo con fines educativos y divulgación ética. La vulnerabilidad ha sido reportada de manera responsable al proveedor y ya ha sido parcheada. No utilice esta información para explotar sistemas sin la debida autorización.
Se descubrió una vulnerabilidad de Referencia directa insegura a objetos (IDOR) / Control de acceso roto en el plugin Tutor LMS para WordPress (versiones <= 3.9.5). Esta falla permite que un usuario con pocos privilegios y con el rol de Instructor Tutor realice acciones masivas no autorizadas, como cambiar el estado de publicación o eliminar permanentemente cursos propiedad de otros instructores o administradores.
Al interceptar una solicitud legítima del backend y manipular el parámetro de ID del curso, un atacante puede eludir los controles de acceso previstos. En un escenario real, esto permite que actores malintencionados saboteen cursos de la competencia en un mercado multiinstructor, lo que provoca interrupción directa del negocio, pérdida de ingresos y daños a la reputación.
<= 3.9.53.9.6El problema principal se origina por la falta de comprobaciones de autorización a nivel de objeto dentro del manejador de acciones masivas del plugin.
Archivo: tutor/classes/Course_List.php
Función: course_list_bulk_action()
1. Identificadores de objeto sin validar:
La función acepta entradas controladas por el usuario (bulk-action y bulk-ids) directamente desde la solicitud HTTP. Aunque el plugin verifica que el usuario posee una capacidad general para gestionar cursos, no comprueba en absoluto la propiedad de cada curso para los IDs específicos proporcionados en el array bulk-ids.
2. Ejecución sin verificación de propiedad:
Cuando se activa la ruta de actualización de estado (update_course_status()) o la ruta de eliminación (bulk_delete_course()), el código itera sobre los IDs proporcionados por el atacante. Ejecuta operaciones de base de datos (por ejemplo, actualizar cp_posts.post_status) usando una cláusula WHERE ID IN (...) sin añadir una condición que garantice $post_author == $current_user_id.
Debido a que el manejador no aplica autorización a nivel de objeto, cualquier instructor con acceso al flujo de acciones masivas puede manipular IDs de cursos arbitrarios.
Los siguientes pasos demuestran cómo un Instructor Tutor autenticado puede cambiar el estado del curso de otro instructor.
course_id objetivo que pertenece a otro instructor (Víctima). (Por ejemplo, ID: 27)./wp-admin/admin.php?page=tutor). Seleccione cualquier curso propio, elija una acción de cambio de estado (por ejemplo, establecer como "borrador") y haga clic en "Aplicar".POST saliente hacia /wp-admin/admin-ajax.php.status a trash (o pending, private).id de su ID de curso al ID de curso de la Víctima (27).{"success":true}. El curso de la víctima se mueve correctamente a la papelera y desaparece del frontend público.