GHSA-C8H8-VQ34-9FW2
Vulnerability from github – Published: 2026-06-04 18:46 – Updated: 2026-06-04 18:46
VLAI
Summary
WWBN AVideo: Stored XSS via unescaped Gallery category description
Details
Summary
AVideo stores category descriptions from user input and later renders category_description as raw HTML in the Gallery view. A user who can create or edit
categories can store JavaScript in a category description, which executes when another user views the affected Gallery/category page.
This is a stored XSS in the category description field, separate from previously fixed XSS issues in video titles or comments.
### Details
Source:
objects/categoryAddNew.json.php
```php $objCat->setDescription($_POST['description']);
Storage setter:
objects/category.php
public function setDescription($description) { $this->description = $description; }
Sink:
`plugin/Gallery/view/mainAreaCategory.php`
The value is rendered without `htmlspecialchars()`, `htmlentities()`, `HTMLPurifier`, or equivalent output encoding.
### PoC
Prerequisites:
- AVideo current master / v29.0
- User account with permission to create or edit categories
- Gallery plugin/view enabled
- At least one video assigned to the affected category
Steps:
1. Log in as a user who can create or edit categories.
2. Create or edit a category.
3. Set the category description to:
4. Save the category.
5. Assign at least one video to that category.
6. Open the Gallery/category page that renders the category section.
7. The payload is inserted into the page as raw HTML and JavaScript executes.
### Impact
An attacker with category edit permission can execute JavaScript in the browser of users or administrators who view the affected Gallery/category page. This can
be used to perform actions as the victim, steal same-origin data accessible to JavaScript, or abuse administrative UI actions if an administrator views the
malicious category.
### Recommended fix
- Sanitize category descriptions on input with the same HTML policy used for video descriptions, or store plain text only.
- Encode on output:
```php
echo htmlspecialchars($videos[0]['category_description'], ENT_QUOTES, 'UTF-8');
- If limited HTML is intended, run the description through HTMLPurifier before storage or before render.
- Add regression tests for category description rendering in Gallery views.
Severity
5.4 (Medium)
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "WWBN/AVideo"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "29.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-47694"
],
"database_specific": {
"cwe_ids": [
"CWE-79"
],
"github_reviewed": true,
"github_reviewed_at": "2026-06-04T18:46:31Z",
"nvd_published_at": "2026-05-29T14:16:31Z",
"severity": "MODERATE"
},
"details": "### Summary\n\n AVideo stores category descriptions from user input and later renders `category_description` as raw HTML in the Gallery view. A user who can create or edit\ncategories can store JavaScript in a category description, which executes when another user views the affected Gallery/category page.\n\n This is a stored XSS in the category `description` field, separate from previously fixed XSS issues in video titles or comments.\n\n ### Details\n\n Source:\n\n `objects/categoryAddNew.json.php`\n\n ```php\n $objCat-\u003esetDescription($_POST[\u0027description\u0027]);\n\n Storage setter:\n\n objects/category.php\n\n public function setDescription($description)\n {\n $this-\u003edescription = $description;\n }\n```\n Sink:\n\n `plugin/Gallery/view/mainAreaCategory.php`\n```\n \u003cdiv id=\"categoryDescription\u003c?php echo $duid; ?\u003e\" style=\"display: none;\"\u003e\u003c?php echo $videos[0][\u0027category_description\u0027]; ?\u003e\u003c/div\u003e\n```\n The value is rendered without `htmlspecialchars()`, `htmlentities()`, `HTMLPurifier`, or equivalent output encoding.\n\n ### PoC\n\n Prerequisites:\n\n - AVideo current master / v29.0\n - User account with permission to create or edit categories\n - Gallery plugin/view enabled\n - At least one video assigned to the affected category\n\n Steps:\n\n 1. Log in as a user who can create or edit categories.\n 2. Create or edit a category.\n 3. Set the category description to:\n```\n \u003cimg src=x onerror=alert(document.domain)\u003e\n```\n 4. Save the category.\n 5. Assign at least one video to that category.\n 6. Open the Gallery/category page that renders the category section.\n 7. The payload is inserted into the page as raw HTML and JavaScript executes.\n\n ### Impact\n\n An attacker with category edit permission can execute JavaScript in the browser of users or administrators who view the affected Gallery/category page. This can\n be used to perform actions as the victim, steal same-origin data accessible to JavaScript, or abuse administrative UI actions if an administrator views the\n malicious category.\n\n### Recommended fix\n\n- Sanitize category descriptions on input with the same HTML policy used for video descriptions, or store plain text only.\n- Encode on output:\n\n```php\necho htmlspecialchars($videos[0][\u0027category_description\u0027], ENT_QUOTES, \u0027UTF-8\u0027);\n```\n\n- If limited HTML is intended, run the description through HTMLPurifier before storage or before render.\n- Add regression tests for category description rendering in Gallery views.",
"id": "GHSA-c8h8-vq34-9fw2",
"modified": "2026-06-04T18:46:31Z",
"published": "2026-06-04T18:46:31Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-c8h8-vq34-9fw2"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-47694"
},
{
"type": "PACKAGE",
"url": "https://github.com/WWBN/AVideo"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N",
"type": "CVSS_V3"
}
],
"summary": "WWBN AVideo: Stored XSS via unescaped Gallery category description"
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…