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.
Show details on source website

{
  "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"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

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…

Detection rules are retrieved from Rulezet.

Loading…

Loading…