Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
phpmyadmin-vqb-xss — phpMyAdmin 5.2.3 – Hoch – Remote – XSS – Designer Visual Query Builder | Kitploit
Tools/GitHubGitHub/abraxas/phpmyadmin-vqb-xss
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsLabs & Praxis
GitHubabraxas/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

phpMyAdmin 5.2.3 – Hoch – Remote – XSS – Designer Visual Query Builder

Repository anzeigen
3vor 8 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Abraxas Labs - phpmyadmin-vqb-xss

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

Write-up: https://abraxaslabs.tech/research/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

Klasse: Stored XSS Reichweite: Remote

phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin

js/src/designer/history.js baut den Verlauf visueller Abfragen mit innerHTML auf. Spaltennamen laufen durch $('<div/>').text(...).html(). Tabellennamen nicht. TableName erlaubt weiterhin < und >. Ein Konto mit geringen Rechten und CREATE TABLE auf einer gemeinsam genutzten Datenbank platziert einen HTML-Bezeichner. Wenn ein Benutzer mit höheren Rechten den Designer öffnet, liegt getTableName() auf der Seite und DesignerHistory.display() schreibt ihn in #ab.

Ein Stored XSS im phpMyAdmin-Origin. Gleiche Klasse wie PMASA-2025-1, anderes Feature. Überschriften von Check-tables wurden escaped. Dieser Pfad nicht.

IDnoch keine CVE
KlasseStored XSS
ReichweiteRemote (authentifiziertes CREATE TABLE; Opfer öffnet Designer)
CWECWE-79
CVSSHoch: 8.0 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
ProduktphpMyAdmin
Betroffen5.2.3 Tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
Authauthentifiziert. Angreifer benötigt CREATE TABLE auf einer Datenbank, die das Opfer im Designer öffnet
LizenzGNU Affero GPL v3.0
Labnur 127.0.0.1

Was ein Angreifer tun kann

Einen HTML-Tabellennamen platzieren und dann darauf warten, dass ein Benutzer mit höheren Rechten den Designer auf dieser Datenbank öffnet und den Verlauf visueller Abfragen rendert.

RechtMethode / SinkRecon / Integrität / VerfügbarkeitIm Lab nachgewiesen oder abgeleitet
Markup in den phpMyAdmin-Origin einschleusenDesignerHistory.display() verkettet getTab() in das innerHTML von #abIntegrität des Opfer-OriginsIm Lab nachgewiesen. Live history.js auf phpmyadmin:5.2.3. <h3> enthielt <i id="pma-vqb">
Aus einem Designer-Attribut table_name ausbrechendatabase_tables.twig small_tab_pref_1 verwendet designerTable.getTableName()Recon des rohen MySQL-Namens im Designer-DOMIm Lab nachgewiesen, lesbar als roher Bezeichner
Das Session-Cookie des Opfers und das CSRF-token auslesenSame-Origin-Skript, sobald der Verlauf gerendert wirdRecon der PMA-Session des OpfersAbgeleitet aus Stored XSS im PMA-Origin. Dieses Lab verwendet einen <i>-Marker, kein Skript
SQL ausführen, Benutzer verwalten, exportieren, als das MySQL-Konto des OpfersToken-gestütztes POST /sql, /server/privileges, ExportIntegrität von allem, was dieses MySQL-Konto erreichen kannAbgeleitet. Gleiche Auswirkungsklasse wie PMASA-2025-1
2FA / userconfig ändernPOST /config/set als das OpferIntegrität des Preference-Store des OpfersAbgeleitet. Verwandter Rest, nicht dieses Lab

Ausgeschlossen bei diesem Rest: unauthentifizierter Zugriff, OS-RCE und der Pfad über die OK-Schaltfläche der VQB. .small_tab_pref_click_opt escaped table_name vorab und Twig escaped es erneut automatisch, sodass dieser Klick derzeit Entities in getTab() einspeist. Das ist keine Behebung von history.js. Spaltenzellen bleiben text-escaped (c<b id=pma-col>y, kein <b id="pma-col">-Knoten).

Gleicher Pin: WebAuthn CustomServer leftover.

Wie ich es gefunden habe

Ich habe phpMyAdmin RELEASE_5_2_3 gepinnt. PMASA-2025-1/2/3 sind bereits in 5.2.2 enthalten. Der Designer baut das VQB-Verlaufs-HTML weiterhin von Hand auf.

js/src/designer/history.js (ausgeliefert als 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 prüft nur auf Nicht-Leerheit, maximal 64 Zeichen und kein abschließendes Leerzeichen. < und > sind zulässig. MySQL akzeptiert sie in einem quoted identifier.

templates/database/designer/database_tables.twig kopiert designerTable.getTableName() nach table_name auf .small_tab_pref_1. Die VQB-Optionszelle verwendet eine vorab escapte Kopie desselben Namens.

Bereits dokumentierte Irrwege: das doppelt escapte Options-Button-Attribut als Fix zu betrachten (das ist es nicht – small_tab_pref_1 legt weiterhin den rohen Namen offen, und history.js ist die Senke); den Spalten-Helper als Abdeckung für Tabellennamen zu betrachten; unauthentifiziertes XSS zu behaupten; eine Reverse Shell. Theater.

Lab

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

Nur http://127.0.0.1:19250 anvisieren. Images phpmyadmin:5.2.3 und mysql:8.0. Compose-Projekt phpmyadmin-vqb-xss. Playwright Chromium im poc-Service. Der Stack wird nach dem Lauf abgebaut.

Zwei Benutzer, gemeinsame shareddb. Der Benutzer mit geringen Rechten creator führt CREATE TABLE \tx` (`cy` INT)aus. Der Benutzer mit höheren Rechtenvictimmeldet sich bei phpMyAdmin an und öffnet den Designer mitquery=1. Das live geladene history.js ist die Kopie aus dem Container (h3-unescaped=yes, Spalten-Helfer vorhanden). Chromium ruft DesignerHistory.display()mit dem Tabellennamen ausgetTableName()` auf der Seite auf.

Ergebnis: Das innerHTML von #ab h3.tiger ist <a href="#">t<i id="pma-vqb">x</i></a>. Der Text der Spalten-td ist c<b id=pma-col>y ohne b#pma-col-Knoten.

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

Die Behebung

getTab() mit $('<div/>').text(temp).html() oder Functions.escapeHtml escapen, bevor es in das <h3> konkateniert wird. Verlassen Sie sich nicht auf die doppelte Kodierung eines Attributs durch Twig. Behalten Sie den Spaltennamen-Helper als Vorbild bei.

Referenzen

  • github.com/phpmyadmin/phpmyadmin Tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
  • js/src/designer/history.js
  • libraries/classes/Dbal/TableName.php
  • In der Nähe gepatcht (nicht dieser Pfad): PMASA-2025-1 Check-tables-Überschriften
  • Gleicher Pin: PMA-5.2.3-WebAuthn-2FA
  • CWE-79

Lizenz

GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.

Tool herunterladen