Téléversement de fichier arbitraire authentifié menant à l'exécution de code à distance — Analyse technique et reproduction contrôlée de CVE-2026-38526 dans Webkul Krayin CRM 2.2.x.
Téléversement arbitraire de fichiers authentifié menant à l'exécution de code à distance — Analyse technique et reproduction contrôlée de CVE-2026-38526 dans Webkul Krayin CRM 2.2.x.
CVE-2026-38526 est une vulnérabilité de téléversement arbitraire de fichiers authentifié affectant Webkul Krayin CRM 2.2.x.
La fonctionnalité vulnérable est exposée via le point de terminaison de téléversement TinyMCE de l'application :
POST /admin/tinymce/upload
L'application ne restreint pas suffisamment le type de fichier pouvant être téléversé. Un utilisateur authentifié peut soumettre un fichier avec une extension exécutable côté serveur, telle que .php. L'application stocke le fichier téléversé et renvoie son URL accessible.
Lorsque le déploiement autorise l'exécution de PHP depuis l'emplacement de téléversement, le fichier téléversé peut ensuite être demandé via le serveur web, entraînant une exécution de code à distance dans le contexte du processus de l'application web.
L'enregistrement CVE publié évalue la vulnérabilité à CVSS 3.1 : 9.9 (Critique).
Ce dépôt contient ma propre analyse technique et reproduction contrôlée de la vulnérabilité.
La vulnérabilité a déjà été divulguée publiquement sous CVE-2026-38526. Ce travail ne revendique pas la découverte de la vulnérabilité. L'objectif de cette recherche était de comprendre l'implémentation vulnérable, de reproduire le chemin d'exploitation dans un environnement contrôlé et d'examiner les conditions qui transforment le problème de téléversement de fichiers en exécution de code à distance.
La vulnérabilité a également été utilisée dans la machine Hack The Box GCSB 2026 Nexus, qui a fourni un environnement pratique pour étudier le problème.
Produit : Webkul Krayin CRM Versions affectées : 2.2.x Vulnérabilité : Téléversement arbitraire de fichiers Impact résultant : Exécution de code à distance Authentification : Requise Vecteur d'attaque : Réseau CWE : CWE-434 — Téléversement sans restriction de fichier de type dangereux CVSS : 9.9 Critique CVE : CVE-2026-38526
La fonctionnalité vulnérable est gérée par :
/admin/tinymce/upload
Le point de terminaison accepte un fichier téléversé via le paramètre file. La logique applicative concernée dérive le nom de fichier stocké à partir du nom de fichier d'origine et conserve son extension d'origine.

Ce comportement est important car l'application n'accepte pas simplement un objet téléversé ; elle conserve une extension exécutable contrôlée par l'attaquant et rend l'objet résultant accessible via le mécanisme de stockage de l'application.
Le problème principal est une validation côté serveur insuffisante des fichiers téléversés.
L'application utilise l'extension d'origine fournie par le client lors de la construction du nom de fichier stocké. Il n'existe pas de liste d'autorisation suffisamment restrictive empêchant les types de fichiers exécutables d'atteindre la couche de stockage.
Le flux concerné est

L'utilisation d'un nom de fichier généré ne résout pas le problème sous-jacent.
Par exemple, transformer shell.php en un nom de fichier généré tel que .php ne rend pas le fichier téléversé sûr si le serveur continue d'interpréter les fichiers .php comme du code PHP exécutable.
Un téléversement sans restriction ne signifie pas automatiquement une exécution de code à distance.
Le chemin d'exécution dépend de la gestion par le serveur du fichier téléversé.
Dans le scénario de déploiement vulnérable, la chaîne devient

Si l'exécution de PHP est désactivée pour le répertoire de téléversement, le chemin direct vers la RCE peut être empêché, même si la faiblesse sous-jacente de téléversement arbitraire de fichiers subsiste.
wget :
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
curl :
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
2. Placez les fichiers dans
poc/
├── upload.py
└── marker.php
3. Créez un environnement Python et installez la dépendance
python3 -m venv .venv
source .venv/bin/activate
pip install requests
4. Rendez le PoC exécutable
chmod +x poc/upload.py
6. Exécutez-le
python3 poc/upload.py \
--url http://[Lab_IP:PORT] \
--email [email protected] \
--password 'YOUR_PASSWORD'
L'exploitation nécessite un compte authentifié capable d'atteindre la fonctionnalité vulnérable.
En résumé :
Le contexte d'exécution résultant est déterminé par le déploiement sous-jacent. Dans un déploiement Linux typique, il peut s'agir du compte de service du serveur web, tel que :
www-data
Cela ne fournit pas automatiquement les privilèges root du système d'exploitation. L'impact ultérieur dépend des permissions et de la configuration de l'environnement compromis.
Le comportement vulnérable peut être réduit à trois opérations importantes.
Obtenir le fichier téléversé
$file = request()->file('file');
L'application reçoit le fichier fourni par le client.
Préserver l'extension contrôlée par le client
$filename = md5($file->getClientOriginalName().time())
.'.'.$file->getClientOriginalExtension();
Le nom de fichier lui-même est modifié, mais l'extension d'origine est conservée. Il s'agit d'une distinction importante : la randomisation du nom de fichier ne constitue pas une validation du type de fichier.
Stocker et exposer le fichier
$path = $file->storeAs($this->storagePath, $filename);
return [
'file' => $path,
'file_name' => $file->getClientOriginalName(),
'file_url' => Storage::url($path),
];
L'application stocke le fichier et fournit son URL au client.
Une exploitation réussie peut permettre à un attaquant d'exécuter du code avec les privilèges de l'application web.