
phpMyAdmin 5.2.3 - 高 - リモート - SQLi - Designer JSON 未サニタイズ識別子
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
解説記事: https://abraxaslabs.tech/research/phpmyadmin-designer-json-sqli
クラス: SQLi 到達範囲: リモート
phpMyAdmin 5.2.3(タグ RELEASE_5_2_3、コミット 962857e)。Designer AJAX の save_setting_value は設定ブロブを json_encode し、コントロールユーザーのリンクに対するシングルクォート付きの UPDATE/INSERT に連結します。ユーザー名はエスケープされます。JSON はエスケープされません。json_encode はシングルクォートをエスケープしません。
サインイン済みのユーザーが index.php?route=/database/designer に operation=save_setting_value と、value にクォートを含めて POST します。すると queryAsControlUser がその文字列を pma コントロールユーザーとして pma__designer_settings に対して実行します。このアカウントは設定ストレージであり、ログイン中の SQL ボックスではありません。phpMyAdmin 6.x では ControlUser 上でこのブロブを quoteString でラップしています。5.2.3 は依然として生の連結を行います。
過去の Designer 関連 CVE(2016-6616、2019-11768、2019-18622)はユーザー名 / データベース名に関するものでした。この残存脆弱性は JSON の settings_data カラムに関するものです。
| ID | CVE 未割当 |
| クラス | SQLi(pma__designer_settings に対するコントロールユーザー) |
| 到達範囲 | リモート(認証済み Cookie ログイン。Designer と pma__designer_settings が有効) |
| 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(962857e) |
| 認証 | 認証済み Cookie ログイン。Designer と pma__designer_settings が有効。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:19220 のみ |
Designer を開けるサインイン済みの phpMyAdmin ユーザーは、pma__designer_settings に対して コントロールユーザー として SQL を注入できます。
| 権限 | メソッド / パス | ラボで実証済みか推測か |
|---|---|---|
| コントロールユーザーの UPDATE/INSERT 文字列を破壊する(pmadb SQL の整合性) | POST index.php?route=/database/designer に operation=save_setting_value と、value にクォートを含めて送信 | ラボで実証済み。一般ログ: SET settings_data = '{"snap_line":"PMA-DESIGNER-JSON-SQLI-WITNESS'#" }' が生のまま。quoteString は存在しない |
自身の settings_data を切り詰めて JSON でなくする(自身の行の整合性) | 同じ POST。# がステートメントの残りをコメントアウトする | ラボで実証済み。appuser のブロブにウィットネスが含まれ、有効な JSON ではない。正常な保存 grid-ok は失われる |
| スタッククエリなしで他ユーザーの designer 行を上書きする(被害者の行の整合性) | 同じ # が WHERE username = '...' をコメントアウトする | ラボで実証済み。シードした victim の {"keep":"safe"} が切り詰められたウィットネスブロブになった |
| コントロールユーザーとして追加のステートメントを実行する | コントロールの mysqli リンクがマルチクエリを許可する場合、同じシンク | 推測。デフォルトの mysqli::query は単一ステートメント。ここでは有効化されていない |
他の pmadb テーブル(bookmarks、history、pma__userconfig)に到達する | スタッククエリまたは書き込み型のブレイクアウトが可能な場合のみ | 推測。このラボのコントロールユーザーは phpmyadmin.* の DML のみを持つ |
このラボでクローズ済み: 未認証アクセス、サインイン済み appuser の SQL ボックス(appdb のみ。appuser は phpmyadmin に対する GRANT を持たない)、OS シェル、スタッククエリ。pmadb / designer settings が無効な場合、この機能はノーオペレーションになる(これは FAIL であり、この残存脆弱性ではない)。
RELEASE_5_2_3 を対象に 8 つの並列ソースハントを実施しました。saveSetting は json_encode を '...' に連結します。ユーザー名は escapeString です。6.x はすでにこのブロブを quoteString しています。5.2.3 はそうしていません。
不正なターン:username へのインジェクション(エスケープされている);#1064 を期待する(# が残りをコメントアウトするため、MySQL は切り詰められた UPDATE を受け入れる);スタッククエリを実証済みとみなす(mysqli のデフォルトは単一ステートメント)。
python3 phpmyadmin-designer-json-sqli-Abraxas-Labs.py
または
cd lab
./run.sh
ループバックのみ: http://127.0.0.1:19220。イメージ phpmyadmin:5.2.3 と mysql:8.0。Compose プロジェクト phpmyadmin-designer-json-sqli。ウィットネス PMA-DESIGNER-JSON-SQLI-WITNESS。
SUCCESS phpmyadmin-designer-json-sqli version=5.2.3 how=live raw-concat=yes truncated=true sql-error=false quoteString=no PMA-DESIGNER-JSON-SQLI-WITNESS
JSON blob に対して quoteString(..., ControlUser) / escapeString を使用する。これは RecentFavoriteTable::saveToDb() や、このカラムに対する phpMyAdmin 6.x と同じ方法である。json_encode の出力をシングルクォートで囲んだ SQL リテラルの中に入れてはならない。
962857e)libraries/classes/Database/Designer/Common.php の saveSettingControllers/Database/DesignerController.php の POST operation=save_setting_valueGET|POST /database/designerGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。