
Téléversement arbitraire de fichiers non authentifié dans le plugin EventPrime
Avertissement : Ce dépôt est créé à des fins exclusivement éducatives et de divulgation éthique. La vulnérabilité a été signalée de manière responsable à l'éditeur et corrigée. N'utilisez pas ces informations pour exploiter des systèmes sans autorisation appropriée.
Une vulnérabilité de téléversement arbitraire de fichier non authentifié a été découverte dans le plugin EventPrime pour WordPress (versions <= 4.2.8.1). Ce défaut permet à tout visiteur non authentifié de téléverser des fichiers directement dans le répertoire uploads de WordPress et de créer des enregistrements de pièces jointes dans la médiathèque.
La vulnérabilité existe car un point de terminaison AJAX spécifique est explicitement enregistré avec nopriv (accessible publiquement) et ne comporte ni vérification d'autorisation ni validation appropriée du contenu du fichier. Les attaquants peuvent abuser de ce point de terminaison pour épuiser le stockage, spammer la médiathèque ou potentiellement téléverser des charges malveillantes déguisées en images.
<= 4.2.8.1La cause racine est une combinaison d'un enregistrement de hook AJAX non sécurisé et d'une validation insuffisante des fichiers.
1. Enregistrement non sécurisé du point de terminaison AJAX :
Dans includes/class-eventprime-event-calendar-management.php, le plugin enregistre l'action upload_file_media. Vers la ligne 557, il définit {upload_file_media: true} dans sa carte des actions, où true indique la prise en charge de _nopriv. Par conséquent, le hook gwp_ajax_nopriv_ep_upload_file_media` est enregistré, rendant le point de terminaison accessible à tous.
2. Absence de vérification d'autorisation et de nonce :
La fonction de gestion upload_file_media() (dans includes/class-ep-ajax.php, lignes 1659-1697) n'utilise pas current_user_can() pour vérifier les privilèges de téléversement et ne vérifie pas non plus de nonce de sécurité.
3. Logique de validation défectueuse :
Le gestionnaire ne valide que l'extension du fichier (par exemple, jpg/jpeg/png/gif) en se basant sur le nom de fichier fourni par le client (lignes 1661-1664). Il n'effectue pas de validation robuste du contenu côté serveur (comme getimagesize() ou wp_check_filetype_and_ext()). Cela implique que des scripts malveillants ou d'autres types de fichiers renommés en harmless.jpg seront écrits sur le disque avant que WordPress ne tente de générer les métadonnées.
4. Persistance :
Le fichier est enregistré à l'aide de move_uploaded_file() directement dans wp_upload_dir()['path'] et une pièce jointe WordPress est créée via wp_insert_attachment().
images), cela pourrait conduire à une exécution de code à distance (RCE).1. Préparer la charge utile : Créez un fichier image exemple sur votre machine locale nommé poc.jpg.
2. Exécuter la requête : Envoyez une requête POST multipart/form-data au point de terminaison AJAX public sans aucun cookie de session :
curl -i \
-F "[email protected];filename=poc.jpg" \
"http://TARGET_SITE/wp-admin/admin-ajax.php?action=ep_upload_file_media"
3. Observer la réponse : Le serveur répondra avec un 200 OK et renverra un objet JSON contenant l'ID de pièce jointe nouvellement créé :
{"success":true,"data":{"attachment_id":117}}
4. Vérification :
wp-content/uploads/<year>/<month>/poc.jpg.Pour résoudre cette vulnérabilité, les développeurs doivent :
nopriv si le téléversement est conçu uniquement pour les utilisateurs authentifiés.current_user_can('upload_files') pour garantir que seuls les utilisateurs autorisés et privilégiés peuvent téléverser.check_ajax_referer() pour prévenir les attaques CSRF.wp_handle_upload()) qui effectuent des vérifications plus strictes du type MIME et du contenu.