5月6日,我们的威胁情报团队收到了有关Elementor Pro中存在的零日漏洞的警报,Elementor Pro是一个安装在大约100万个站点上的WordPress插件。该漏洞已与Ultimateorons for Elementor中发现的另一个漏洞一起被利用,该插件安装在大约110,000个站点上,是一个WordPress插件。
我们立即发布了防火墙规则以保护Wordfence Premium用户,并就此漏洞与Elementor联系。在积极利用此漏洞的同时,我们还向社区公开通知了该漏洞,以帮助保护用户免遭入侵。
在我们在Wordfence博客上发布公告的同一天,Elementor迅速发布了Elementor Pro的更新。在今天的帖子中,我们提供了这两个漏洞的技术细节,并仔细研究了这两个漏洞如何一起使用这些插件来危害WordPress网站。
我们敦促尚未更新这些插件最新版本的网站所有者立即进行更新。对于Elementor Pro,它是2.9.4版,在Elementor的Ultimate Addons中,是1.24.2版。
Elementor的终极插件
说明:
受影响的 注册绕行插件:适用于Elementor
插件的Ultimate 插件:适用于Ultimate -elementor的
版本: <= 1.24.1
CVE ID:CVE-2020-13125
CVSS得分: 7.2(高)
CVSS矢量:CVSS:3.0 / AV:N / AC:L / PR:N / UI:N / S:C / C:L / I:L / A:N
完整版本: 1.24.2
适用于Elementor的Ultimate Addons是Brainstorm Force制作的插件。它是Elementor的扩展,提供了许多其他可与Elementor一起使用的小部件。
其中一个小部件将一个称为“用户注册表单”的注册表单添加到任何页面。这是一个易于自定义的注册表格,可以将其放置在网站上的任何位置。不幸的是,此表单的功能存在缺陷,即使禁用了注册,并且即使站点上未积极使用表单小部件,也允许用户进行注册。
是否启用了用户注册?
开发人员同时注册了与该get_form_data
功能相关的nopriv和常规AJAX操作,以便为“用户注册表单”小部件提供功能。
public function __construct() { parent::__construct(); add_action( 'wp_ajax_uael_register_user', array( $this, 'get_form_data' ) ); add_action( 'wp_ajax_nopriv_uael_register_user', array( $this, 'get_form_data' ) ); add_filter( 'wp_new_user_notification_email', array( $this, 'custom_wp_new_user_notification_email' ), 10, 3 );
深入研究该get_form_data
功能,我们发现它是为检索注册表格中提交的信息而设计的。然后,使用这些数据通过WordPress wp_insert_user
挂钩在网站上创建新用户。该功能中没有任何地方可以验证是否在站点上启用了用户注册,也没有进行任何替代性检查来验证注册表单窗口小部件是否处于活动状态。
/** * Get Form Data via AJAX call. * * @since 1.18.0 * @access public */ public function get_form_data() { check_ajax_referer( 'uael-form-nonce', 'nonce' ); $data = array(); $error = array(); $response = array(); if ( isset( $_POST['data'] ) ) { $data = $_POST['data'];
*请注意,为简洁起见,省略了几行。
$user_args = apply_filters( 'uael_register_insert_user_args', array( 'user_login' => isset( $user_login ) ? $user_login : '', 'user_pass' => isset( $user_pass ) ? $user_pass : '', 'user_email' => isset( $user_email ) ? $user_email : '', 'first_name' => isset( $first_name ) ? $first_name : '', 'last_name' => isset( $last_name ) ? $last_name : '', 'user_registered' => gmdate( 'Y-m-d H:i:s' ), 'role' => isset( $user_role ) ? $user_role : '', ) ); $result = wp_insert_user( $user_args );
这些遗漏的检查使攻击者可以绕过WordPress网站上的用户注册设置。幸运的是,Brainstorm Force在最新版本中添加了检查功能,以验证用户注册已启用并且小部件处于活动状态。
/** * Get Form Data via AJAX call. * * @since 1.18.0 * @access public */ public function get_form_data() { check_ajax_referer( 'uael-form-nonce', 'nonce' ); $data = array(); $error = array(); $response = array(); $allow_register = get_option( 'users_can_register' ); $is_widget_active = UAEL_Helper::is_widget_active( 'RegistrationForm' ); if ( isset( $_POST['data'] ) && '1' === $allow_register && true === $is_widget_active ) { $data = $_POST['data'];
始终显示注册编号
尽管随机数主要用于缓解CSRF攻击并验证请求的合法性,但在这种情况下,如果函数包含小的缺陷(即,随机数无法被攻击者发现),它们也可以充当故障保护。
该get_form_data
功能确实使用了可能会阻止流氓用户注册的随机数验证。但是,我们发现form_nonce在启用了Elementor UA UA的页面的源代码中始终可见,即使页面上没有表单也是如此。
/** * Setup Actions Filters. * * @since 0.0.1 */ private function setup_actions_filters() { add_shortcode( 'uael-template', array( $this, 'uael_template_shortcode' ) ); add_action( 'elementor/init', array( $this, 'elementor_init' ) ); add_action( 'elementor/elements/categories_registered', array( $this, 'widget_category' ) ); add_action( 'elementor/frontend/after_register_scripts', array( $this, 'register_widget_scripts' ) );
*请注意,为简洁起见,省略了几行。
wp_localize_script( 'jquery', 'uaelRegistration', array( 'invalid_mail' => __( 'Enter valid Email!', 'uael' ), 'pass_unmatch' => __( 'The specified password do not match!', 'uael' ), 'required' => __( 'This Field is required!', 'uael' ), 'form_nonce' => wp_create_nonce( 'uael-form-nonce' ), 'incorrect_password' => __( 'Error: The Password you have entered is incorrect.', 'uael' ), 'invalid_username' => __( 'Unknown username. Check again or try your email address.', 'uael' ), 'invalid_email' => __( 'Unknown email address. Check again or try your username.', 'uael' ), ) ); }
这意味着攻击者只需要在运行此插件的网站上抓取页面的源代码var uaelRegistration
。如果该站点的任何页面上至少有一个正在使用的小部件,则将授予它们一个可用的随机数以在该站点上注册。
在启用了UAE小部件的页面源代码中查看可发现的UAE随机数。
漏洞利用
这些缺陷加在一起,使攻击者有可能在任何易受攻击的站点上注册为订户,并有可能使用该访问来透视和利用要求订户级别访问的漏洞。这正是我们在Elementor Pro漏洞中看到的利用。
特别感谢Ramuel Gall为该漏洞所做的研究。
Elementor Pro
说明:
受认证的任意文件上传受影响的插件:Elementor Pro
插件插件:elementor-pro
受影响的版本: <= 2.9.3
CVE ID:CVE-2020-13126
CVSS得分:9.9(严重)
CVSS矢量:CVSS:3.0 / AV:N / AC:L / PR:L / UI:N / S:C / C:H / I:H / A:H
完整版本:2.9.4
Elementor是一个受欢迎的WordPress页面构建器插件,目前已安装在超过500万个WordPress网站上。专业版增加了其他增强功能,例如可以上传自定义图标和字体。它还添加了50多个其他小部件,以改善页面构建过程以及增强的可定制性。
当插件引入了上传文件的功能时,无论文件类型如何,都应始终包括适当的控制措施,以防止未经授权的用户上传文件或绕过网站上建立的任何文件过滤器或特权。
不幸的是,Elementor Pro中的“自定义图标”上传功能没有采取适当的措施。攻击者发现了一种有效的方法,绕过了可以上传哪种文件类型的限制,并且一旦通过身份验证,他们便能够上传PHP文件,例如webshell和后门。
缺少权限检查
Elementor Pro注册了一个用于触发图标上传功能的AJAX端点。AJAX操作和上载功能均未进行任何权限检查,从而使任何经过身份验证的用户(包括权限最小的用户)都能够触发该功能并上载.zip文件。
public function register_ajax_actions( Ajax $ajax ) { $ajax->register_ajax_action( 'pro_assets_manager_custom_icon_upload', [ $this, 'custom_icons_upload_handler' ] );
幸运的是,该插件的修补版本对custom_icons_upload_handler
功能进行了权限检查,该功能可以阻止低级别用户上传文件。
public function custom_icons_upload_handler( $data ) { if ( ! current_user_can( Icons_Manager::CAPABILITY ) ) { return new \WP_Error( Exceptions::FORBIDDEN, 'Access denied.' ); }
未经检查的上传
看来,自定义图标上载功能旨在仅允许从Fontello,IcoMoon或Fontastic图标创建站点创建的.zip文件。它通过检查.zip文件中包含的文件并验证与从受信任图标源生成的文件对齐的文件来做到这一点。但是,该插件从不检查这些.zip文件中是否包含任何其他文件。
$supported_icon_sets = self::get_supported_icon_sets(); foreach ( $supported_icon_sets as $key => $handler ) { /** * @var IconSets\Icon_Set_Base $icon_set_handler */ $icon_set_handler = new $handler( $results['directory'] ); if ( ! $icon_set_handler ) { continue; } if ( ! $icon_set_handler->is_valid() ) { continue;
这使攻击者可以绕过插件施加的限制,将恶意文件包含在受信任的.zip文件中。这包括.php文件。
可发现的随机数
有对功能的现时检查,但就像我们在终极Firefox的插件为Elementor插件所看到的,现时是很容易发现的,由于被列入var elementorCommonConfig
为“ajax”
所有行政仪表板页面的页面的源代码。
仔细查看在/ wp-admin的页面源代码中发现的Elementor Pro nonce。
攻击者可以通过在认证时通过刮擦/ wp-admin仪表板的页面源来找到可用的随机数。然后可以将其用作合法的Elementor AJAX随机数,以执行易受攻击的操作并上载精心制作的.zip文件。
漏洞利用
这三个缺陷使攻击者可以通过创建Fontello,IcoMoon或Fontastic图标.zip文件,提取该文件,将其选择的任意文件注入文件夹,重新压缩.zip文件并上传来上传任意文件。通过AJAX操作访问网站。
上载的.zip文件将解压缩到/wp-content/upload/elementor/custom-icon
新生成的文件夹中的目录中。如果站点所有者以前未上传任何自定义图标,则恶意文件将位于/ -1文件夹中。如果以前有上传的自定义图标文件,则该目录可能已经是一个不同的数字,例如/ -5,并且攻击者将需要使用蛮力才能找到将其恶意有效内容提取到的目录。
攻击者可以通过直接转到文件来访问任何新上传的文件,例如Webshell:
如果上传的文件是.php文件,则访问时也会执行该代码。这样就可以进行远程代码执行(RCE),并最终完全破坏了WordPress网站和托管环境。
Elementor Pro的披露时间表
2020年5月5日 – Wordfence通知了Ultimateorons for Elementor中最近修复的漏洞。在同一通知中,提到了Elementor Pro可能存在一个“错误”,导致目录中存在恶意文件/custom-icons
。我们开始研究Elementor Pro,以确定是否存在安全漏洞。我们得出的结论是,存在一个经过身份验证的任意文件上传漏洞。
2020年5月5日 –我们迅速为高级客户提供了防火墙规则,以防御Elementor Pro中发现的漏洞。
2020年5月5日 –我们与Elementor的团队联系,以提醒他们该漏洞的存在。
2020年5月5日 –托管公司向我们提供了日志文件,确认该文件正在被积极利用。
2020年5月6日 –我们发布了一条公共服务公告,其中包含有限的详细信息,以通知用户如何保护自己的网站,直到有可用的补丁为止。
2020年5月6日 – Elementor发布了Elementor Pro补丁。
2020年6月4日 –免费使用Wordfence的用户会收到防火墙规则。