
phpMyAdmin 5.2.3 - 高 - リモート - 残存 - setup/validate が依然として到達可能
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-setup-validate
クラス: SSRF 到達範囲: リモート
phpMyAdmin 5.2.3 (タグ RELEASE_5_2_3、コミット 962857e)。setup/index.php は config.inc.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/ を削除する。この残存物は、そのディレクトリがまだウェブルートにある場合にのみ適用され、これはインストール後の一般的な残存物である。ラボは 5.2.3 tarball から setup/ を復元するため、ピンは RELEASE_5_2_3 と一致する。
PMASA-2016-44 / CVE-2016-6621 は一部のセットアップ SSRF をカバーしていた。「config が存在する場合にセットアップを無効化する」チェックは 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/ がまだ docroot にある場合 |
| 認証 | 未認証。公開ログインページからの 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 が有効なままセットアップ UI が無効であることを確認 | GET /setup/index.php | ラボで実証済み。ボディに「setup is disabled」/ configuration already exists が含まれる |
| ログインページの CSRF トークンなしでフェイルクローズ | 同じ POST、token なし | ラボで実証済み。オラクルヒットはゼロ |
| mysqli エラーとタイミングによるポート / クレデンシャルオラクル | 同じ testDBConnection | 推測。ラボのボディは、オラクルが受け入れてから閉じた後、mysqli_connect(): (HY000/2006): MySQL server has gone away だった |
| 内部の 3306 と MySQL を話し、投稿されたユーザー/パスワードを試す | 同じ 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 には config 存在時の fatal がある。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) の fatal を setup/lib/common.inc.php に置き、すべての セットアップスクリプトが終了するようにする。testDBConnection のホストを制限する。ユーザー文字列から preg_match のデリミタを構築しない。
962857e)setup/index.php の config 存在時 fatalsetup/validate.php にはそのチェックがないlibraries/classes/Config/Validator.php testDBConnection / mysqli_connectGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。