
phpMyAdmin 5.2.3 - 高 - リモート - SQLi - 認証プラグイン識別子が引用符で囲まれていない
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
解説記事: https://abraxaslabs.tech/research/phpmyadmin-auth-plugin-unquoted
クラス: SQLi 到達範囲: リモート
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
パスワード変更はデフォルトで有効です。UserPassword.php は POST の authentication_plugin を、許可リストもクォートもなしに ALTER USER ... IDENTIFIED WITH へコピーします。同じ文の中のユーザー名、ホスト、パスワードは escapeString を通ります。MySQL 8 では、投稿されたプラグインが現在のものと異なる場合に WITH 句が出力されます。
サインイン済みの phpMyAdmin ユーザーが、パスワード変更フォームを通じて自身の ALTER USER に SQL を注入します。プラグインフィールド内の追加 SQL はプラグイン名ではなく SQL として扱われます。
| ID | CVE 未割当 |
| クラス | SQLi |
| 到達範囲 | リモート (認証済み Cookie ログイン、パスワード変更有効) |
| CWE | CWE-89 |
| 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 ログイン。$cfg['ShowChgPassword'] はデフォルトで true。認証タイプは config ではない |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
サインイン済みの phpMyAdmin ユーザーが、パスワード変更フォームを通じて自身の ALTER USER に SQL を注入できます。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
IDENTIFIED WITH に追加 SQL を送信 | authentication_plugin を伴う POST index.php?route=/user-password | phpMyAdmin が構築する文の完全性 | ラボ実証。生の POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ が SQL ボックス内にクォートされずに現れる |
| その追加 SQL を MySQL に SQL として解析させる | 同じ文が mysqld に到達 | ユーザー接続の完全性 | ラボ実証。general log はプラグイン sha256_password を保持し、コメントを破棄した。このユーザーには CREATE USER 権限がないため 1227 |
| ブレイクアウトが解析されれば追加の句や追加アカウント | 同じシンク。スタッククエリはドライバに依存 | 他のアカウントの完全性 | 推測。このラボでは 2 つ目の文の実行や別アカウントの作成は行っていない |
| ユーザー追加/編集時の同じ連結 | Privileges.php の IDENTIFIED WITH / MariaDB の VIA | 権限付与者が構築する文の完全性 | 推測される類似箇所。ラボの POST はパスワード変更のみ |
この経路で成立しないもの: 未認証での利用 (Cookie ログインが必要)、config 認証 (パスワード変更が非表示)、RCE、MySQL 8 で GRANT なしのプラグイン変更が成功すること (CREATE USER なしでは 1227)。ユーザー名、ホスト、パスワードはエスケープされたままです。自身のパスワード変更には GRANT は不要です。残る問題はプラグインの自由な差し替えではなく、クォートされていないプラグインフィールドです。
同じピン: WebAuthn CustomServer の残存問題。
phpmyadmin/phpmyadmin RELEASE_5_2_3 をピン留めしました。PMASA-2025-1/2/3 はすでに 5.2.2 に含まれています。パスワード変更は依然として次のように構築されます:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin は $_POST['authentication_plugin'] です。MySQL 5.7.37+ および 8.0 では、プラグインが変更されない限り WITH を省略します。別の名前を POST すると、その句が戻ってきます。
すでに記録されている誤った道筋: MySQL 1227 を残存物の失敗として扱うこと(これは追加 SQL がパースされた証拠です); MySQL 8 で GRANT なしのプラグイン変更を主張すること; config-auth をスコープ内として扱うこと; リバースシェル。茶番です。
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
対象は http://127.0.0.1:19260 のみ。イメージは phpmyadmin:5.2.3 と mysql:8.0。Compose プロジェクトは phpmyadmin-auth-plugin-unquoted。実行後、スタックは破棄される。
appuser として Cookie ログイン。/user-password に authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ を POST。PMA の SQL クエリボックス: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'。MySQL の general log はコメントを解析し、IDENTIFIED WITH 'sha256_password' を保存する。ユーザー名はクォートされる。
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
SHOW PLUGINS のプラグイン名を許可リスト化する。POST を IDENTIFIED WITH、VIA、plugin= に絶対に補間しないこと。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。