
phpMyAdmin 5.2.3 - 高 - リモート - SQLi - 認証プラグイン識別子が引用符で囲まれていない
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Class: SQLi Reach: Remote
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
パスワード変更はデフォルトで有効です。UserPassword.php は POST の authentication_plugin を、許可リストもクォートもなしに ALTER USER ... IDENTIFIED WITH へコピーします。同じステートメント内のユーザー名、ホスト、パスワードは escapeString を通ります。MySQL 8 では、POST されたプラグインが現在のものと異なる場合に WITH 句が出力されます。
サインイン済みの phpMyAdmin ユーザーが、パスワード変更フォームを通じて自身の ALTER USER に SQL を注入します。プラグインフィールド内の追加 SQL は SQL であり、プラグイン名ではありません。
| ID | CVE 未割当 |
| Class | SQLi |
| Reach | Remote (認証済み 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 |
| Product | phpMyAdmin |
| Affected | 5.2.3 タグ RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | 認証済み Cookie ログイン。$cfg['ShowChgPassword'] はデフォルトで true。認証タイプは config ではない |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
サインイン済みの phpMyAdmin ユーザーが、パスワード変更フォームを通じて自身の ALTER USER に SQL を注入できます。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
IDENTIFIED WITH に追加 SQL を送信 | POST index.php?route=/user-password と authentication_plugin | 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 leftover。
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 認証を対象範囲内とみなすこと、リバースシェル。茶番です。
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 ログイン。authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ で /user-password に 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 を参照。ループバックラボのみ。無保証。