Mar 23, 2026·6 min read·54 visits
Unsanitized `unlockPassword` parameter in AVideo <= 26.0 allows unauthenticated reflected XSS, enabling session hijacking and account takeover.
WWBN AVideo versions up to and including 26.0 suffer from a reflected Cross-Site Scripting (XSS) vulnerability. The application fails to sanitize the `unlockPassword` parameter in password-protected page templates, allowing unauthenticated attackers to execute arbitrary JavaScript in a victim's browser context.
WWBN AVideo, an open-source video platform, utilizes password-protected channels and videos to restrict content access. When a user attempts to access restricted content without prior authorization, the application serves an interstitial page requesting a password. This functionality is handled primarily by the view/forbiddenPage.php and view/warningPage.php template files.
A security vulnerability exists within the handling of the unlockPassword HTTP request parameter during the rendering of these templates. The application directly extracts the value from the $_REQUEST['unlockPassword'] superglobal and reflects it into the HTML output. The vulnerability is classified as CWE-79: Improper Neutralization of Input During Web Page Generation.
Because the application omits necessary output encoding mechanisms, an attacker can supply crafted HTML attributes or script tags within the unlockPassword parameter. When a victim loads the resulting URL, the application renders the attacker's payload as part of the page's Document Object Model (DOM), leading to arbitrary JavaScript execution in the context of the vulnerable origin.
The root cause of CVE-2026-33499 is the direct concatenation of untrusted user input into an HTML element attribute without prior sanitization. The vulnerability initiates in the view/forbiddenPage.php template. The script checks for the presence of the unlockPassword parameter within the $_REQUEST array. If present, it assigns the raw, unvalidated input to the local variable $value.
The application subsequently passes this $value variable as an argument to the getInputPassword() helper function, appending it to a string of HTML attributes. Specifically, the concatenation occurs as class="form-control" value="' . $value . '". The helper function, defined in objects/functions.php, receives these attributes and echoes them directly inside an HTML <input> tag.
The lack of output encoding at the point of reflection allows an attacker to break out of the intended attribute context. By prefixing their payload with a double-quote ("), the attacker terminates the value attribute early. The browser then interprets subsequent characters as new HTML attributes belonging to the <input> element, enabling the injection of event handlers like onfocus or onmouseover.
Analyzing the source code reveals the precise data flow from the request superglobal to the final HTML render. In the vulnerable version of view/forbiddenPage.php, the logic explicitly extracts the parameter and builds the attribute string:
$value = '';
if (!empty($_REQUEST['unlockPassword'])) {
$value = $_REQUEST['unlockPassword']; // Flaw: No sanitization
}
echo getInputPassword('unlockPassword', 'class="form-control" value="' . $value . '"', __('Unlock Password'));The getInputPassword() function then injects the $attributes string unmodified into the DOM:
function getInputPassword($id, $attributes = '', $placeholder = '') {
// ...
?>
<input id="<?php echo $id; ?>" name="<?php echo $id; ?>" type="password" placeholder="<?php echo $placeholder; ?>" <?php echo $attributes; ?>>
<?php
}The vendor remediation, applied in commit f154167251c9cf183ce09cd018d07e9352310457, introduces the standard PHP htmlspecialchars() function to encode the input before assignment.
// Patched Code block in view/forbiddenPage.php
if (!empty($_REQUEST['unlockPassword'])) {
$value = htmlspecialchars($_REQUEST['unlockPassword'], ENT_QUOTES, 'UTF-8');
}The utilization of ENT_QUOTES is the critical component of this fix. It ensures that both single and double quotes are converted to their corresponding HTML entities (e.g., "). This prevents the attacker from terminating the value="..." attribute, forcing the browser to treat the entire payload strictly as the text value of the input field.
Exploiting this vulnerability requires an attacker to construct a targeted URL and deliver it to a victim. The attacker identifies a password-protected channel or video URL on the target AVideo instance. They then append the unlockPassword parameter containing the exploit payload to the query string.
The most reliable exploitation technique utilizes the autofocus and onfocus HTML attributes. By injecting " autofocus onfocus="alert(document.cookie), the attacker ensures immediate payload execution. The complete PoC URL takes the following form:
https://[Target]/channel/[User]?unlockPassword=" autofocus onfocus="alert(document.cookie)
When the victim's browser receives the HTTP response, it parses the manipulated <input> tag. The injected autofocus attribute commands the browser to automatically place the cursor inside the input field upon page load. This automatic focus event instantly triggers the injected onfocus event handler, executing the associated JavaScript without requiring the victim to click or type anything on the page itself.
Successful exploitation of this reflected XSS vulnerability grants the attacker the ability to execute arbitrary JavaScript within the security context of the victim's session on the AVideo platform. This violates the Same-Origin Policy (SOP) restrictions that normally protect cross-site data interactions. The primary and most immediate impact is session hijacking.
By executing a payload that reads document.cookie, an attacker can exfiltrate the victim's PHPSESSID token to an external server under their control. If the victim holds administrative privileges, the attacker can use the stolen session token to authenticate to the application as an administrator, granting them full control over the platform's configuration, users, and content.
Beyond session theft, the vulnerability facilitates forced actions and phishing. The injected script can issue asynchronous HTTP requests (via fetch or XMLHttpRequest) to perform state-changing operations on behalf of the user, such as modifying account credentials or altering platform settings. The CVSS v3.1 score of 6.1 accurately reflects this impact profile, highlighting the requirement for user interaction (UI:R) and the changed security scope (S:C) inherent to reflected XSS.
The definitive remediation for CVE-2026-33499 is to update WWBN AVideo installations to a version encompassing commit f154167251c9cf183ce09cd018d07e9352310457. System administrators must ensure that the patched code correctly implements htmlspecialchars() with the ENT_QUOTES flag applied to the unlockPassword parameter in both view/forbiddenPage.php and view/warningPage.php.
Organizations unable to deploy the patch immediately can implement mitigation controls via a Web Application Firewall (WAF). WAF rules should be configured to inspect the unlockPassword parameter for structural HTML characters, specifically double quotes ("), or common JavaScript event handlers like onfocus, onmouseover, or onload. Dropping requests that match these signatures will successfully disrupt the attack vector.
Detection of historical exploitation attempts requires analysis of web server access logs. Security analysts should query HTTP GET requests targeting /channel/ or video paths containing the unlockPassword query parameter. Analysts should flag any requests where the parameter value includes URL-encoded double quotes (%22) followed by spaces and subsequent attribute declarations.
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
AVideo WWBN | <= 26.0 | Post-26.0 (Commit f154167251) |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-79 |
| Attack Vector | Network |
| CVSS Score | 6.1 |
| Impact | Session Hijacking, Account Takeover |
| Exploit Status | Proof of Concept Available |
| CISA KEV | Not Listed |
The software does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
A high-severity access control vulnerability in ToolHive CLI before v0.30.1 and ToolHive Studio before v0.38.0 allows local containerized MCP servers to bypass network isolation. This enables malicious workloads to establish TCP/IP connections to administrative and control plane endpoints exposed on the host loopback interface.
AnyCable is a real-time communication server. Prior to version 1.6.15, its Pusher-compatible REST API suffered from an authentication bypass vulnerability because it failed to verify that the request body matched the signature-validated body_md5 parameter. This allows attackers to perform replay attacks with modified body contents.
A denial-of-service vulnerability exists in AnyIO prior to version 4.14.2. Standard error streams of process-pool workers are connected to an operating system pipe that is never drained by the parent process. This allows a worker to fill the pipe buffer and deadlock indefinitely.
CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.
CVE-2026-63406 is an information disclosure vulnerability in AnyCable-go prior to version 1.6.15. The built-in telemetry client is enabled by default with a hardcoded public authentication token ('secret'). This client digests highly sensitive configuration parameters and command-line arguments, including JWT secrets and RPC secrets, into a stable SHA-256 fingerprint. This fingerprint is sent over public networks, exposing those administrative secrets to offline dictionary and brute-force attacks if intercepted.
CVE-2026-84992 is a Cross-Site Scripting (XSS) vulnerability affecting md-editor-v3 before version 6.5.4. It occurs because the fenced-code block language parser directly interpolates unescaped language metadata into unquoted HTML attributes inside the custom rendering callback. This bypasses the built-in XSSPlugin which runs during the parsing phase, before rendering.