
phpMyAdmin 5.2.3 - 高 - リモート - 2FA - config/set が二要素認証をクリアする
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
クラス: 権限の残留 / ステップアップ欠如 到達範囲: リモート
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set は、2fa を含む許可リスト内の任意の設定を書き込みます。UserPreferences::persistOption は検証を行いません。設定 -> 二要素認証は、要素を削除する前に TwoFactor::check(true) を呼び出します。/config/set は呼び出しません。
ログイン済みセッション、またはページトークンを POST できる XSS/CSRF は、key=2fa と value=null を送信できます。次回のパスワードログインでは、TOTP、WebAuthn、Simple のプロンプトが表示されません。1 回のリクエストスキップではなく、永続的な削除です。
| ID | CVE 未割り当て |
| クラス | 権限の残留 / ステップアップ欠如 |
| 到達範囲 | リモート (認証済み Cookie ログイン、CSRF トークンが必要) |
| CWE | CWE-620 |
| 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 タグ RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| 認証 | Cookie ログイン。CSRF トークンが必要。XSS または CSRF を永続的な 2FA 削除に完結させる |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
TOTP、WebAuthn、Simple 確認フィールドを提示せずに、phpMyAdmin アカウントから 2FA を削除します。次回のパスワードログインはパスワードのみになります。その MySQL ユーザーとしての完全な PMA (SQL、ユーザー、エクスポート)。
| 権限 | メソッド / パス | 偵察 / 完全性 / 可用性 | ラボで実証済みまたは推測 |
|---|---|---|---|
2fa を null に永続化し、pmadb から第二要素を削除 | 認証済み POST index.php?route=/config/set key=2fa value=null と有効な token | 設定ストアの完全性 | ラボで実証済み。success:true、pmadb の config_data が [] に |
| その書き込み後にパスワードのみでログイン | 新しい Cookie セッション、同じ MySQL ユーザー | ログインパスの完全性 | ラボで実証済み。2fa_confirm なし、通常の UI に到達 |
| 以降のログインで 2FA が消える間、現在のセッションを維持 | 同じハンドラ。persistOption はストアを書き込み、ライブの two_factor_check フラグは書き込まない | 以降のセッションの完全性 | ラボで実証済み。セッション A は維持。セッション B は 2FA を確認済み。セッション C は未確認 |
| ページトークン付きで POST できる保存型 XSS または CSRF からの連鎖 | 同じレビューの残留、このラボではない | 同一オリジン POST 後の 2FA の完全性 | 推測 |
| 設定から 2FA を削除 | POST /preferences/two-factor 2fa_remove=1 | 文書化された UI 経由の 2FA の完全性 | ラボで実証済みのクローズ。要素なしでは、PMA は確認ページを表示し、pmadb には依然 backend=simple がある |
この残留でクローズ済み: 未認証アクセス、MySQL パスワードのスキップ、OS RCE、他ユーザーの pmadb 行の読み取り。残留 #1 (CustomServer 署名) は不要でした。MySQL パスワードはスキップしていません。
同じピン: WebAuthn CustomServer 残留。
PMASA-2025-1/2/3 の後に 5.2.3 をピン留めしました。Cookie 認証、pmadb pma__userconfig。ラボは、設定がハードウェアキーなしで Simple バックエンドを登録できるようにするためだけに $cfg['DBG']['simple2fa'] を有効にします。TOTP と WebAuthn は同じ 2fa 設定キーに存在します。
SetConfigController は key と JSON value を受け取り、Config::setUserValue を呼び出します。UserPreferences::persistOption は「検証は行われません!」と文書化されています。apply() は 2fa を許可リストに含めるため、キーは未知の設定として破棄されません。
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') は PHP の null です。persistOption('2fa', null, $default) は、そのパスのデフォルトも null であるため、config_data['2fa'] を unset します。
設定 -> 二要素認証は対照的です。TwoFactorController は TwoFactor::check(true) が true を返すまで configure('') を行いません。
すでに記録済みの誤った方向: 設定の 2fa_remove を穴と見なす (依然として要素を要求する)、未認証アクセスを主張する、MySQL パスワードのスキップを主張する、これを残留 #1 (CustomServer) と見なす、リバースシェル。茶番です。
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
ターゲットは http://127.0.0.1:19280 のみ。Compose プロジェクト phpmyadmin-config-set-2fa。ピン RELEASE_5_2_3。run.sh はそのタグをイメージ用に lab/src/ へコピーまたはクローンします。スタックは実行後に破棄されます。
設定で Simple 2FA を登録しました。2 番目のブラウザが 2fa_confirm ページに到達しました。要素なしの 2fa_remove の POST は確認 UI に留まり、pmadb に backend=simple を残しました。その後 /config/set の POST が success:true を返し、pmadb が [] になり、次のログインは通常の UI に到達しました。
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
/config/set で 2fa (およびその他の認証キー) を拒否します。2FA の変更前に TwoFactor::check(true) を要求します。設定パスを唯一の書き込み元として維持します。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。