Le 4 mars, notre équipe Threat Intelligence a découvert plusieurs vulnérabilités dans Popup Builder, un plugin WordPress installé sur plus de 100 000 sites. Une vulnérabilité a permis à un attaquant non authentifié d’injecter du JavaScript malveillant dans n’importe quel popup publié, qui serait ensuite exécuté à chaque chargement du popup. L’autre vulnérabilité a permis à tout utilisateur connecté, même à ceux disposant d’autorisations minimales telles qu’un abonné, d’exporter une liste de tous les abonnés à la newsletter, d’exporter les informations de configuration du système et de s’accorder l’accès aux diverses fonctionnalités du plugin.

Nous avons divulgué ces problèmes en privé à l’auteur du plugin, qui a répondu en quelques heures. Nous avons travaillé avec le développeur au cours d’une semaine pour nous assurer que les vulnérabilités étaient entièrement corrigées.

Nous vous recommandons vivement de mettre immédiatement à jour la dernière version, 3.64.1. Les clients Wordfence Premium ont reçu une nouvelle règle de pare-feu le 5 mars 2020 pour se protéger contre les exploits ciblant ces vulnérabilités. Les utilisateurs de Wordfence gratuits recevront la règle après trente jours, le 4 avril 2020.


La description: Scriptage intersite stocké non authentifié (XSS)
Plugin concerné: Popup Builder – Réactif WordPress Pop up – Abonnement & Newsletter
Plugin Slug: popup-builder
Versions concernées: <= 3,63
ID CVE: CVE-2020-10196
Score CVSS: 8,3 (élevé)
Vecteur CVSS: CVSS: 3.0 / AV: N / AC: L / PR: N / UI: N / S: C / C: L / I: L / A: L
Version entièrement corrigée: 3.64.1

Le plugin Popup Builder permet la création de divers popups sur un site WordPress, qui inclut la possibilité d’exécuter du Javascript personnalisé quand un popup est chargé. Il a enregistré un hook AJAX, wp_ajax_nopriv_sgpb_autosave, destiné à permettre l’enregistrement automatique des projets de popups.

add_action('wp_ajax_nopriv_sgpb_autosave', array($this, 'sgpbAutosave'));

Malheureusement, ce crochet était disponible pour les utilisateurs non privilégiés, et la fonction qu’il appelait manquait de vérifications de nonce ou de vérification des capacités. Cela signifiait qu’un attaquant non authentifié pouvait envoyer une requête POST à ​​wp-admin / admin-ajax.php avec un paramètre de tableau, ‘allPopupData’, contenant un certain nombre de paires clé-valeur, y compris un ID de popup (visible dans la source de la page) et une charge utile JavaScript malveillante, qui serait ensuite enregistrée dans les paramètres de cette fenêtre contextuelle et exécutée chaque fois qu’un visiteur accède à une page où la fenêtre contextuelle est affichée.

	public function sgpbAutosave()
	{
		$popupId = @(int)$_POST['post_ID'];
		$postStatus = get_post_status($popupId);
		if ($postStatus == 'publish') {
			echo '';
			wp_die();
		}

		if (!isset($_POST['allPopupData'])) {
			echo true;
			wp_die();
		}
		$popupData = SGPopup::parsePopupDataFromData($_POST['allPopupData']);
		do_action('save_post_popupbuilder');
		$popupType = $popupData['sgpb-type'];
		$popupClassName = SGPopup::getPopupClassNameFormType($popupType);
		$popupClassPath = SGPopup::getPopupTypeClassPath($popupType);
		if (file_exists($popupClassPath.$popupClassName.'.php')) {
			require_once($popupClassPath.$popupClassName.'.php');
			$popupClassName = __NAMESPACE__.'\'.$popupClassName;
			$popupClassName::create($popupData, '_preview', 1);
		}

		wp_die();
	}

Notez l’absence de nonce et de vérification des autorisations dans cette fonction. La fonction tente d’empêcher l’enregistrement des modifications dans une fenêtre contextuelle à l’état «publier». Cependant, si aucun paramètre «post_ID» n’est fourni, cette vérification sera contournée et l’ID de message fourni dans le paramètre «allPopupData» sera mis à jour à la place.

En règle générale, les attaquants utilisent une vulnérabilité comme celle-ci pour rediriger les visiteurs du site vers des sites malveillants ou voler des informations sensibles de leurs navigateurs, bien qu’elle puisse également être utilisée pour la prise de contrôle du site si un administrateur a visité ou prévisualisé une page contenant la fenêtre contextuelle infectée lors de sa connexion.


La description: Modification des paramètres authentifiés, divulgation de la configuration et exportation des données utilisateur
Plugin concerné: Popup Builder – Réactif WordPress Pop up – Abonnement & Newsletter
Plugin Slug: popup-builder
Versions concernées: <= 3,63
ID CVE: CVE-2020-10195
Score CVSS: 6,3 (moyen)
Vecteur CVSS: CVSS: 3.0 / AV: N / AC: L / PR: L / UI: N / S: U / C: L / I: L / A: L
Version entièrement corrigée: 3.64.1

En plus d’une vulnérabilité XSS stockée, Popup Builder avait également un ensemble de vulnérabilités qui pourraient être exploitées par des utilisateurs connectés avec des autorisations minimales, telles que des abonnés. Les actions vulnérables comprenaient:

add_action('admin_post_csv_file', array($this, 'getSubscribersCsvFile'));
add_action('admin_post_sgpb_system_info', array($this, 'getSystemInfoFile'));
add_action('admin_post_sgpbSaveSettings', array($this, 'saveSettings'), 10, 1);

En envoyant une demande $ _POST à ​​admin-post.php avec le paramètre «action» défini sur «sgpbSaveSettings» et «sgpb-user-roles[] »Paramètre défini sur » abonné « , un attaquant pourrait accorder à tous les utilisateurs de niveau abonné (y compris eux-mêmes) un certain nombre d’autorisations liées à la fonctionnalité du plug-in. En plus d’accorder l’accès pour créer et gérer des catégories et des newsletters, cela permettrait à un attaquant d’utiliser d’autres fonctions AJAX qui étaient protégé par des nonces, mais pas par des vérifications de capacité, car des nonces utilisables étaient affichés sur ces pages.

Le code de fonction vulnérable:

	public function saveSettings()
	{
		$postData = $_POST;
		$deleteData = 0;

		if (isset($postData['sgpb-dont-delete-data'])) {
			$deleteData = 1;
		}
		$userRoles = @$postData['sgpb-user-roles'];

		update_option('sgpb-user-roles', $userRoles);
		update_option('sgpb-dont-delete-data', $deleteData);

		wp_redirect(admin_url().'edit.php?post_type='.SG_POPUP_POST_TYPE.'&page='.SG_POPUP_SETTINGS_PAGE);
	}

Alternativement, une requête $ _POST pourrait être envoyée à admin-post.php avec le paramètre «action» réglé sur «csv_file», permettant d’exporter une liste des abonnés à la newsletter. En conséquence, un attaquant pourrait accéder à des informations sensibles sur les abonnés à la newsletter et les utiliser lors d’une attaque d’ingénierie sociale contre ces abonnés.

Le code de fonction vulnérable:

	public function getSubscribersCsvFile()
	{
		global $wpdb;
		$query = AdminHelper::subscribersRelatedQuery();
		if (isset($_GET['orderby']) && !empty($_GET['orderby'])) {
			if (isset($_GET['order']) && !empty($_GET['order'])) {
				$query .= ' ORDER BY '.esc_sql($_GET['orderby']).' '.esc_sql($_GET['order']);
			}
		}
		$content = '';
		$exportTypeQuery = '';
		$rows = array('first name', 'last name', 'email', 'date', 'popup');
		foreach ($rows as $value) {
			$content .= $value;
			if ($value != 'popup') {
				$content .= ',';
			}
		}
		$content .= "n";
		$subscribers = $wpdb->get_results($query, ARRAY_A);

		$subscribers = apply_filters('sgpbSubscribersCsv', $subscribers);

		foreach($subscribers as $values) {
			foreach ($values as $key => $value) {
				$content .= $value;
				if ($key != 'subscriptionTitle') {
					$content .= ',';
				}
			}
			$content .= "n";
		}

		$content = apply_filters('sgpbSubscribersContent', $content);

		header('Pragma: public');
		header('Expires: 0');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		header('Cache-Control: private', false);
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename=subscribersList.csv;');
		header('Content-Transfer-Encoding: binary');
		echo $content;
	}

De plus, le paramètre «action» pourrait être changé en «sgpb_system_info» et révéler des informations de configuration système potentiellement sensibles, y compris tous les plugins installés et leur état d’activation. Ces données pourraient être utilisées par un attaquant pour créer une attaque plus sophistiquée contre un site cible. Si un autre plugin vulnérable était installé sur le site, un attaquant pourrait le découvrir et tenter d’intensifier son attaque en l’exploitant.

Le code de fonction vulnérable:

	public function getSystemInfoFile()
	{
		$content = AdminHelper::getSystemInfoText();

		header('Pragma: public');
		header('Expires: 0');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		header('Cache-Control: private', false);
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename=popupBuilderSystemInfo.txt;');
		header('Content-Transfer-Encoding: binary');

		echo $content;
	}

Calendrier de divulgation

4 mars 2020 – Wordfence Threat Intelligence découvre et analyse les vulnérabilités du plugin Popup Builder.
5 mars 2020 – Règle de pare-feu publiée pour les utilisateurs de Wordfence Premium. Ouverture initiale au vendeur de plugins. Le fournisseur du plugin répond en quelques heures et nous envoyons le rapport de vulnérabilité complet.
6 mars 2020 – Le fournisseur du plugin nous envoie la version corrigée pour examen. Conseils supplémentaires fournis pour renforcer la sécurité.
11 mars 2020 – Version entièrement corrigée publiée.
4 avril 2020 – Règle de pare-feu disponible pour les utilisateurs gratuits.

Conclusion

Dans la publication d’aujourd’hui, nous avons détaillé plusieurs vulnérabilités, notamment le stockage XSS non authentifié, la modification des paramètres, la divulgation de la configuration et l’exportation des données utilisateur trouvées dans le plug-in Popup Builder. Ces failles ont été corrigées dans la version 3.64.1 et nous recommandons aux utilisateurs de mettre à jour vers la dernière version disponible immédiatement. Bien que nous n’ayons détecté aucune activité malveillante ciblant Popup Builder, la vulnérabilité XSS stockée peut avoir un impact sérieux sur les visiteurs du site et même permettre la prise de contrôle du site. Sites en cours d’exécution Wordfence Premium sont protégés des attaques contre ces vulnérabilités depuis le 5 mars 2020. Les sites exécutant la version gratuite de Wordfence recevront la même mise à jour des règles de pare-feu le 4 avril 2020.


Source link