Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
phpmyadmin-vqb-xss — phpMyAdmin 5.2.3 - 高 - リモート - XSS - Designer Visual Query Builder | Kitploit
ツール/GitHubGitHub/abraxas/phpmyadmin-vqb-xss
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテストラボと実践
GitHubabraxas/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

phpMyAdmin 5.2.3 - 高 - リモート - XSS - Designer Visual Query Builder

リポジトリを見る
49日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Abraxas Labs - phpmyadmin-vqb-xss

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  phpmyadmin-vqb-xss

解説記事: https://abraxaslabs.tech/research/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

クラス: 蓄積型XSS 到達範囲: リモート

phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin

js/src/designer/history.js は、ビジュアルクエリ履歴を innerHTML で構築します。カラム名は $('<div/>').text(...).html() を経由します。テーブル名は経由しません。TableName は依然として < と > を許可しています。共有データベース上で CREATE TABLE 権限を持つ低権限アカウントが、HTML識別子を仕込みます。高権限ユーザーがDesignerを開くと、getTableName() がページ上に存在し、DesignerHistory.display() がそれを #ab に書き込みます。

phpMyAdminオリジンにおける蓄積型XSS。PMASA-2025-1と同じクラスだが、異なる機能。check-tablesの見出しはエスケープされていた。この経路はされていなかった。

IDCVE未割当
クラス蓄積型XSS
到達範囲リモート(認証済み CREATE TABLE、被害者がDesignerを開く)
CWECWE-79
CVSSHigh: 8.0 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
製品phpMyAdmin
影響を受けるバージョン5.2.3 タグ RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
認証認証済み。攻撃者は、被害者がDesignerで開くデータベースに対する CREATE TABLE 権限を必要とする
ライセンスGNU Affero GPL v3.0
ラボ127.0.0.1 のみ

攻撃者ができること

HTMLのテーブル名を仕込み、高権限ユーザーがそのデータベースでDesignerを開き、ビジュアルクエリ履歴をレンダリングするのを待ちます。

権限メソッド / シンク偵察 / 整合性 / 可用性ラボ実証または推測
phpMyAdminオリジンにマークアップを注入DesignerHistory.display() が getTab() を #ab のinnerHTMLに連結被害者オリジンの整合性ラボ実証済み。phpmyadmin:5.2.3上の実際の history.js。<h3> に <i id="pma-vqb"> が含まれていた
Designerの table_name 属性から脱出database_tables.twig の small_tab_pref_1 が designerTable.getTableName() を使用Designer DOM内の生のMySQL名の偵察ラボ実証済み。生の識別子として読み取り可能
被害者のセッションCookieとCSRF token を読み取る履歴がレンダリングされると実行される同一オリジンのスクリプト被害者のPMAセッションの偵察PMAオリジンにおける蓄積型XSSからの推測。このラボではスクリプトではなく <i> マーカーを使用
被害者のMySQLアカウントとしてSQL実行、ユーザー管理、エクスポートトークン付きPOST /sql、/server/privileges、エクスポートそのMySQLアカウントが触れられるものすべての整合性推測。PMASA-2025-1と同じ影響クラス
2FA / userconfigの変更被害者としてPOST /config/set被害者の設定ストアの整合性推測。同種の残存問題であり、このラボの対象ではない

この残存問題について除外済み: 未認証アクセス、OS RCE、VQBの OK ボタン経路。.small_tab_pref_click_opt は table_name を事前にエスケープし、Twigがさらに自動エスケープするため、そのクリックは現在エンティティを getTab() に渡します。これは history.js の修正ではありません。カラムセルはテキストエスケープされたままです(c<b id=pma-col>y、<b id="pma-col"> ノードはなし)。

同じピン: WebAuthn CustomServerの残存問題。

発見の経緯

phpMyAdmin RELEASE_5_2_3 をピン留めしました。PMASA-2025-1/2/3 はすでに5.2.2に含まれています。Designerは依然としてVQB履歴のHTMLを手作業で構築しています。

js/src/designer/history.js(js/dist/designer/history.js として出荷):

temp = historyArray[i].getTab();
str += '<h3 class="tiger"><a href="#">' + temp + '</a></h3>';
// ...
'<td width="175" style="padding-left: 5px">' + $('<div/>').text(historyArray[i].getColumnName()).html() + '<td>';

libraries/classes/Dbal/TableName.php は空でないこと、最大64文字、末尾にスペースがないことのみをチェックします。< と > は合法です。MySQL は引用符付き識別子内でこれらを受け入れます。

templates/database/designer/database_tables.twig は designerTable.getTableName() を .small_tab_pref_1 上の table_name にコピーします。VQB のオプションセルは、同じ名前の事前エスケープされたコピーを使用します。

すでに記録済みの誤った方向性: 二重エスケープされたオプションボタンの属性を修正とみなすこと(そうではない — small_tab_pref_1 は依然として生の名前を公開しており、history.js がシンクである); カラムヘルパーがテーブル名をカバーしているとみなすこと; 未認証の XSS を主張すること; リバースシェル。茶番です。

ラボ

python3 phpmyadmin-vqb-xss-Abraxas-Labs.py
# or: cd lab && ./run.sh

対象は http://127.0.0.1:19250 のみ。イメージは phpmyadmin:5.2.3 と mysql:8.0。Compose プロジェクトは phpmyadmin-vqb-xss。Playwright Chromium は poc サービス内で動作。実行後にスタックは破棄される。

2 ユーザーが shareddb を共有。低権限の creator が CREATE TABLE \tx` (`cy` INT)を実行。高権限のvictim が phpMyAdmin にログインし、query=1で Designer を開く。稼働中のhistory.js はコンテナからのコピー(h3-unescaped=yes、カラムヘルパーあり)。Chromium はページ上の getTableName()から取得したテーブル名でDesignerHistory.display()` を呼び出す。

結果: #ab h3.tiger の innerHTML は <a href="#">t<i id="pma-vqb">x</i></a>。カラム td のテキストは c<b id=pma-col>y で、b#pma-col ノードは存在しない。

SUCCESS phpmyadmin-vqb-xss h3-markup=yes col-escaped=yes how=live PMA-VQB-XSS-WITNESS

修正方法

getTab() を <h3> に連結する前に、$('<div/>').text(temp).html() または Functions.escapeHtml でエスケープしてください。1つの属性に対する Twig の二重エンコードに依存しないでください。カラム名ヘルパーはモデルとしてそのまま維持してください。

参考情報

  • github.com/phpmyadmin/phpmyadmin タグ RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
  • js/src/designer/history.js
  • libraries/classes/Dbal/TableName.php
  • 近接する修正済み箇所(本パスとは別): PMASA-2025-1 Check-tables の見出し
  • 同一ピン: PMA-5.2.3-WebAuthn-2FA
  • CWE-79

ライセンス

GNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。

ツールをダウンロード