Le 19 juin 2023, l’équipe Wordfence Threat Intelligence a identifié et lancé le processus de divulgation responsable d’une vulnérabilité de téléchargement arbitraire de fichiers dans Plugin d’enregistrement d’utilisateur de WPeverest, qui est activement installé sur plus de 60 000 sites Web WordPress. Cette vulnérabilité permet à un attaquant authentifié disposant d’autorisations minimales, tel qu’un abonné, de télécharger des fichiers arbitraires, y compris des fichiers PHP, et d’exécuter du code à distance sur le serveur d’un site vulnérable.

Wordfence Premium, Soins des motset Réponse Wordfence les utilisateurs ont reçu une règle de pare-feu pour se protéger contre tout exploit ciblant cette vulnérabilité le 20 juin 2023. Les sites utilisant encore la version gratuite de Wordfence recevront la même protection le 20 juillet 2023.

Nous avons contacté WPeverest le 19 juin 2023 et avons reçu une réponse le jour même. Après avoir fourni tous les détails de la divulgation, le développeur a publié le premier correctif, qui ne résolvait pas entièrement la vulnérabilité, dans la version 3.0.2 le 29 juin 2023. Une version entièrement corrigée, 3.0.2.1, a été publiée le 4 juillet 2023. Nous tenons à féliciter l’équipe de développement de WPeverest pour sa réponse rapide et son correctif rapide.

Nous exhortons les utilisateurs à mettre à jour leurs sites avec la dernière version corrigée de l’enregistrement des utilisateurs, qui est la version 3.0.2.1 au moment de la rédaction de cet article, dès que possible.

Résumé des vulnérabilités de Wordfence Intelligence

Le plug-in d’enregistrement des utilisateurs pour WordPress est vulnérable aux téléchargements de fichiers arbitraires en raison d’une clé de cryptage codée en dur et d’une validation de type de fichier manquante sur la fonction ‘ur_upload_profile_pic’ dans les versions jusqu’à 3.0.2 incluses. Cela permet aux attaquants authentifiés avec des capacités de niveau abonné ou supérieur de télécharger des fichiers arbitraires sur le serveur du site affecté, ce qui peut rendre possible l’exécution de code à distance. Cela a été partiellement corrigé dans la version 3.0.2 et entièrement corrigé dans la version 3.0.2.1.

Analyse technique

Le plug-in d’inscription des utilisateurs fournit un générateur de formulaire d’inscription polyvalent par glisser-déposer, avec des champs personnalisés et des options de personnalisation illimitées. Il fournit également un formulaire de connexion. Une fois connecté, il fournit aux utilisateurs un profil qui permet différents types de personnalisation, y compris le téléchargement d’une photo de profil.

L’examen du code révèle que le plugin utilise deux fonctions distinctes pour définir l’image de profil. La première fonction AJAX télécharge l’image de profil dans un dossier temporaire, et la deuxième demande déplace le fichier et définit l’image de profil pour l’utilisateur.

Le profile_pic_upload() La fonction utilise une solution de téléchargement d’image générique, qui vérifie l’extension du fichier, puis télécharge l’image dans le dossier temporaire. La partie intéressante est que les données du fichier téléchargé sont cryptées dans la réponse AJAX :

if ( move_uploaded_file( $upload['tmp_name'], $file_path ) ) {
	$files = array(
		'file_name'      => $file_name,
		'file_path'      => $file_path,
		'file_extension' => $file_extension,
	);

	$attachment_id = wp_rand();

	ur_clean_tmp_files();
	$url = UR_UPLOAD_URL . 'temp-uploads/' . sanitize_file_name( $file_name );
	wp_send_json_success(
		array(
			'attachment_id' => $attachment_id,
			'upload_files'  => crypt_the_string( maybe_serialize( $files ), 'e' ),
			'url'           => $url,
		)
	);
}

Réponse JSON après le téléchargement du fichier dans la fonction profile_pic_upload()

Le crypté upload_files les données dans la réponse ressemblent à ceci :

Le chiffrement est utilisé en raison de la façon dont le plug-in gère les téléchargements, car les données chiffrées sont déchiffrées et utilisées pour déterminer le nom de fichier et le chemin d’accès où le fichier est enregistré pour l’utilisateur. Cependant, pour que les données soient chiffrées et déchiffrées, une clé de chiffrement est requise. En règle générale, les clés de chiffrement doivent être confidentielles et propres à chaque site Web.

/**
 * Encrypt/Decrypt the provided string.
 * Encrypt while setting token and updating to database, decrypt while comparing the stored token.
 *
 * @param  string $string String to encrypt/decrypt.
 * @param  string $action Encrypt/decrypt action. 'e' for encrypt and 'd' for decrypt.
 * @return string Encrypted/Decrypted string.
 */
function crypt_the_string( $string, $action = 'e' ) {
	$secret_key = 'ur_secret_key';
	$secret_iv  = 'ur_secret_iv';

	$output         = false;
	$encrypt_method = 'AES-256-CBC';
	$key            = hash( 'sha256', $secret_key );
	$iv             = substr( hash( 'sha256', $secret_iv ), 0, 16 );

	if ( 'e' == $action ) {
		if ( function_exists( 'openssl_encrypt' ) ) {
			$output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
		} else {
			$output = base64_encode( $string );
		}
	} elseif ( 'd' == $action ) {
		if ( function_exists( 'openssl_decrypt' ) ) {
			$output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
		} else {
			$output = base64_decode( $string );
		}
	}

	return $output;
}

Nous avons malheureusement constaté que la clé de chiffrement est codée en dur dans les versions vulnérables du plugin dans le crypt_the_string() fonction, ce qui signifie que les acteurs de la menace avaient également accès à la clé qui n’était pas unique par installation WordPress. Cela permet aux attaquants de créer une charge utile de tableau de données de fichiers téléchargés qui peut être utilisée pour modifier le nom de fichier, le chemin et l’extension lors de l’enregistrement de l’image de profil.

Le plugin appelle la fonction ur_upload_profile_pic() lors de l’enregistrement du profil, qui contient le code suivant :

$upload = maybe_unserialize( crypt_the_string( $upload_file, 'd' ) );
if ( isset( $upload['file_name'] ) && isset( $upload['file_path'] ) && isset( $upload['file_extension'] ) ) {
	$upload_path = $upload_path . '/';
	$file_name   = wp_unique_filename( $upload_path, $upload['file_name'] );
	$file_path   = $upload_path . sanitize_file_name( $file_name );
	// Check the type of file. We'll use this as the 'post_mime_type'.
	$filetype = wp_check_filetype( basename( $file_name ), null );
	$moved    = rename( $upload['file_path'], $file_path );

	if ( $moved ) {
		$attachment_id = wp_insert_attachment(
			array(
				'guid'           => $file_path,
				'post_mime_type' => $filetype['type'],
				'post_title'     => preg_replace( '/\.[^.]+$/', '', sanitize_file_name( $file_name ) ),
				'post_content'   => '',
				'post_status'    => 'inherit',
			),
			$file_path
		);

		if ( ! is_wp_error( $attachment_id ) ) {
			include_once ABSPATH . 'wp-admin/includes/image.php';

			// Generate and save the attachment metas into the database.
			wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file_path ) );
		}
	}
}

Renommez et déplacez le fichier dans la fonction ur_upload_profile_pic()

La fonction décrypte les données de fichier cryptées, qui sont spécifiées dans la demande de sauvegarde. Sur la base de ces données, le fichier dans le dossier temporaire est déplacé et renommé à l’aide de la rename() fonction php. Malheureusement, cependant, il n’y a pas de vérification du type de fichier avant, ce qui signifie que le fichier image peut être renommé en un fichier avec n’importe quel type d’extension, tel que .php, .phtml, .html, etc.

Exploitez les possibilités

L’exploitation de la vulnérabilité nécessite plusieurs étapes complexes, car deux fonctions et requêtes distinctes doivent être utilisées pour télécharger et déplacer le fichier :

  • Enregistrer un utilisateur
  • Connectez-vous en tant qu’utilisateur (puisqu’il est uniquement possible de télécharger une photo de profil pour l’utilisateur)
  • Télécharger le fichier image malveillant exploit.png
  • Récupérer les données du fichier chiffré à partir de la réponse
  • Décrypter les données du fichier
  • Modifiez l’extension de fichier en php dans le nom du fichier
  • Crypter les données du fichier
  • Enregistrez le profil avec les données de fichier cryptées et modifiées

Puisqu’il n’est possible de télécharger un fichier image que pendant le processus de téléchargement, car son extension est vérifiée, la première étape consiste à télécharger un fichier nommé, par exemple, exploit.png en tant qu’image de profil avec la requête suivante :

Dans ce scénario, l’attaquant télécharge un fichier exploit.png, qui est en fait un script PHP, mais avec une extension .png :

<?php
echo 'md5("exploit"): ' . md5( 'exploit' );

La réponse sera une charge utile JSON contenant le résultat chiffré renvoyé par le profile_pic_upload() fonction. Le paramètre ‘upload_files’ doit être déchiffré à l’aide de la clé codée en dur, qui renverra un tableau sérialisé, semblable à ceci :

L’attaquant changerait alors le nom du fichier exploit.png en exploit.php et chiffrerait à nouveau le tableau. Le résultat nouvellement crypté peut ensuite être utilisé lors de l’enregistrement du profil dans la requête suivante :

L’exploit renomme le fichier image en php et le déplace dans le dossier des images de profil.

Le processus d’exploit complet ressemble à ceci :

Pare-feu Wordfence

Le graphique suivant montre les étapes d’exploitation qu’un attaquant pourrait suivre et à quel point le pare-feu Wordfence empêcherait un attaquant d’exploiter avec succès la vulnérabilité.

Calendrier de divulgation

19 juin 2023 – Découverte de la vulnérabilité Arbitrary File Upload dans User Registration.
19 juin 2023 – Nous prenons contact avec le fournisseur du plugin en lui demandant de confirmer la boîte de réception pour gérer la discussion.
19 juin 2023 – Le fournisseur confirme la boîte de réception pour le traitement de la discussion.
19 juin 2023 – Nous envoyons les détails complets de la divulgation. Le fournisseur accuse réception du rapport et commence à travailler sur un correctif.
20 juin 2023Wordfence Premium, Se soucieret Réponse les utilisateurs reçoivent une règle de pare-feu pour fournir une protection contre tout exploit susceptible de cibler cette vulnérabilité.
29 juin 2023 – Un correctif partiel est publié dans la version 3.0.2.
4 juillet 2023 – Une version entièrement corrigée du plugin, 3.0.2.1, est publiée.
20 juillet 2023 – Les utilisateurs de Wordfence Free bénéficient de la même protection.

Conclusion

Dans cet article de blog, nous avons détaillé une vulnérabilité de téléchargement arbitraire de fichiers dans le Plugin d’enregistrement d’utilisateur affectant les versions 3.0.2 et antérieures. Cette vulnérabilité permet aux pirates authentifiés disposant d’autorisations de niveau abonné ou supérieur de télécharger des fichiers arbitraires, y compris des portes dérobées PHP, et d’exécuter ces fichiers sur le serveur. La vulnérabilité a été entièrement corrigée dans la version 3.0.2.1 du plugin.

Nous encourageons les utilisateurs de WordPress à vérifier que leurs sites sont mis à jour avec la dernière version corrigée de l’enregistrement des utilisateurs.

Wordfence Premium, Soins des motset Réponse Wordfence les utilisateurs ont reçu une règle de pare-feu pour se protéger contre tout exploit ciblant cette vulnérabilité le 20 juin 2023. Les sites utilisant encore la version gratuite de Wordfence recevront la même protection le 20 juillet 2023.

Si vous connaissez quelqu’un qui utilise ce plugin sur son site, nous vous recommandons de partager cet avis avec lui pour garantir la sécurité de son site, car cette vulnérabilité présente un risque important.

Pour les chercheurs en sécurité qui cherchent à divulguer des vulnérabilités de manière responsable et à obtenir un ID CVE, vous pouvez soumettez vos découvertes à Wordfence Intelligence et potentiellement gagner une place sur notre classement.


Source link