2020年4月1日,Wordfence威胁情报团队在MapPress Maps for WordPress中发现了两个漏洞,这是一个WordPress插件,安装量超过80,000。插件的免费版和专业版中均存在一个允许存储跨站点脚本(XSS)的漏洞,而专业版中则存在允许远程代码执行(RCE)的更为严重的漏洞。
我们于2020年4月2日第二天联系了插件的作者,并在几个小时内收到了回复。数小时内发布了MapPress Free和MapPress Pro的补丁版本。我们强烈建议尽快将免费版和专业版都更新到最新版本2.54.2。
Wordfence Premium用户于2020年4月2日收到一条新的防火墙规则,以防止针对这些漏洞的攻击。仍在使用免费版本的Wordfence用户将在2020年5月2日的30天后收到该规则。
描述 :经过身份验证的地图创建/删除,导致存储的跨站点脚本(XSS)
受影响的插件 :适用于WordPress
插件Slug的 MapPress Maps:mappress-google-maps-for-wordpress
受影响的版本 :<= 2.53.8 Free and Pro
CVE ID : CVE-2020-12077
CVSS得分 :6.5(中)
CVSS向量 :CVSS:3.0 / AV:N / AC:L / PR:L / UI:R / S:C / C:L / I:L / A:L
全面修补的版本:2.53.9
WordPress的MapPress Maps允许网站所有者使用Google Maps API和开源Leaflet引擎在其网站上添加自定义地图。此插件的免费版和专业版都注册了AJAX操作,这些操作称为缺少功能检查和随机数检查的函数。受影响的AJAX挂钩:
Description: Authenticated Map Creation/Deletion Leading to Stored Cross-Site Scripting (XSS)
Affected Plugin: MapPress Maps for WordPress
Plugin Slug: mappress-google-maps-for-wordpress
Affected Versions: <=2.53.8 Free and Pro
CVE ID: CVE-2020-12077
CVSS Score: 6.5(Medium)
CVSS Vector: CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
Fully Patched Version: 2.53.9
因此,有可能对已登录的攻击者具有最小的权限,诸如订户,通过发送添加包含恶意的JavaScript为任意的文章或网页的地图$_POST
请求至wp-admin/admin-ajax.php
与该action
参数集mapp_save
,所述postid
参数集的将地图添加到的post,以及map
包含表示要添加地图的JSON数据的参数。恶意JavaScript可能会添加到title
和body
保存的地图中"兴趣点"的参数,只要站点的访问者单击表示该兴趣点(POI)的映射图钉,就会执行该参数。或者,如果启用了"显示每个地图的POI列表"的全局设置,则在访问带有受影响地图的页面时将立即执行JavaScript。
此漏洞可能使站点访问者重定向到恶意站点,甚至可以通过添加恶意管理用户来使用管理员会话来接管站点。
脆弱的功能:
可替代地,攻击者可以通过发送一个删除现有地图$_POST
请求至wp-admin/admin-ajax.php
与该action
参数集mapp_delete
和所述mapid
地图中删除的参数。尽管这样做的影响力要小得多,但攻击者仍可以使用它删除站点上的任何原始地图,从而可能促使管理员调查并触发插入到恶意地图中的脚本。
脆弱的功能:
static function ajax_delete() {
ob_start();
$mapid = (isset($_POST['mapid'])) ? $_POST['mapid'] : null;
$result = Mappress_Map::delete($mapid);
if (!$result)
Mappress::ajax_response("Internal error when deleting map ID '$mapid'!");
do_action('mappress_map_delete', $mapid); // Use for your own developments
Mappress::ajax_response('OK', array('mapid' => $mapid));
}
描述 :导致RCE或站点重置的经过身份验证的文件上传,删除和披露
受影响的插件 :WordPress
插件Slug的 MapPress地图:mappress-google-maps-for-wordpress
受影响的版本 :<= 2.53.8 Pro
CVE ID :CVE-2020 -12077
CVSS得分 :9.9(严重)
CVSS向量 :CVSS:3.0 / AV:N / AC:L / PR:L / UI:N / S:C / C:H / I:H / A:H
完整版本:2.53.9
MapPress插件的专业版提供了创建控制地图显示方式的模板的功能。它将这些模板另存为自定义.php文件。不幸的是,该插件注册了多个AJAX操作,这些操作在没有功能检查或随机数检查的情况下调用了函数:
add_action('wp_ajax_mapp_tpl_get', array(__CLASS__, 'ajax_get'));
add_action('wp_ajax_mapp_tpl_save', array(__CLASS__, 'ajax_save'));
add_action('wp_ajax_mapp_tpl_delete', array(__CLASS__, 'ajax_delete'));
请注意,尽管其中一些功能的名称与上一个漏洞中的功能相同,但它们位于另一个文件中并且属于不同的类。包含此易受攻击代码的文件在MapPress插件的免费版和专业版中均存在,但仅在专业版中有效。
因此,经过身份验证的攻击者可能以最小的权限上载可执行的PHP文件,例如后门或Webshell。这很容易导致完整的站点接管,因为具有后门访问权限的攻击者随后可以修改站点上的任何文件,上传其他文件或连接到数据库并插入管理用户。
攻击者可以通过向发送$_POST
请求wp-admin/admin-ajax.php
,将action
参数设置为mapp_tpl_save
,将name
参数设置为他们要创建的文件的基本名称,并将content
参数设置为可执行的PHP代码,来利用此漏洞。然后将创建此文件,并可以从当前活动主题的目录中执行该文件,从而导致远程执行代码。
脆弱的功能:
static function ajax_save() { $name = (isset($_POST['name'])) ? $_POST['name'] : null; $content = (isset($_POST['content'])) ? stripslashes($_POST['content']) : null; $filepath = get_stylesheet_directory() . '/' . $name . '.php'; $result = @file_put_contents($filepath, $content); if ($result === false) Mappress::ajax_response('Unable to save'); // Return filepath after save Mappress::ajax_response('OK', $filepath); }
经过身份验证的攻击者还可以通过向发送$_POST
请求wp-admin/admin-ajax.php
,并将action
参数设置为mapp_tpl_delete
,并将name
参数设置为要删除的文件的基本名称,来删除站点上任何现有的PHP文件。
例如,可以使用删除wp-config.php
目录遍历攻击,将name
参数设置为../../../wp-config
。这将导致站点被重置,这时攻击者可以通过从头进行设置并将其连接到远程托管的恶意数据库来控制该站点。
脆弱的功能:
static function ajax_delete() { $name = (isset($_POST['name'])) ? $_POST['name'] : null; $filepath = get_stylesheet_directory() . '/' . $name . '.php'; $result = @unlink($filepath); if ($result === false) Mappress::ajax_response('Unable to delete'); Mappress::ajax_response('OK'); }
最后,经过身份验证的攻击者可以通过发送查看网站上的任何现有的PHP文件的内容$_GET
要求wp-admin/admin-ajax.php
与action
参数集mapp_tpl_get
,以及name
文件的参数透露。例如,要查看的内容wp-config.php
,攻击者可以将name
参数设置为../../../../wp-config
。这可能使攻击者可以确定站点的数据库凭据。如果站点的数据库允许远程访问,则攻击者可以使用它来添加管理用户或对数据库进行任何其他所需的更改,直到并包括删除站点的几乎所有内容。
脆弱的功能:
static function ajax_get() {
$name = (isset($_GET['name'])) ? $_GET['name'] : null;
$filename = $name . '.php';
$filepath = get_stylesheet_directory() . '/' . $filename;
$html = @file_get_contents($filepath);
$standard = @file_get_contents(Mappress::$basedir . "/templates/$filename");
if (!$standard)
Mappress::ajax_response('Invalid template');
$template = new Mappress_Template(array(
'name' => $name,
'content' => ($html) ? $html : $standard,
'path' => $filepath,
'standard' => $standard,
'exists' => ($html) ? true : false
));
Mappress::ajax_response('OK', $template);
}
披露时间表
2020 年4月1日 -- Wordfence威胁情报发现并分析漏洞。
2020 年4月2日 --为Wordfence Premium用户发布了防火墙规则。与插件开发人员的初步联系。开发人员在一天结束之前发布补丁。
2020 年5月2日 --免费Wordfence用户可以使用防火墙规则。
结论
在今天的帖子中,我们详细介绍了MapPress Maps for WordPress插件中的两个漏洞,包括存储的跨站点脚本(XSS)和更严重的远程代码执行(RCE),文件泄露和文件删除漏洞。这些漏洞已在2.53.9版中进行了全面修补,我们强烈建议该插件的所有用户立即升级到最新版本。自2020年4月2日以来,运行Wordfence Premium的站点已受到保护,免受这些漏洞的影响。仍在运行免费版Wordfence的站点将在2020年5月1日收到防火墙规则更新。
特别感谢MapMap Maps for WordPress插件的开发人员Chris Richardson,他对我们的披露进行了非常快速和专业的处理。在开发人员收到漏洞披露的同一天修补漏洞是一种示例性的响应。