🎁 Wordfence vient de lancer son[ » bugbountyprogram= » »>bug bounty program. Through December 20th 2023, all researchers will earn 6.25x our normal bounty rates when Wordfence handles responsible disclosure for our Holiday Bug Extravaganza! Register as a researcher and submit your vulnerabilities today!🎁


On November 24, 2023, the Wordfence Threat Intelligence team identified and began the responsible disclosure process for an Unauthenticated Arbitrary File Upload vulnerability in MW WP Form plugin, which is actively installed on more than 200,000 WordPress websites. This vulnerability makes it possible for an unauthenticated attacker to upload arbitrary files, including PHP files, and achieve remote code execution on a vulnerable site’s server when the “Saving inquiry data in database” option in the form settings is enabled.

All Wordfence PremiumWordfence Care, and Wordfence Response customers, as well as those still using the free version of our plugin, are protected against any exploits targeting this vulnerability by the Wordfence firewall’s built-in Malicious File Upload protection.

We contacted the Web-Soudan Team on November 24, 2023, and received a response the same day. After providing full disclosure details, the developer released a patch on November 29, 2023. We would like to commend The Web-Soudan Team for their prompt response and timely patch.

We urge users to update their sites with the latest patched version of MW WP Form, which is version 5.0.2 at the time of this writing, as soon as possible.

Vulnerability Summary from Wordfence Intelligence

The MW WP Form plugin for WordPress is vulnerable to arbitrary file uploads due to insufficient file type validation in the ‘_single_file_upload’ function in versions up to, and including, 5.0.1. This makes it possible for unauthenticated attackers to upload arbitrary files on the affected site’s server which may make remote code execution possible.

Technical Analysis

The MW WP Form plugin provides a shortcode-based form builder, with many customizable fields and many useful form options. Files can also be uploaded to the form with the [mwform_file name="file"] champ de code court.

L'examen du code révèle que le plugin utilise le _single_file_upload() fonctionner dans le MW_WP_Form_File classe pour télécharger un fichier, et le check_file_type() fonctionner dans le MWF_Functions La classe est utilisée pour vérifier le type de fichier.

class MWF_Functions {
/**
 * Return true when correct file type.
 *
 * @param string $filepath Uploaded file path.
 * @param string $filename File name.
 * @return bool
 */
public static function check_file_type( $filepath, $filename = '' ) {
	if ( ! file_exists( $filepath ) ) {
		return false;
	}

	// File type restricted by WordPress (get_allowed_mime_types)
	if ( $filename ) {
		$wp_check_filetype = wp_check_filetype( $filename );
	} else {
		$wp_check_filetype = wp_check_filetype( $filepath );
	}
	if ( empty( $wp_check_filetype['type'] ) ) {
		return false;
	}

Il s’agit d’une fonction de vérification de type de fichier tout à fait courante et sûre qui utilise la fonction principale de WordPress.

class MW_WP_Form_File {
protected function _single_file_upload( $form_id, $name, $file ) {
	if ( empty( $file['tmp_name'] ) ) {
		return false;
	}

	$error = $file['error'];

	try {
		if ( UPLOAD_ERR_OK !== $error && UPLOAD_ERR_NO_FILE !== $error ||
			! MWF_Functions::check_file_type( $file['tmp_name'], $file['name'] ) ) {
			if ( UPLOAD_ERR_INI_SIZE === $error || UPLOAD_ERR_FORM_SIZE === $error ) {
				throw new \RuntimeException( '[MW WP Form] File size of the uploaded file is too large.' );
			}
			throw new \RuntimeException( '[MW WP Form] An error occurred during file upload.' );
		}
	} catch ( \Exception $e ) {
		error_log( $e->getMessage() );
	}

	try {
		$new_user_file_dir = MW_WP_Form_Directory::generate_user_file_dirpath( $form_id, $name );
		if ( ! wp_mkdir_p( $new_user_file_dir ) ) {
			throw new \RuntimeException( '[MW WP Form] Creation of a temporary directory for file upload failed.' );
		}
	} catch ( \Exception $e ) {
		error_log( $e->getMessage() );
	}

	MW_WP_Form_Directory::do_empty( $new_user_file_dir, true );

	$filename = sanitize_file_name( sprintf( '%1$s-%2$s', $name, $file['name'] ) );
	$filepath = MW_WP_Form_Directory::generate_user_filepath( $form_id, $name, $filename );

	try {
		if ( ! move_uploaded_file( $file['tmp_name'], $filepath ) ) {
			throw new \RuntimeException( '[MW WP Form] There was an error saving the uploaded file.' );
		}
	} catch ( \Exception $e ) {
		error_log( $e->getMessage() );
	}

	return $filename;
}

La fonction de téléchargement vérifie le fichier puis le copie sur le serveur avec le move_uploaded_file() fonction. Le fichier n'est stocké sur le serveur que si l'option « Enregistrement des données de demande dans la base de données » est sélectionnée dans les paramètres du formulaire. Dans le cas contraire, le fichier est immédiatement supprimé après l'envoi du formulaire.

Malheureusement, bien que la fonction de vérification du type de fichier fonctionne parfaitement et renvoie false pour les types de fichiers dangereux, elle génère une exception d'exécution dans le bloc try si un type de fichier non autorisé est téléchargé, qui sera intercepté et géré par le bloc catch. Le bloc catch utilise uniquement le error_log() fonction pour enregistrer l’erreur sans interrompre le téléchargement. Cela signifie que même si le type de fichier dangereux est vérifié et détecté, il est uniquement enregistré, tandis que la fonction continue de s'exécuter et que le fichier est téléchargé. Cela signifie que les attaquants pourraient télécharger des fichiers PHP arbitraires, puis accéder à ces fichiers pour déclencher leur exécution sur le serveur, réalisant ainsi l'exécution de code à distance.

Nous attirons une fois de plus l'attention sur le fait que la vulnérabilité n'affecte de manière critique que les utilisateurs qui ont activé l'option « Enregistrement des données de demande dans la base de données » dans les paramètres du formulaire, car le plugin enregistre uniquement les fichiers dans cette configuration.

Chronologie de la divulgation

24 novembre 2023 – Découverte de la vulnérabilité Arbitrary File Upload dans MW WP Form.
24 novembre 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.
24 novembre 2023 – Le vendeur confirme la boîte de réception pour gérer la discussion.
24 novembre 2023 – Nous envoyons les détails complets de la divulgation. Le fournisseur accuse réception du rapport et commence à travailler sur un correctif.
29 novembre 2023 – Une version entièrement corrigée du plugin, 5.0.2, est publiée.

Conclusion

Dans cet article de blog, nous avons détaillé une vulnérabilité de téléchargement arbitraire de fichiers dans le Plugin de formulaire MW WP affectant les versions 5.0.1 et antérieures. Cette vulnérabilité permet à des acteurs malveillants non authentifiés 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 5.0.2 du plugin.

Nous encourageons les utilisateurs de WordPress à vérifier que leurs sites sont mis à jour avec la dernière version corrigée de MW WP Form.

Tous les utilisateurs de Wordfence, y compris ceux qui utilisent Wordfence Premium, Entretien de la clôture des motset Réponse de Wordfenceainsi que les sites exécutant toujours la version gratuite de Wordfence, sont entièrement protégés contre cette vulnérabilité.

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.

Saviez-vous que Wordfence a un Programme de prime aux bogues? Nous avons récemment multiplié nos primes par 6,25 jusqu'au 20 décembre 2023, nos primes pour les vulnérabilités les plus critiques atteignant 10 000 $ USD ! Si vous êtes un chercheur en vulnérabilité en herbe ou actuel, Cliquez ici pour vous inscrire.


Source link