Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAttacker registers account with HTML-encoded quote in username
-
DeliveryMalicious payload stored in Pentestify database
-
ExploitVictim authenticated user opens user management page
-
InstallBrowser renders delete button with encoded payload in onclick attribute
-
C2Victim clicks delete button for attacker's account
-
ExecuteBrowser HTML-decodes ' before JS engine parses handler
-
ImpactInjected JavaScript executes in victim's authenticated browser session
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 two authenticated users: the attacker must hold a valid Pentestify account with permission to register a username (the injection point), and the victim must be an authenticated user who navigates to the user management interface and clicks the delete button specifically for the attacker's account. The attack does not trigger passively - there is no drive-by or page-load execution path; the victim must perform an explicit UI interaction. The payload must survive the escapeHTML() filter by using HTML entity encoding (e.g., encoded quotes) rather than raw metacharacters, so only inputs exploiting the HTML-attribute-to-JS-context decoding gap are effective. Exploitation is limited to Pentestify versions before 1.1.1; the 1.1.1 backend allowlist regex (^[A-Za-z0-9_.\-]{3,32}$) would reject any username containing quotes or other injection metacharacters at registration time, blocking the attack vector entirely. |
| Impact | The CVSS 4.0 score of 5.1 (Medium) accurately reflects the constrained attack path: PR:L establishes that a valid authenticated account is required to plant the payload, and UI:P means the victim must actively click the delete button for the attacker's specific account - there is no passive or drive-by trigger. Even a mid-sized municipal IT team in tczew deploying Pentestify as an internal tooling platform should treat this as a moderate-priority upgrade rather than an emergency, given the authenticated prerequisite limits opportunistic mass exploitation. No EPSS data was supplied, and the vulnerability does not appear in the CISA KEV catalog, so exploitation probability is inferred rather than confirmed. The real-world risk is further bounded by Pentestify's niche deployment as a specialized pentesting tool - not general enterprise infrastructure. The CVSS 4.0 vector omits confidentiality impact entirely (VC:N/SC:N), which may understate the realistic blast radius of stored XSS (session token theft is a standard post-exploitation technique), though this assessment aligns with the vendor's own scoring and cannot be independently escalated without additional exploit evidence. |
| Exploit ScenarioDerived | An attacker with a valid low-privilege Pentestify account registers a username containing an HTML-encoded single quote - for example, test');alert(document.cookie);// - which passes the escapeHTML() filter and is stored in the backend database. When an administrator navigates to the user management page, Pentestify renders the delete button for that account with the encoded payload in the onclick attribute; the browser HTML-decodes ' to a literal quote before the JavaScript engine processes the handler, breaking the string literal and executing the injected code. The payload fires the moment the administrator clicks the delete button for the attacker's account, potentially exfiltrating session tokens or performing privileged actions on the victim's behalf. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 13, 2026
Stored XSS in Pentestify's user management component (all versions before 1.1.1) enables an authenticated attacker to execute arbitrary JavaScript in another authenticated user's browser by registering a crafted username containing an HTML-encoded single quote. The escapeHTML() sanitizer in js/app.js encodes the character to ', but the browser HTML-decodes attribute values before the JavaScript engine parses the onclick handler, causing the encoded quote to reconstitute as a literal quote and break out of the JS string literal at runtime. No public exploit code has been confirmed at time of analysis, though the GitHub commit diff fully discloses the vulnerable code path and bypass technique, substantially lowering the bar for independent reproduction.
RemediationAI
Upgrade to Pentestify 1.1.1, available at https://github.com/ccyl13/Pentestify/releases/tag/v1.1.1 and confirmed by the fix commit https://github.com/ccyl13/Pentestify/commit/714e05ef7cfaf4d822193b8d18eacafbd89f5019. The release also bumps fastapi to 0.115.6, starlette to 0.41.3 (addressing CVE-2024-47874), and python-multipart to 0.0.32 (addressing CVE-2024-53981), making the upgrade beneficial beyond the XSS fix alone. If immediate upgrade is not possible, restrict the ability to create new user accounts to fully trusted administrators only - this removes the attacker's ability to register a malicious username but does not fix the underlying rendering flaw and must be treated as temporary. Deploying a Content Security Policy header that disallows unsafe-inline script execution can reduce XSS blast radius across the application; however, adding a strict CSP to an existing application with inline event handlers (as this one uses) may break legitimate functionality and requires thorough testing before production deployment.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw originates in a JavaScript template literal in js/app.js that builds each account's delete button by interpolating the username directly into an inline onclick event handler: onclick="deleteUser(${u.id}, '${escapeHTML(u.username)}')". The escapeHTML() call converts a literal single quote to the HTML entity ', which appears to neutralize injection. However, the HTML parser processes and decodes attribute values before handing the handler string to the JavaScript engine - a well-documented double-context execution path that makes HTML-entity encoding insufficient for JavaScript string contexts. This root cause class is captured by CWE-79 (Improper Neutralization of Input During Web Page Generation). The CPE cpe:2.3:a:maalfer:pentestify:*:*:*:*:*:*:*:* confirms all pre-1.1.1 releases are affected. The fix in commit 714e05ef takes a defense-in-depth approach: the frontend removes username from the inline handler entirely (passing only userId and resolving the name from application state), while the backend adds a strict allowlist regex (^[A-Za-z0-9_.\-]{3,32}$) in schemas.py at the Pydantic validation layer, preventing special characters at registration time regardless of frontend behavior.
Know when Pentestify 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N
Network-accessible web app requires low-privilege auth (PR:L) and victim must click delete (UI:R); payload executes in victim's browser scope, constituting a scope change (S:C) with modest confidentiality and integrity impact.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
Stored Cross-site Scripting (CWE-79) in the user management component in maalfer Pentestify before 1.1.1 allows an authenticated attacker to execute arbitrary JavaScript in the browser of another authenticated user via a crafted username, because the frontend escapes the username with escapeHTML() before interpolating it into the onclick attribute of the account deletion button, but the browser HTML-decodes attribute values before the JavaScript engine parses the handler, allowing an encoded single quote (') to break out of the string literal and inject arbitrary JavaScript that executes when the victim clicks the delete button for that account.
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.
More in Pentestify
View allStored cross-site scripting in maalfer Pentestify before 1.1.0 allows an authenticated attacker to inject arbitrary Java
Server-Side Request Forgery in Pentestify's PDF export pipeline allows authenticated users to induce the server-side hea
Stored cross-site scripting in the Markdown renderer of maalfer Pentestify before v2.3.2 allows authenticated users to i
Stored cross-site scripting in Pentestify's finding renderer allows any authenticated user with finding-creation privile
CSS sanitizer bypass in maalfer Pentestify 1.2.0-2.3.2 allows an authenticated low-privilege user to inject CSS that vic
EUVD-2026-57930
GHSA-2rhm-fmxx-8mf9
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB