
phpMyAdmin 5.2.3 - 高 - リモート - 残存 - setup/validate が依然として到達可能
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-setup-validate
解説記事: https://abraxaslabs.tech/research/phpmyadmin-setup-validate
クラス: SSRF 到達性: リモート
phpMyAdmin 5.2.3(タグ RELEASE_5_2_3、コミット 962857e)。config.inc.php が存在する場合、setup/index.php は停止する。しかし setup/validate.php は停止しない。これは依然として $isMinimumCommon の下で読み込まれ、公開ログインページから CSRF トークンを取得し、JSON の values フィールドにあるホスト、ポート、ユーザー、パスワードに対して Validator::testDBConnection -> mysqli_connect を呼び出す。
未認証のクライアントは / に GET してセッション Cookie とトークンを取得し、その後 setup/validate.php に id=Server と任意の Servers/1/host および Servers/1/port を付けて POST する。phpMyAdmin ホストはそのアドレスに対して TCP の MySQL ハンドシェイクを開始する。これが MySQL プロトコルを介した SSRF である。内部の 3306、内部サーバーに対するクレデンシャルスタッフィング、タイミングと mysqli エラーによるポートオラクルが該当する。そのポート上で MySQL を話す何かが存在しない限り、HTTP メタデータ SSRF ではない。また hide_db はユーザー正規表現を preg_match に補間する。このラボではその ReDoS 経路は実行していない。
公式の phpmyadmin:5.2.3 イメージは setup/ を削除する。この残存物は、そのディレクトリが依然としてウェブルート内に存在する場合にのみ該当し、これはインストール後に残る一般的な残存物である。ラボではピンが RELEASE_5_2_3 と一致するように、5.2.3 の tarball から setup/ を復元する。
PMASA-2016-44 / CVE-2016-6621 は一部の setup SSRF をカバーしていた。「config が存在する場合に setup を無効化する」チェックは validate.php / config.php には適用されていなかった。
| ID | CVE 未割当 |
| クラス | SSRF(MySQL プロトコル) |
| 到達性 | リモート(setup/ が依然としてウェブから到達可能な場合は未認証) |
| CWE | CWE-918 |
| CVSS | High: 7.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N |
| 製品 | phpMyAdmin |
| 影響範囲 | 5.2.3 タグ RELEASE_5_2_3(962857e)で setup/ がドキュメントルートに残存しているもの |
| 認証 | 未認証。公開ログインページから取得した CSRF トークン。MySQL ログインは不要。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:19230 のみ |
残存する setup/ ツリーに到達できる者は誰でも、phpMyAdmin ホストに対して任意のホストとポートへの MySQL プロトコル TCP 接続を開始させることができる。
| 権限 | メソッド / パス | ラボ実証済みか推測か |
|---|---|---|
| PMA ホストから攻撃者の host:port への TCP 接続を開く(外向き接続の完全性、そのポートの偵察) | 未認証の POST /setup/validate.php に id=Server、Servers/1/host + Servers/1/port、および GET / から取得したトークンを付与 | ラボ実証済み。oracle:13306 上のオラクルが PMA コンテナからの PMA-SETUP-VALIDATE-WITNESS を記録した |
| validate が有効なまま setup UI が無効であることを確認 | GET /setup/index.php | ラボ実証済み。ボディに「setup is disabled」/ 設定が既に存在する旨が含まれる |
| ログインページの CSRF トークンなしではフェイルクローズする | 同じ POST を token なしで実行 | ラボ実証済み。オラクルへのヒットはゼロ |
| mysqli エラーとタイミングによるポート / クレデンシャルオラクル | 同じ testDBConnection | 推測。ラボのボディは、オラクルが受け入れてから閉じた後に mysqli_connect(): (HY000/2006): MySQL server has gone away であった |
| 内部の 3306 と MySQL で通信し、POST されたユーザー/パスワードを試行 | 同じ mysqli_connect | 推測。ラボの db サービスには向けていない |
ユーザー正規表現を補間する validateRegex による ReDoS | id=Servers/1/hide_db | 推測。実行していない |
このラボではクローズ済み: HTTPメタデータSSRF(ハンドシェイクはMySQLであり、GET /latest/meta-data ではない)、未認証のPMAログイン、OSシェル、そしてセットアップウィザード自体(index.php は無効のまま)。setup/ がデプロイされていない場合(公式イメージのデフォルト)はFAIL。
RELEASE_5_2_3 に対する8並列のソース探索。setup/index.php には設定ファイル存在時の致命的エラーがある。setup/validate.php にはない。setup/lib/common.inc.php は $isMinimumCommon を設定し、CONFIG_FILE を探さない。
誤った方向性: 公式イメージをこの残存物とみなすこと(公式イメージは setup/ を削除する)、ログインページのトークンなしでPOSTすること(オラクルヒットはゼロ)、これをHTTPメタデータSSRFとみなすこと(ハンドシェイクはMySQL)。
python3 phpmyadmin-setup-validate-Abraxas-Labs.py
または
cd lab
./run.sh
ループバックのみ: http://127.0.0.1:19230。Compose プロジェクト phpmyadmin-setup-validate。Dockerfile は 5.2.3 tarball から setup/ を復元し、ポート 13306 で TCP オラクルを実行します。ウィットネス PMA-SETUP-VALIDATE-WITNESS。
SUCCESS phpmyadmin-setup-validate how=live tcp=yes setup-index-disabled=yes PMA-SETUP-VALIDATE-WITNESS
file_exists(CONFIG_FILE) の致命的エラーを setup/lib/common.inc.php に配置し、すべてのセットアップスクリプトが停止するようにします。testDBConnection のホストを制限します。ユーザー文字列から preg_match のデリミタを構築しないでください。
962857e)setup/index.php の設定存在時の致命的エラーsetup/validate.php にそのチェックがないlibraries/classes/Config/Validator.php の testDBConnection / mysqli_connectGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用。保証なし。