
phpMyAdmin 5.2.3 - 高 - リモート - SQLi - Designer JSON 未サニタイズ識別子
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
Class: SQLi Reach: Remote
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 未割当 |
| Class | SQLi (pma__designer_settings 上のコントロールユーザー) |
| Reach | Remote (認証済み 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 |
| Product | phpMyAdmin |
| Affected | 5.2.3 タグ RELEASE_5_2_3 (962857e) |
| Auth | 認証済み Cookie ログイン。Designer + pma__designer_settings が有効。 |
| License | GNU Affero GPL v3.0 |
| Lab | 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 のブロブに witness が含まれ、有効な JSON ではない。クリーンな保存 grid-ok は消える |
| スタッククエリなしで他ユーザーの designer 行を上書きする (被害者行の完全性) | 同じ # が WHERE username = '...' をコメントアウトする | ラボで実証済み。シードした victim の {"keep":"safe"} が切り詰められた witness ブロブになった |
| コントロールユーザーとしての追加ステートメント | コントロールの 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 はしていない。
誤った方向: ユーザー名への注入 (エスケープされている)。#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。Witness 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 ブロブに対する 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 を参照。ループバックラボのみ。無保証。