-
Type:
Defect (Security)
-
Resolution: Declined
-
Priority:
Trivial
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
Stored Cross-Site Scripting (XSS) Vulnerability Report
Vulnerability ID: ZBX-CONTACT-STORED-XSS-001
Severity: Critical (CVSS 8.9 - AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L)
Component: /contact - Contact Us Form
Application: www.zabbix.com
Date Discovered: 2026-07-26
Reporter: Authorized Penetration Tester
1. Summary
The contact form on Zabbix's publicly accessible /contact page is vulnerable to Stored Cross-Site Scripting (XSS). User-supplied input fields — specifically Company name, First name, Last name, Job title, and Request — are not sanitized or encoded server-side before being persisted and subsequently rendered. When the Zabbix team views the submitted data (e.g., via an internal admin panel, email notification, or ticketing system), the injected payload executes in the context of the viewer's browser session.
Both JavaScript-based XSS and generic HTML injection were confirmed as working against the form.
2. Steps to Reproduce
2.1. XSS via <img> onerror (JavaScript Execution)
- Navigate to https://www.zabbix.com/contact.
- Locate the Contact Us form.
- Inject the following payload into the Company name field (or any other text input field):
<img src=0 onerror=alert(1)> - Fill remaining required fields with benign data.
- Complete the Captcha challenge.
- Submit the form.
- (Simulated server-side) When a Zabbix administrator or support agent views the stored submission (email preview, admin dashboard, or CRM system), the script executes, producing an alert(1) dialog.
2.2. HTML Injection via <a> Tag
- Repeat the process, injecting the following into the Request textarea:
<a href=https://google.com>google.com</a> - On submission and subsequent rendering by the reviewing party, the raw HTML anchor tag is rendered in the browser, confirming that no HTML encoding is applied on the backend.
3. Technical Impact
| Impact | Description |
|---|---|
| Session Hijacking | An attacker can exfiltrate session cookies (document.cookie) of any Zabbix employee viewing the submission. |
| Credential Theft | A crafted payload can render a fake login overlay to phish internal credentials. |
| Internal Network Reconnaissance | JavaScript can be used to probe internal Zabbix infrastructure (SSRF-like probes via fetch/XHR) if the admin's browser has network access. |
| Phishing via Trusted Domain | Because the payload executes on www.zabbix.com, victims are more likely to trust injected content. |
| Defacement / Malware Distribution | Injected scripts can redirect to malicious domains or download payloads. |
4. Root Cause
The backend endpoint (/contact or its associated form handler) does not perform:
- Output encoding / contextual escaping before storing or rendering user-supplied values.
- Server-side input validation to strip or neutralize HTML/JavaScript.
- Content-Security-Policy (CSP) headers strict enough to block inline event handlers like onerror.
The form is rendered server-side (or forwarded via email in HTML format), and the raw input is included without sanitization.
5. Proof-of-Concept Payloads
| Field | Payload | Type |
|---|---|---|
| Company name | <img src=x onerror=alert('XSS')> | Stored XSS |
| First name | <svg/onload=alert(1)> | Stored XSS |
| Request | <a href="https://evil.com">Click here</a> | HTML Injection |
| Request | <iframe src="https://evil.com"></iframe> | Iframe Injection |
| Job title | "><script>alert(1)</script> | Stored XSS |
6. Affected Fields
- Company name
- First name
- Last name
- Job title
- Business email address (partial — less likely to be rendered as raw HTML, but should still be validated)
- Request (textarea)
- Country / Territory
7. Remediation Recommendations
Critical (Immediate)
- Server-side Output Encoding - Encode all user-supplied values using context-appropriate escaping (HTML entity encoding) before storage and before rendering in any email, admin panel, or web page:
-
- & → &
- < → <
- > → >
- " → "
- ' → '
- Input Validation - Reject or strip any HTML tags from text fields where plain text is expected. Use a server-side allowlist approach.
- Implement Content-Security-Policy (CSP) - Deploy a strict CSP header on the contact page and any admin-facing interfaces that render submitted data:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
Avoid 'unsafe-inline' and 'unsafe-eval' in production.
Recommended (Defense-in-Depth)
- Use a Template Engine with Auto-Escaping - If the backend uses email templates (e.g., PHP, Node.js, Python), ensure auto-escaping is enabled by default and explicitly mark only trusted variables as safe.
- Sanitize with an Allowlist Library - Use a well-maintained library such as OWASP Java HTML Sanitizer, DOMPurify (server-side), or Bleach (Python) on any field that legitimately requires limited HTML.
- Audit Admin/Email Pipeline - Review how submitted form data flows from the web server to internal dashboards, email inboxes, and ticketing systems. Every point where raw input is rendered is an attack surface.