Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAttacker authenticates as customer with DNS editor access
-
DeliveryInject XSS payload in TXT record content field
-
ExploitAdministrator navigates to domain DNS editor (routine workflow)
-
InstallPayload executes automatically in admin browser session
-
C2Exfiltrate admin session cookie or credentials
-
ExecuteAuthenticate as administrator
-
ImpactCreate backdoor admin account or execute server commands via system configuration interface
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires three concrete conditions: (1) Froxlor must be running with DNS functionality enabled via the |
| Impact | 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. The UI:R metric requires admin page visitation, but critically, the trigger URL ( |
| Exploit ScenarioDerived | A hosting customer with DNS editor access adds a TXT record to their domain with content |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 18, 2026
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. A detailed public proof-of-concept is confirmed in the vendor advisory; no CISA KEV listing at time of analysis. Successful exploitation yields complete admin account takeover and full server compromise.
RemediationAI
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. If immediate upgrade is not possible, the highest-impact compensating control is to disable DNS editor access for all customer accounts by setting dnsenabled = 0 per domain in the Froxlor admin panel - this removes the injection surface entirely but prevents customers from self-managing DNS records, which may disrupt service. A secondary hardening step is to remove 'unsafe-inline' and 'unsafe-eval' from the script-src directive in lib/Froxlor/UI/Panel/UI.php:140; this would block inline script execution and is good hygiene, but is not a substitute for the HTML escaping fix since the current CSP provides no XSS protection. Do not rely on WAF-based HTML filtering alone, as TXT record content has legitimate use cases with angle-bracket-adjacent characters that may trigger false positives.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in composer, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Froxlor is a PHP-based web hosting control panel using Twig as its templating engine. The vulnerability is a classic CWE-79 (Improper Neutralization of Input During Web Page Generation) arising from a chain of three independent failures. First, DomainZones.php:158 sanitizes TXT record content with a regex that strips only non-printable characters, allowing HTML special characters like < (0x3C) and > (0x3E) to pass through unmodified. Second, Text.php:95's wordwrap() callback inserts literal <br> HTML tags without first encoding the user-supplied data with htmlspecialchars(). Third, table.html.twig:57 renders the callback's return value using {{ td.data|raw }}, which instructs Twig to bypass its built-in auto-escaping. The DNS editor table routes the content column through this callback (tablelisting.dns.php:58), creating a direct injection path from customer input to admin-rendered HTML. The effective CSP in UI.php:140 permits 'unsafe-inline' and 'unsafe-eval' under script-src, meaning browser-level CSP enforcement provides no protection against injected inline scripts. The affected composer package is froxlor/froxlor, versions up to and including 2.3.7. The fix in commit a1d8f425b11ef7597949018814afa056a842cba0 adds htmlspecialchars() in the wordwrap() callback.
Know when PHP gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
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
DescriptionCVE.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.
Executive ViewAI
Froxlor hosting control panel contains a stored cross-site scripting vulnerability enabling complete administrator account compromise; publicly available exploit code exists for this issue. Low-privilege customers with DNS editor privileges can inject malicious code that automatically executes in administrator browser sessions, leading to full platform compromise and access to all hosted customer data. This is critical for hosting providers and MSPs where a single compromised customer account cascades to infrastructure-wide breach.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
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
EUVD-2026-61219
GHSA-43gm-9rr3-cx7g
NVD
CVE.org
EPSS
Exploit-DB