CVE-2026-50182
AVideo Has Unauthenticated Reflected XSS via $_GET['search'] in YouTubeAPI Gallery Pagination
WWBN AVideo is an open source video platform. Versions prior to 29.0 contain an unauthenticated Reflected XSS vulnerability through AVideo YouTubeAPI Gallery Pagination. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it. Any unauthenticated attacker can lure a victim into following a crafted URL to execute arbitrary JavaScript under the AVideo origin, which can read non-HttpOnly cookies and issue authenticated AJAX requests as the victim, and when the victim is an administrator, it can perform any cookie-authenticated admin action (create user, promote to admin, change configuration, install plugin), escalating a single click into full administrative takeover. This issue has been patched by this commit: https://github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.1
AVideo Has Unauthenticated Reflected XSS via $_GET['search'] in YouTubeAPI Gallery Pagination
WWBN AVideo is an open source video platform. Versions prior to 29.0 contain an unauthenticated Reflected XSS vulnerability through AVideo YouTubeAPI Gallery Pagination. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it. Any unauthenticated attacker can lure a victim into following a crafted URL to execute arbitrary JavaScript under the AVideo origin, which can read non-HttpOnly cookies and issue authenticated AJAX requests as the victim, and when the victim is an administrator, it can perform any cookie-authenticated admin action (create user, promote to admin, change configuration, install plugin), escalating a single click into full administrative takeover. This issue has been patched by this commit: https://github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3.
- Record
CVE-2026-50182- 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
EUVDEUVD-2026-44827
6.1
WWBN AVideo is an open source video platform. Versions prior to 29.0 contain an unauthenticated Reflected XSS vulnerability through AVideo YouTubeAPI Gallery Pagination. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it. Any unauthenticated attacker can lure a victim into following a crafted URL to execute arbitrary JavaScript under the AVideo origin, which can read non-HttpOnly cookies and issue authenticated AJAX requests as the victim, and when the victim is an administrator, it can perform any cookie-authenticated admin action (create user, promote to admin, change configuration, install plugin), escalating a single click into full administrative takeover. This issue has been patched by this commit: https://github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3.
- Record
EUVD-2026-44827- 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 - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-hgjh-6wj8-gcgf
6.1
WWBN AVideo: Unauthenticated Reflected XSS via $_GET['search'] in AVideo YouTubeAPI Gallery Pagination
Unauthenticated Reflected XSS via $_GET['search'] in AVideo YouTubeAPI Gallery Pagination
Summary
A reflected Cross-Site Scripting vulnerability (CWE-79) in the AVideo YouTubeAPI plugin allows any unauthenticated attacker to execute arbitrary JavaScript in a victim's browser session when the victim follows a crafted URL. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it.
Details
plugin/YouTubeAPI/gallerySection.php renders the YouTubeAPI plugin's gallery section on the AVideo homepage (and every page that includes plugin/Gallery/view/mainArea.php) when the API plugin is enabled with showGallerySection=true (the default). The pagination block at lines 67 and 74 builds the previous-page and next-page <a> elements by string-interpolating $_GET['search'] directly:
// plugin/YouTubeAPI/gallerySection.php:67
<a href="<?php echo "{$global['webSiteRootURL']}page/".($_GET['page']-1)."?pageToken={$object->prevPageToken}&search=".(@$_GET['search']); ?>" ...>
// plugin/YouTubeAPI/gallerySection.php:74
<a href="<?php echo "{$global['webSiteRootURL']}page/".($_GET['page']+1)."?pageToken={$object->nextPageToken}&search=".(@$_GET['search']); ?>" ...>
The @ operator only suppresses an undefined-index warning; it does not sanitize the value. A payload like "><script>alert(1337)</script> closes the href attribute, closes the <a> element, and injects a fresh <script> tag.
Two preconditions gate the sink. First, the YouTube API call must return a pagination token (always true for any non-trivial result set, since the mock or real YouTube response carries nextPageToken for multi-page queries). Second, plugin/Gallery/view/mainArea.php line 53 wraps the gallery render in if (!empty($video)) { echo AVideoPlugin::getGallerySection(); } else { /* output captured and discarded */ }. When $_GET['search'] is set, Video::getVideo() adds a MySQL fulltext MATCH(v.title) AGAINST (<search>) IN NATURAL LANGUAGE MODE clause; the payload tokenizes to words like script, alert, 1337, and the gate passes whenever any video in the corpus has a title containing one of those words. Realistic deployments overwhelmingly satisfy this; the attacker can also seed the payload with a common word (?search=video"><script>...</script>) to guarantee a fulltext hit.
The AVideo Layout plugin (plugin/Layout/Layout.php:611, enabled by default) runs Layout::organizeHTML() over the final HTML, extracts every inline <script[^>]*>(.*)</script> block via regex, and concatenates their inner contents into one trailing <script> block placed immediately before </body>. The injected <script>alert(1337)</script> is therefore moved out of the original href context and into a clean executable script block; the visible pagination markup retains only the leftover &search="> bytes.
Affected product: AVideo (WWBN), API + YouTubeAPI + Layout plugins Tested version: master branch, commit 122b184 (snapshot dated 2026-05-22)
PoC
The AVideo deployment must have the YouTubeAPI plugin enabled with the default showGallerySection=true. The payload also needs to satisfy the fulltext MATCH(v.title) AGAINST gate that Video::getVideo() adds when $_GET['search'] is set: at least one video in the corpus must have a title containing one of the payload's tokens. In the live confirmation a video titled Tutorial about script error alerts satisfied the gate via the words script and alert. Seeding the payload with the common word video guarantees a hit on any realistic AVideo deployment, since video appears in nearly every…
- Record
GHSA-hgjh-6wj8-gcgf- 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
6.1
WWBN AVideo is an open source video platform. Versions prior to 29.0 contain an unauthenticated Reflected XSS vulnerability through AVideo YouTubeAPI Gallery Pagination. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it. Any unauthenticated attacker can lure a victim into following a crafted URL to execute arbitrary JavaScript under the AVideo origin, which can read non-HttpOnly cookies and issue authenticated AJAX requests as the victim, and when the victim is an administrator, it can perform any cookie-authenticated admin action (create user, promote to admin, change configuration, install plugin), escalating a single click into full administrative takeover. This issue has been patched by this commit: https://github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3.
- Record
CVE-2026-50182- 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
6.1
AVideo Has Unauthenticated Reflected XSS via $_GET['search'] in YouTubeAPI Gallery Pagination
WWBN AVideo is an open source video platform. Versions prior to 29.0 contain an unauthenticated Reflected XSS vulnerability through AVideo YouTubeAPI Gallery Pagination. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it. Any unauthenticated attacker can lure a victim into following a crafted URL to execute arbitrary JavaScript under the AVideo origin, which can read non-HttpOnly cookies and issue authenticated AJAX requests as the victim, and when the victim is an administrator, it can perform any cookie-authenticated admin action (create user, promote to admin, change configuration, install plugin), escalating a single click into full administrative takeover. This issue has been patched by this commit: https://github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3.
- Record
CVE-2026-50182- 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-11
OSVGHSA-hgjh-6wj8-gcgf
6.1
WWBN AVideo: Unauthenticated Reflected XSS via $_GET['search'] in AVideo YouTubeAPI Gallery Pagination
Unauthenticated Reflected XSS via $_GET['search'] in AVideo YouTubeAPI Gallery Pagination
Summary
A reflected Cross-Site Scripting vulnerability (CWE-79) in the AVideo YouTubeAPI plugin allows any unauthenticated attacker to execute arbitrary JavaScript in a victim's browser session when the victim follows a crafted URL. The $_GET['search'] query parameter is concatenated directly into the href attribute of two pagination links in plugin/YouTubeAPI/gallerySection.php (lines 67 and 74) with no htmlspecialchars, no urlencode, and no allow-list check. An injected <script> element is then extracted by the AVideo Layout plugin and concatenated into a single trailing inline script block at the bottom of the page, where the browser executes it.
Details
plugin/YouTubeAPI/gallerySection.php renders the YouTubeAPI plugin's gallery section on the AVideo homepage (and every page that includes plugin/Gallery/view/mainArea.php) when the API plugin is enabled with showGallerySection=true (the default). The pagination block at lines 67 and 74 builds the previous-page and next-page <a> elements by string-interpolating $_GET['search'] directly:
// plugin/YouTubeAPI/gallerySection.php:67
<a href="<?php echo "{$global['webSiteRootURL']}page/".($_GET['page']-1)."?pageToken={$object->prevPageToken}&search=".(@$_GET['search']); ?>" ...>
// plugin/YouTubeAPI/gallerySection.php:74
<a href="<?php echo "{$global['webSiteRootURL']}page/".($_GET['page']+1)."?pageToken={$object->nextPageToken}&search=".(@$_GET['search']); ?>" ...>
The @ operator only suppresses an undefined-index warning; it does not sanitize the value. A payload like "><script>alert(1337)</script> closes the href attribute, closes the <a> element, and injects a fresh <script> tag.
Two preconditions gate the sink. First, the YouTube API call must return a pagination token (always true for any non-trivial result set, since the mock or real YouTube response carries nextPageToken for multi-page queries). Second, plugin/Gallery/view/mainArea.php line 53 wraps the gallery render in if (!empty($video)) { echo AVideoPlugin::getGallerySection(); } else { /* output captured and discarded */ }. When $_GET['search'] is set, Video::getVideo() adds a MySQL fulltext MATCH(v.title) AGAINST (<search>) IN NATURAL LANGUAGE MODE clause; the payload tokenizes to words like script, alert, 1337, and the gate passes whenever any video in the corpus has a title containing one of those words. Realistic deployments overwhelmingly satisfy this; the attacker can also seed the payload with a common word (?search=video"><script>...</script>) to guarantee a fulltext hit.
The AVideo Layout plugin (plugin/Layout/Layout.php:611, enabled by default) runs Layout::organizeHTML() over the final HTML, extracts every inline <script[^>]*>(.*)</script> block via regex, and concatenates their inner contents into one trailing <script> block placed immediately before </body>. The injected <script>alert(1337)</script> is therefore moved out of the original href context and into a clean executable script block; the visible pagination markup retains only the leftover &search="> bytes.
Affected product: AVideo (WWBN), API + YouTubeAPI + Layout plugins Tested version: master branch, commit 122b184 (snapshot dated 2026-05-22)
PoC
The AVideo deployment must have the YouTubeAPI plugin enabled with the default showGallerySection=true. The payload also needs to satisfy the fulltext MATCH(v.title) AGAINST gate that Video::getVideo() adds when $_GET['search'] is set: at least one video in the corpus must have a title containing one of the payload's tokens. In the live confirmation a video titled Tutorial about script error alerts satisfied the gate via the words script and alert. Seeding the payload with the common word video guarantees a hit on any realistic AVideo deployment, since video appears in nearly every…
- Record
GHSA-hgjh-6wj8-gcgf- 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 29.0 | None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-50182 is a medium vulnerability (CVSS 6.1) in Wwbn Avideo, published June 4, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 12th percentile. No source names a fixed version.
References
github.com/WWBN/AVideo/security/advisories/GHSA-hgjh-6wj8-gcgf
github.com/WWBN/AVideo/commit/f50fc033b7adb36f1ffd6640e7826468bdafdec3
github.com/advisories/GHSA-hgjh-6wj8-gcgf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/50xxx/CVE-2026-50182.json
nvd.nist.gov/vuln/detail/CVE-2026-50182
github.com/WWBN/AVideo
Left out here: the rest of 2 source descriptions. The JSON record has them.