2020年3月16日,LearnPress -- WordPress LMS插件(一个具有80,000多个安装的WordPress插件)修复了一个严重性漏洞,该漏洞使订户级用户可以将其权限提升为" LP Instructor"(具有功能的自定义角色)的权限与WordPress的"作者"角色相似,包括能够上传文件和创建包含未过滤HTML的帖子,这两种功能都可以用作允许站点接管的漏洞利用链的一部分。
我们的威胁情报团队分析了该漏洞,以创建防火墙规则来保护Wordfence客户。在此过程中,我们发现了另外两个漏洞。这些漏洞之一与原始漏洞的后果几乎相同,因为它允许攻击者将任何用户的权限提升为" LP Instructor"。另一个允许具有最小权限的登录用户(例如订户)在网站上创建具有任意标题的新页面,并更改任何现有帖子或页面的状态。
我们于2020年3月17日第二天向插件作者私下披露了这些漏洞,并迅速收到了回复。但是,不幸的是,超过一个月没有发布任何补丁。我们在2020年4月16日跟进了该插件的作者,在未收到任何回复后,与WordPress插件团队联系。几个小时后,插件开发者重新联系并通知我们补丁正在开发中。经过充分修补的版本最终于2020年4月22日发布。
我们强烈建议立即更新到3.2.6.9版,因为这些安全问题已在该版本中得到了全面修补。
Wordfence Premium用户于2020年3月16日收到一条新的防火墙规则,以防止针对原始漏洞和新发现的漏洞的攻击。免费Wordfence用户于2020年4月15日收到此规则。
说明 :
受影响的 特权升级插件:LearnPress
插件插件 :学习的
受影响版本 :<3.2.6.9
CVE ID :CVE-2020-11511
CVSS Vecto :CVSS:3.0 / AV:N / AC:L / PR:N / UI:N / S:U / C:H / I:L / A:L / E:P / RL:O / RC:C
CVSS得分 :8.6(高)补丁
版本 :3.2.6.9
LearnPress是一个WordPress插件,允许站点所有者创建一个在线学习门户,其中包括将用户分配为能够向站点添加自己的课程资料的" LP讲师"的功能。每当用户请求成为一名讲师时,该插件的一项功能便会向管理员发送电子邮件,从而允许该管理员通过单击链接批准请求。处理此请求的功能会在插件加载后自动运行,因此始终会"监听"特定参数:
function learn_press_accept_become_a_teacher() {
$action = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
$user_id = ! empty( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : '';
if ( ! $action || ! $user_id || ( $action != 'accept-to-be-teacher' ) ) {
return;
}
if ( ! learn_press_user_maybe_is_a_teacher( $user_id ) ) {
$be_teacher = new WP_User( $user_id );
$be_teacher->set_role( LP_TEACHER_ROLE );
delete_transient( 'learn_press_become_teacher_sent_' . $user_id );
do_action( 'learn_press_user_become_a_teacher', $user_id );
$redirect = add_query_arg( 'become-a-teacher-accepted', 'yes' );
$redirect = remove_query_arg( 'action', $redirect );
wp_redirect( $redirect );
}
}
add_action( 'plugins_loaded', 'learn_press_accept_become_a_teacher' );
由于添加了此功能的方式,攻击者可能会将action
参数设置为accept-to-be-teacher
,将user_id
参数设置为用户的ID的请求发送到wp-admin中的任何有效位置,以授予教师特权。这意味着即使未经身份验证的攻击者也可以发送wp-admin/admin-post.php
包含这些参数的请求,并提升他们选择的用户的权限,尽管他们需要自己的用户ID才能充分利用此漏洞。
授予用户LP Instructor
角色后,他们就可以创建新的帖子,课程,课程和测验。此外,LP Instructor
还授予用户通常仅保留给编辑者和管理员的unfiltered_html
功能:该功能允许他们将自定义代码插入他们创建的任何页面中。借助此功能,攻击者可以轻松地将恶意JavaScript插入他们创建的任何帖子中,然后如果登录的管理员查看了其中一个帖子,则可以将其用于将访客重定向到恶意网站,甚至可以用于站点接管。
说明 :
受 认证的页面创建和状态修改受影响的插件:LearnPress
插件插件 :learningpress
受影响的版本 :<3.2.6.9
CVE ID :CVE-2020-11510
CVSS矢量 :CVSS:3.0 / AV:N / AC:L / PR:L / UI:N / S:U / C:N / I:L / A:H / E:F / RL:U / RC:C
CVSS评分 :7.1(高)
修补版本 :3.2.6.9
LearnPress插件还通过AJAX操作处理了多个任务,这些任务缺少随机数检查和功能检查。它会循环注册AJAX动作,尽管其中许多功能至少使用了功能检查:
$ajaxEvents = array(
'create_page' => false,
'plugin_action' => false,
'modal_search_items' => false,
'dismiss_notice' => false,
'search_users' => false,
'load_chart' => false,
'search_course_category' => false,
/////////////
//'be_teacher' => false,
'custom_stats' => false,
'ignore_setting_up' => false,
'get_page_permalink' => false,
'dummy_image' => false,
'update_add_on_status' => false,
//'plugin_install' => false,
'bundle_activate_add_ons' => false,
'install_sample_data' => false,
// Remove Notice
'remove_notice_popup' => false,
// Update order status
'update_order_status' => false,
);
foreach ( $ajaxEvents as $ajaxEvent => $nopriv ) {
add_action( 'wp_ajax_learnpress_' . $ajaxEvent, array( __CLASS__, $ajaxEvent ) );
一种操作update_order_status
旨在允许管理员将LearnPress订单标记为已付款或已退款。不幸的是,该功能接受了任何帖子ID和任何状态,甚至不存在任何ID。因此,它是可能的攻击者将请求发送到wp-admin/admin-ajax.php
与所述action
参数集learnpress_update_order_status
,所述order_id
集到邮政ID来修改,并且value
参数设置为所期望的后状态。这将使攻击者可以发布或删除任何现有的帖子或页面,甚至将其设置为不存在的状态,此时,该帖子或页面将不再出现在网站上,也无法通过wp-admin访问,并且只能通过修改它在数据库中的状态。
public static function update_order_status() {
$order_id = learn_press_get_request( 'order_id' );
$value = learn_press_get_request( 'value' );
$order = array(
'ID' => $order_id,
'post_status' => $value,
);
wp_update_post( $order ) ? $response['success'] = true : $response['success'] = false;
learn_press_send_json( $response );
die();
}
另一个易受攻击的操作称为函数,create_page
该函数旨在在设置向导中使用,以便创建LearnPress需要起作用的默认页面。这意味着攻击者可以发送请求wp-admin/admin-ajax.php
与action
参数集learnpress_create_page
和page_name
参数设置为自己选择的值。
public static function create_page() {
$page_name = ! empty( $_REQUEST['page_name'] ) ? $_REQUEST['page_name'] : '';
$response = array();
if ( $page_name ) {
if ( $page_id = LP_Helper::create_page( $page_name ) ) {
$response['page'] = get_post( $page_id );
$html = learn_press_pages_dropdown( '', '', array( 'echo' => false ) );
preg_match_all( '!value=\"([0-9]+)\"!', $html, $matches );
$response['positions'] = $matches[1];
$response['html'] = '<a href="' . get_edit_post_link( $page_id ) . '" target="_blank">' . __( 'Edit Page', 'learnpress' ) . '</a> ';
$response['html'] .= '<a href="' . get_permalink( $page_id ) . '" target="_blank">' . __( 'View Page', 'learnpress' ) . '</a>';
} else {
$response['error'] = __( 'Error! Page creation failed. Please try again.', 'learnpress' );
}
} else {
$response['error'] = __( 'Empty page name!', 'learnpress' );
}
learn_press_send_json( $response );
}
尽管不那么严重,但此漏洞仍将允许攻击者发布标题中带有垃圾邮件链接的页面,并将其用作恶意SEO活动的一部分。
披露时间表
2020 年3月16日 -- Wordfence威胁情报在分析最近修补的漏洞时,在LearnPress插件中发现了未修补的漏洞。为Wordfence Premium用户发布的防火墙规则。最初与插件开发人员联系。
2020 年3月17日 --插件开发人员确认适当的收件箱以进行讨论。已发送漏洞的完整披露。
2020 年4月15日 --免费Wordfence用户可以使用防火墙规则。
2020 年4月16日 --插件开发者的后续行动(尚未解决的问题)。
2020 年4月20日 --我们就此问题与WordPress插件小组联系,并在不久后收到了插件开发人员的回复。
2020年4月22日 --已发布足够补丁的版本。
结论
在本文中,我们详细介绍了LearnPress插件中的两个漏洞,其中包括特权提升漏洞以及帖子创建和修改漏洞。这些缺陷已在3.2.6.9版中完全修复,我们敦促用户尽快更新到最新的可用版本。自2020年3月16日起,运行Wordfence Premium的网站已受到保护,免受这些漏洞的侵害;自2020年4月15日以来,仍处于免费版本的Wordfence中的网站已受到保护。如果您当前以学生身份使用运行LearnPress的网站,请转发此信息向网站管理员咨询。