
phpMyAdmin - 高 8.1 - 認証済み POST /index.php - 2FA バイパス
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · PMA-5.2.3-WebAuthn-2FA
phpMyAdmin 5.2.3 - phpMyAdmin
デフォルトの tarball。web-auth/webauthn-lib は suggest / require-dev です。composer install --no-dev ではインストールされません。そのため createServer は CustomServer を使用します。このクラスは response.signature をパースするだけで(フィールドが存在しデコードできる必要があります)、COSE 検証を一切行いません。保存された credentialPublicKey を決して使用しません。製品自身の CustomServerTest は、公開鍵なしのアサーションを受け入れます。
MySQL パスワードの後、challenge、origin、rpIdHash、user-present に一致する限り、でたらめな WebAuthn 署名でも完全な phpMyAdmin セッションが得られます。それはすなわちデータベースです。
| ID | CVE 未割当 |
| CWE | CWE-347, CWE-287 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 製品 | phpMyAdmin |
| 影響範囲 | 5.2.3 デフォルト tarball(web-auth/webauthn-lib が存在しない) |
| 認証 | MySQL パスワード、その後 WebAuthn をスキップ |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
攻撃者には依然として MySQL パスワードが必要です(Cookie ログイン)。そのパスワードの後、challenge、origin ホスト、rpIdHash、user-present、登録済み credential id に一致する webauthn_request_response を、でたらめな署名とともに POST します。すると通常の UI に入り込みます。2FA は突破されます。これはデータ上での RCE であり、ホスト上の PHP シェルではありません。
実際に web-auth/webauthn-lib をインストールしている場合、WebauthnLibServer を使用しているため、このバグの影響は受けません。
createServer を読み、次に parseAndValidateAssertionResponse を読み、さらに公開鍵を渡さないユニットテストを読みました。構造的チェックは実際に機能しています。allowCredentials 内の credential id、clientData.type == webauthn.get、セッションとの challenge 一致、origin ホスト、rpIdHash、user-present です。署名はパースされるだけで無視されます。
最初にこれに向けたクライアントは礼儀正しいものでした。事前のパスワードセッションなしで WebAuthn JSON を POST しました。ログインページが返りました。構造的チェックすら満たさない署名で route=/ を POST しました。2FA 画面のままです。webauthn_request_response は依然として HTML 内にあります。
すでに記録済みの誤った道筋:Webauthn\Server が存在する(誤ったサーバークラス);challenge がこのセッションのものではない;origin ホストの不一致;user-present フラグがクリア;credential id が allowCredentials にない;未認証で MySQL パスワードなし;リバースシェル。すべて芝居です。手がかりは 2FA フィールドが消え、phpMyAdmin のナビゲーションページが表示されることです。
クライアントのバグは製品のバグに見えます。http.client をシャドーするヘルパーはパケットを一切送信しません。HTTPResponse に対する .recv() は .read() ではありません。これは一度だけ言及します。時間を浪費し、一瞬だけ phpMyAdmin が正常であるかのように見えたからです。
そして:username/password/token を POST。2FA ページからセッション challenge を取得。偽造アサーションを POST。still_2fa=False landed=True。ラボの Dockerfile は 5.2.3 をコピーし、composer install --no-dev を実行した後、vendor/web-auth を削除して CustomServer が使用されるようにします。最後の php -r は Webauthn\Server が存在すれば終了コード 1 で終了します。ライブラリがまだ存在する場合、イメージのビルドは失敗しなければなりません。init.sql はハードウェアキーなしで appuser の WebAuthn 2FA を登録します。
cd lab
./run.sh
対象は http://127.0.0.1:18080 のみです。まず Dockerfile の隣に phpMyAdmin 5.2.3 を src/ として配置してください。
password-login status=200 webauthn=True
2fa-post status=200 still_2fa=False landed=True
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
web-auth/webauthn-lib をインストールして createServer がこのライブラリを使用するようにするか、CustomServer 内で保存済みの公開鍵に対して response.signature を実際に COSE 検証してください。それまでは、WebAuthn 2FA を無効にするか、この phpMyAdmin を公開しないでください。
CustomServer::parseAndValidateAssertionResponse · WebAuthn::createServer · CustomServerTestGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。