2020年3月12日,我们的威胁情报团队在Widget Settings Importer / Exporter(一个安装了40,000多个WordPress插件)中发现了一个存储的跨站脚本(XSS)漏洞。此缺陷使经过身份验证的攻击者具有最小的订户级别权限,可以将包含任意JavaScript的自定义窗口小部件导入并激活到安装了插件的网站中。
我们在2020年3月12日当天与插件供应商联系,但尚未收到回复。2020年3月20日,我们与WordPress插件小组联系,并向他们发送了漏洞的全部披露信息,在2020年4月13日与他们进行跟进后,该插件已从WordPress存储库中删除。由于目前没有可用的补丁程序,我们强烈建议停用并删除此插件。
Wordfence Premium用户于2020年3月12日收到一条新的防火墙规则,以防止针对这些漏洞的攻击。免费Wordfence用户于2020年4月11日收到此规则。
说明 :受认证的存储的跨站点脚本(XSS)
受影响的插件 :窗口小部件设置导入器/导出器
插件段 :窗口小部件设置-importexport
受影响的版本 :<= 1.5.3
CVE ID :待处理的
CVSS得分 :7.4(高)
CVSS矢量 :CVSS :3.0 / AV:N / AC:L / PR:L / UI:N / S:C / C:L / I:L / A:L
完整版本 :N / A
窗口小部件设置导入器/导出器是一个WordPress插件,提供了导入和导出WordPress窗口小部件的功能-- WordPress功能可为网站的页眉,侧边栏和页脚添加功能。该插件注册了用于执行窗口小部件导入的AJAX操作:
add_action( 'wp_ajax_import_widget_data', array( __CLASS__, 'ajax_import_widget_data' ) );
与许多类似漏洞一样,AJAX操作调用的函数无法使用功能检查或随机数检查。这意味着任何经过身份验证的用户,无论其权限如何,都可以使用它将小部件导入网站,包括包含恶意JavaScript的小部件,这些小部件将在该网站的任何访问者的浏览器中执行。
具体来说,该ajax_import_widget_data
函数通过调用file_get_contents
提供的import_file
参数来获取要导入的小部件数据。大多数站点都配置有设置,该设置allow_url_fopen
允许该功能获取远程托管文件的内容。这样,攻击者可以通过向发送$_POST
请求wp-admin/admin-ajax.php
,将action
参数设置为import_widget_data
,将import_file
参数设置为精心制作的远程托管JSON文件的URL并将widgets
参数设置为描述小部件的请求,从而将恶意小部件导入网站。被导入。
如果clear_current
设置了该参数,则站点上任何当前活动的窗口小部件也将被删除。如果导入的窗口小部件包含恶意JavaScript,则可以将其用于将网站访问者重定向到恶意网站,甚至窃取管理员的会话,有可能导致网站接管。
脆弱的功能:
public static function ajax_import_widget_data() {
$response = array(
'what' => 'widget_import_export',
'action' => 'import_submit'
);
$widgets = isset( $_POST['widgets'] ) ? $_POST['widgets'] : false;
$import_file = isset( $_POST['import_file'] ) ? $_POST['import_file'] : false;
if( empty($widgets) || empty($import_file) ){
$response['id'] = new WP_Error('import_widget_data', 'No widget data posted to import');
$response = new WP_Ajax_Response( $response );
$response->send();
}
$clear_current = isset( $_POST['clear_current'] );
if ( $clear_current )
self::clear_widgets();
$json_data = file_get_contents( $import_file );
$json_data = json_decode( $json_data, true );
$sidebar_data = $json_data[0];
$widget_data = $json_data[1];
foreach ( $sidebar_data as $title => $sidebar ) {
$count = count( $sidebar );
for ( $i = 0; $i < $count; $i++ ) {
$widget = array( );
$widget['type'] = trim( substr( $sidebar[$i], 0, strrpos( $sidebar[$i], '-' ) ) );
$widget['type-index'] = trim( substr( $sidebar[$i], strrpos( $sidebar[$i], '-' ) + 1 ) );
if ( !isset( $widgets[$widget['type']][$widget['type-index']] ) ) {
unset( $sidebar_data[$title][$i] );
}
}
$sidebar_data[$title] = array_values( $sidebar_data[$title] );
}
foreach ( $widgets as $widget_title => $widget_value ) {
foreach ( $widget_value as $widget_key => $widget_value ) {
$widgets[$widget_title][$widget_key] = $widget_data[$widget_title][$widget_key];
}
}
$sidebar_data = array( array_filter( $sidebar_data ), $widgets );
$response['id'] = ( self::parse_import_data( $sidebar_data ) ) ? true : new WP_Error( 'widget_import_submit', 'Unknown Error' );
$response = new WP_Ajax_Response( $response );
$response->send();
}
我该怎么办?
该插件可能不会被打补丁,因此我们强烈建议您停用此插件并将其从您的站点中删除。可以使用具有类似功能的插件,例如Widget Importer&Exporter,并且应该相当安全,尽管应该将停用和删除所有未使用的插件视为最佳做法。
披露时间表
2020 年3月12日 --最初发现并分析了漏洞。为Wordfence Premium用户发布的防火墙规则。最初与插件供应商的联系。
2020 年3月20日 --我们与WordPress插件小组联系,并向他们提供完整的披露信息。
2020 年4月11日 --免费使用Wordfence的用户会收到防火墙规则。
2020 年4月13日 --我们跟进WordPress插件小组,该插件已从WordPress存储库中删除。
2020 年4月15日 -- 30天后漏洞被披露,插件供应商未对此做出回应。
结论
在今天的帖子中,我们在Widget Settings Importer / Exporter WordPress插件中详细描述了一个存储的跨站点脚本(XSS)漏洞。这些缺陷尚未修复,因此我们建议用户立即停用并删除此插件,直到提供补丁为止。自2020年3月12日以来,运行Wordfence Premium的站点已受到保护,免受此漏洞的攻击。运行免费版Wordfence的站点在2020年4月11日收到了防火墙规则更新。