Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
phpmyadmin-webauthn — phpMyAdmin 5.2.3 - High - Remote - 2FA skip - WebAuthn ceremony can be skipped | Kitploit
Tools/GitHubGitHub/abraxas/phpmyadmin-webauthn
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingAuthenticationLabs & Practice
GitHubabraxas/phpmyadmin-webauthn

phpmyadmin-webauthn

phpMyAdmin 5.2.3 - High - Remote - 2FA skip - WebAuthn ceremony can be skipped

View Repository
94 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - phpmyadmin-webauthn

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  phpmyadmin-webauthn

phpmyadmin-webauthn

Class: 2FA bypass Reach: Remote

phpMyAdmin 5.2.3 (tag RELEASE_5_2_3). Default tarball. web-auth/webauthn-lib is suggest / require-dev. composer install --no-dev does not install it. createServer therefore uses CustomServer. That class parses response.signature (the field must exist and decode) and never COSE-verifies it. It never uses the stored credentialPublicKey. The product's own CustomServerTest accepts an assertion with no public key.

Structural checks are real: credential id in allowCredentials, clientData.type == webauthn.get, challenge matches session, origin host, rpIdHash, user-present. Signature is parsed and ignored. After the MySQL password, a garbage WebAuthn signature that still matches those fields is a full phpMyAdmin session. That is the database. If you actually installed web-auth/webauthn-lib, you are on WebauthnLibServer and not this bug.

IDno CVE yet
Class2FA bypass / missing signature verify
ReachRemote (cookie login, then WebAuthn skipped)
CWECWE-347, CWE-287
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
ProductphpMyAdmin
Affected5.2.3 tag RELEASE_5_2_3. Default tarball / composer install --no-dev
AuthCookie login (MySQL password), then WebAuthn skipped
LicenseGNU Affero GPL v3.0
Lab127.0.0.1:18080 only

What an attacker can do

They still need the MySQL password (cookie login). After that password, they POST webauthn_request_response with matching challenge, origin host, rpIdHash, user-present, enrolled credential id, and a garbage signature. They land in the normal UI. 2FA is gone. That is the database (SQL, users, export), not a PHP shell on the host.

If you actually installed web-auth/webauthn-lib, you are on WebauthnLibServer and not this bug.

PrivilegeMethod / pathLab-proven or inferred
Complete WebAuthn 2FA without the authenticator (integrity of second factor)POST webauthn_request_response after password, garbage signatureLab-proven. still_2fa=False landed=True
Full PMA as that MySQL user (integrity + recon of the SQL box)same sessionLab-proven. Home UI markers present
Skip the MySQL passwordunauthenticated POSTLab-proven closed. Stays on login
Same bypass with web-auth/webauthn-lib installedWebauthnLibServerClosed. Not this leftover
OS RCE / reverse shellthis leftoverClosed

Closed on this leftover: unauthenticated PMA, a PHP shell on the host, and treating a tarball that actually installed web-auth/webauthn-lib as this bug.

How I found it

I read createServer, then parseAndValidateAssertionResponse, then the unit test that does not pass a public key. Structural checks are real. Signature is parsed and ignored.

Wrong turns: POSTing WebAuthn JSON without a prior password session; a signature that failed the structural checks; Webauthn\Server still present (wrong server class); challenge not from this session; origin host mismatch; user-present flag clear; credential id not in allowCredentials.

The lab Dockerfile copies 5.2.3, composer install --no-dev, then deletes vendor/web-auth so CustomServer is the one in play. The last php -r exits 1 if Webauthn\Server exists. init.sql enrolls WebAuthn 2FA for appuser without a hardware key. The PoC POSTs signature not-a-real-signature-PMA-WEBAUTHN-BYPASS.

Lab

Clone the pin next to the Dockerfile, then run:

cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh

or from pack root after that clone:

python3 phpmyadmin-webauthn-Abraxas-Labs.py

Loopback only: http://127.0.0.1:18080. Compose project pma-webauthn-lab. Pin RELEASE_5_2_3. Do not ship src/. Witness PMA-WEBAUTHN-BYPASS.

SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature

The fix

Verify authenticatorData || SHA-256(clientDataJSON) with the stored COSE public key; bind userHandle; enforce signCount. Make web-auth/webauthn-lib a real dependency and delete CustomServer, or fail closed if the library is missing. Until then, disable WebAuthn 2FA or do not expose this phpMyAdmin.

References

  • github.com/phpmyadmin/phpmyadmin tag RELEASE_5_2_3
  • Plugins\TwoFactor\WebAuthn::createServer
  • CustomServer::parseAndValidateAssertionResponse
  • Same pin leftovers: phpmyadmin-pmadb-central-sqli · phpmyadmin-designer-json-sqli · phpmyadmin-setup-validate · phpmyadmin-csrf-sql
  • CWE-347 · CWE-287

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Download Tool