Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L
Network-reachable via HTTP POST with no special conditions, but PR:L is mandatory as member authentication is required; C:H reflects gadget-chain RCE potential beyond the confirmed SQL write.
Primary rating from Vendor (TuranSec).
CVSS VectorVendor: TuranSec
Lifecycle Timeline
3DescriptionCVE.org
Cotonti CMS's Comments plugin deserializes user-supplied data without restricting the classes that may be instantiated. In plugins/comments/controllers/actions/CreateAction.php, a ci POST parameter obtained via cot_import('ci', 'P', 'TXT') (trim-only sanitization) is passed to unserialize(base64_decode($ci)) with no allowed_classes restriction, reachable by any member with write access to comments (the default Auth_members => 'RW' setting in plugins/comments/comments.setup.php). In plugins/comments/controllers/actions/EditAction.php, a cb parameter is similarly deserialized via unserialize(base64_decode($this->comeback)) in prepareComeBack(), reachable by any member editing their own comment. Because unserialize() is called without allowed_classes, an attacker can construct a serialized PHP object of any class loaded by Cotonti (a PHP Object Injection primitive). This was demonstrated in practice using Cotonti's own MySQL_cache class: a crafted serialized MySQL_cache object, once deserialized and later garbage-collected, triggers its __destruct()->flush() chain, causing an attacker-controlled INSERT INTO cot_cache with attacker-chosen row values - confirming genuine POP-chain exploitation, with further impact (including potential RCE) contingent on other gadget chains available in a given Cotonti installation's loaded classes. A third sink in DeleteAction.php contains the identical unserialize() pattern but is gated behind an admin-only authorization check and is not reachable by ordinary members.
AnalysisAI
PHP Object Injection in Cotonti CMS's Comments plugin grants any authenticated member a deserialization primitive reachable via two default-accessible sinks, with a working POP chain already demonstrated by the researcher. The ci POST parameter in CreateAction.php and the cb parameter in EditAction.php are both base64-decoded and passed to unserialize() without an allowed_classes restriction, allowing instantiation of any class loaded in the PHP runtime. A proof-of-concept using Cotonti's built-in MySQL_cache class was confirmed to trigger attacker-controlled SQL INSERT operations via __destruct()->flush(); further impact including RCE is contingent on additional gadget chains available in a given installation. No public exploit code has been released and no CISA KEV listing exists at time of analysis.
Technical ContextAI
Cotonti is an open-source PHP CMS (CPE: cpe:2.3:a:cotonti:cotonti:*:*:*:*:*:*:*:*, wildcard version range). CWE-502 (Deserialization of Untrusted Data) describes the root cause: PHP's native unserialize() function reconstructs arbitrary class instances from attacker-controlled input unless constrained via the allowed_classes parameter introduced in PHP 7.0. Without this argument, any class present in the running PHP process can be instantiated - the classic PHP Object Injection (POI) primitive. The first vulnerable sink is unserialize(base64_decode($ci)) in plugins/comments/controllers/actions/CreateAction.php, where the ci POST parameter is fetched via cot_import('ci', 'P', 'TXT') - a trim-only sanitization that does nothing to block a valid serialized string. The second is unserialize(base64_decode($this->comeback)) in EditAction.php's prepareComeBack() method. The demonstrated POP chain exploits MySQL_cache's __destruct()->flush() call sequence to reach an attacker-controlled INSERT INTO cot_cache. A structurally identical third sink in DeleteAction.php is gated behind an admin-only check and is not reachable by ordinary members.
RemediationAI
No vendor-released patched version has been identified at time of analysis; monitor https://github.com/Cotonti/Cotonti for upstream commits. The definitive code-level fix is to pass an explicit second argument to every unserialize() call in the Comments plugin: unserialize(base64_decode($ci), ['allowed_classes' => false]) blocks all object instantiation (and is appropriate if the data is expected to be a scalar or array), or supply a strict allowlist of safe classes if object deserialization is genuinely required by design. As a compensating control with functional trade-offs, administrators can change the Auth_members => 'RW' default in plugins/comments/comments.setup.php to restrict comment write access to a higher-trust group - this shrinks the attacker pool to accounts you explicitly trust, but alters site commenting behavior. Disabling the Comments plugin entirely eliminates exposure from both member-reachable sinks with no residual risk from those code paths. The DeleteAction.php sink is admin-gated and does not require emergency prioritization for non-admin accounts.
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
Same weakness CWE-502 – Deserialization of Untrusted Data
View allSame technique Deserialization
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-53379
GHSA-rm37-v7mc-6795