几周前,我们的威胁情报团队发现了Page Builder中存在的几个漏洞:PageLayer –拖放网站构建器,一个活跃安装在200,000多个站点上的WordPress插件。该插件与wpCentral来自同一创建者,wpCentral 是我们最近在其中发现特权提升漏洞的插件。
一个漏洞使具有订户级及以上权限的任何经过身份验证的用户都能够更新和修改带有恶意内容的帖子,以及其他许多功能。第二个漏洞使攻击者可以代表站点管理员伪造一个请求,以修改插件的设置,从而允许恶意Javascript注入。
我们最初于2020年4月30日与该插件的开发人员联系,并在建立了适当的沟通渠道后,于2020年5月1日提供了完整的披露信息。他们在2020年5月2日迅速做出回应,告知我们他们将开始工作修复。初始补丁发布于2020年5月2日,最佳补丁发布于2020年5月6日。
这些被认为是高级安全问题,可能会导致攻击者擦除您的网站内容或接管您的网站。我们强烈建议您立即将其发布为最新版本,即版本1.1.4。
Wordfence Premium客户于2020年4月30日收到一条新的防火墙规则,以防止针对此漏洞的攻击。免费Wordfence用户将在2020年5月30日的30天后收到此规则。描述:未受保护的AJAX和对存储的跨站点脚本的Nonce披露和恶意修改
受影响的插件:Page Builder:PageLayer –拖放网站构建器 Plugug
Slug:Pagelayer
受影响的版本:<= 1.1.1
CVE ID:一旦标识符为,将更新提供。
CVSS得分:7.4(高)
CVSS向量:CVSS:3.1 / AV:N / AC:L / PR:L / UI:N / S:C / C:L / I:L / A:L
完整版本:1.1 .2
PageLayer是一个非常易于使用的WordPress页面构建器插件,声称可与市场上和WordPress存储库中的几乎所有主题一起使用。它通过使用可添加页面元素(例如按钮,表格,摘录,产品等)的小部件来提供页面的扩展自定义。
我们发现,该插件中几乎所有AJAX操作端点均未包含权限检查。这意味着这些操作可以由网站上经过身份验证的任何人(包括订户级用户)执行。作为标准,这些AJAX端点仅检查是否通过经过身份验证的会话从/ wp-admin发送了请求,而不检查发送请求的用户的功能。
所有这些功能中都使用了随机数检查,但是如果随机数实现不正确,则很容易破坏随机数–例如,如果在站点输出的源代码中显示了可用的随机数。不幸的是,对于PageLayer插件,这正是发生的情况。在先前使用PageLayer插件编辑过的任何页面的源代码的标头部分中,都可以看到可用的随机数。无论是否已登录,任何站点访问者都可以找到此随机数,从而使任何未经身份验证的用户都能够为插件的AJAX操作获取合法的随机数。
可从页面源获取PageLayer随机数。
使用单个随机数作为授权控制机制会导致页面生成器的功能出现各种安全问题,因为这种随机数很容易获得。
WordPress随机数永远不应该用作授权手段,因为如果实施不当或发现漏洞,它们很容易受到损害。WordPress nonce旨在用于CSRF保护,而非授权控制。结合对敏感功能的CSRF保护实施功能检查以进行全面验证,可以提供保护以确保请求来自授权用户。
影响
如前所述,一些AJAX功能受到影响,造成了各种各样的潜在影响。一些最有影响力的行动是wp_ajax_pagelayer_save_content
,wp_ajax_pagelayer_update_site_title
和wp_ajax_pagelayer_save_template
。
add_action('wp_ajax_pagelayer_save_content', 'pagelayer_save_content');
add_action('wp_ajax_pagelayer_update_site_title', 'pagelayer_update_site_title');
add_action('wp_ajax_pagelayer_save_template', 'pagelayer_save_template');
该pagelayer_save_content
功能用于通过页面构建器保存页面数据。缺少此功能的权限检查,无论权限如何,经过身份验证的用户都可以更改使用PageLayer编辑的页面上的任何数据。
function pagelayer_save_content(){ // Some AJAX security check_ajax_referer('pagelayer_ajax', 'pagelayer_nonce'); $content = $_POST['pagelayer_update_content']; $postID = (int) $_GET['postID']; if(empty($postID)){ $msg['error'] = __pl('invalid_post_id'); }
攻击者可能会完全擦除页面,也可能将其想要的任何内容注入网站的页面和帖子中。另外,一些小部件允许注入Javascript,包括“ Button”小部件。“按钮”窗口小部件的文本上没有进行清理,这允许将恶意Javascript用作文本。一旦任何用户浏览到包含该按钮的页面,该Javascript就会执行。
插入了警报JS的PageLayer按钮。
该pagelayer_update_site_title
功能用于更新站点的标题。缺少此功能的权限检查,允许经过身份验证的用户将网站标题更改为他们选择的任何标题。尽管危害较小,但是如果长时间不引起注意,它仍然可能影响您网站的搜索引擎排名。
function pagelayer_update_site_title(){ global $wpdb; // Some AJAX security check_ajax_referer('pagelayer_ajax', 'pagelayer_nonce'); $site_title = $_POST['site_title']; update_option('blogname', $site_title); $wpdb->query("UPDATE `sm_sitemeta` SET meta_value = '".$site_title."' WHERE meta_key = 'site_name'"); wp_die(); }
该pagelayer_save_template
功能用于保存PageLayer主题生成器的PageLayer模板。缺少对此功能的权限检查,使经过身份验证的用户能够创建另存为新帖子的新PageLayer模板。
function pagelayer_save_template() { // Some AJAX security check_ajax_referer('pagelayer_ajax', 'pagelayer_nonce'); $done = []; $post_id = (int) $_GET['postID']; // We need to create the post if(empty($post_id)){ // Get the template type if(empty($_POST['pagelayer_template_type'])){ $done['error'] = __pl('temp_error_type'); pagelayer_json_output($done); } $ret = wp_insert_post([ 'post_title' => $_POST['pagelayer_lib_title'], 'post_type' => 'pagelayer-template', 'post_status' => 'publish', 'comment_status' => 'closed', 'ping_status' => 'closed' ]);
尽管此功能原打算在插件的PRO版本中使用,但该功能仍可以在免费版本中执行,从而影响PageLayer插件的所有200,000多名用户。攻击者可能会创建一个新模板,从而在站点上创建一个新页面,并以与该pagelayer_save_content
功能相同的方式注入恶意Javascript 。
恶意Java脚本可用于注入新的管理用户,重定向站点访问者,甚至利用站点用户的浏览器来破坏其计算机。
补丁
在该插件的最新版本中,开发人员对可能更改站点的所有敏感功能实施了权限检查,并重新配置了该插件,以为WordPress站点的公共和管理区域创建单独的随机数。
// Are you allowed to edit ? if(!pagelayer_user_can_edit($postID)){ $msg['error'][] = __pl('no_permission'); pagelayer_json_output($msg); }
描述:跨站点请求伪造存储的跨站点脚本
受影响的插件:页面构建器:PageLayer –拖放网站构建器
插件Slug:pagelayer
受影响的版本:<= 1.1.1
CVE ID:一旦提供了标识符,将进行更新。
CVSS得分:8.8(高)
CVSS向量:CVSS:3.1 / AV:N / AC:L / PR:N / UI:R / S:U / C:H / I:H / A:H
完整版本:1.1 .2
PageLayer插件注册了一个设置区域,可以在其中进行配置更改。这包括诸如启用编辑器的位置,基本内容设置,基本信息配置等功能。
PageLayer设置区域。
设置更新功能使用功能检查来验证尝试进行任何更改的用户是否具有适当的权限。但是,没有CSRF保护来验证任何尝试更新站点设置的请求的合法性。这使攻击者可以诱骗管理员发送更新任何PageLayer设置的请求。
function pagelayer_settings_page(){ $option_name = 'pl_gen_setting' ; $new_value = ''; if(isset($_REQUEST['pl_gen_setting'])){ $new_value = $_REQUEST['pl_gen_setting']; if ( get_option( $option_name ) !== false ) { // The option already exists, so we just update it. update_option( $option_name, $new_value );
设置区域中的“信息”选项卡为网站所有者提供了一种设置默认地址,电话号码和联系电子邮件地址的方法,每当在页面上使用相应的窗口小部件时,这些地址就会显示。地址或电话号码设置上没有清理,由于管理员的使用能力unfiltered_html
,可以将Javascript插入这些设置中。
PageLayer地址已使用警报JS更新。
影响
这使攻击者能够利用设置中的CSRF漏洞来注入恶意脚本。如果该小部件已经启用,则只要有人浏览到包含该小部件的页面,任何注入的恶意脚本都将执行。如果尚未启用该窗口小部件,则管理员开始编辑并将窗口小部件插入页面后,可执行恶意脚本。与往常一样,这些脚本可以执行诸如创建新的管理帐户并将用户重定向到恶意站点之类的操作。
补丁
在该修补程序的补丁版本中,开发人员实现了CSRF保护,包括WordPress随机数和更新设置时对该随机数的验证。
if(isset($_REQUEST['submit'])){ check_admin_referer('pagelayer-options'); }
PoC演练:pagelayer_save_content
披露时间表
2020年4月24日至2020年4月30日 –初步发现较小的安全漏洞,并对插件进行更深入的安全性分析。
2020年4月30日 –为Wordfence Premium客户发布了防火墙规则。我们与插件的开发团队进行了初步接触。
2020年5月1日 –插件的开发团队确认了适当的收件箱以进行讨论。我们提供完整的披露。
2020年5月2日 –开发人员确认收到并确认他们已开始进行修复。当天发布更新。
2020年5月4日 –我们分析了修复程序,发现了一些未修补的安全问题,并负责地向开发人员披露了这些问题。
2020年5月6日–开发人员发布了最终的足够补丁。
2020年5月30日 –免费的Wordfence用户将收到防火墙规则。
结论
在今天的帖子中,我们详细介绍了与未受保护的AJAX动作和随机数披露相关的一些缺陷,这些缺陷除了使攻击者能够注入恶意Javascript之外,还允许攻击者对网站的页面和帖子进行一些恶意修改。这些漏洞已在1.1.2版中完全修复。我们建议用户立即更新到可用的最新版本,即本出版物发行时的版本1.1.4。
自2020年4月30日以来,运行Wordfence Premium的站点已受到保护,免受此漏洞的攻击。运行免费版本的Wordfence的站点将在2020年5月30日收到此防火墙规则的更新。如果您认识使用此插件的朋友或同事,他们的网站,我们强烈建议将此建议转发给他们,以帮助保护他们的网站。
上文由夏柔提供翻译,原文出自: https://www.wordfence.com/blog/2020/05/high-severity-vulnerabilities-in-pagelayer-plugin-affect-over-200000-wordpress-sites/