
phpMyAdmin 5.2.3 - 高 - リモート - 2FA - config/set が二要素認証をクリアする
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
解説記事: https://abraxaslabs.tech/research/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 のいずれのプロンプトも表示されません。単一リクエストのスキップではなく、永続的な剥奪です。
| 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。ラボでは、ハードウェアキーなしで Settings が 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) はその後 config_data['2fa'] を unset します。そのパスのデフォルトも null であるためです。
Settings -> Two-factor は対照的です。TwoFactorController は TwoFactor::check(true) が true を返すまで configure('') を実行しません。
すでに記録済みの誤った道筋:Settings の 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) を必須とする。Settings パスを唯一の書き込み経路として維持する。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。