Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
phpmyadmin-vqb-xss — phpMyAdmin 5.2.3 - Alta - Remota - XSS - Designer Visual Query Builder | Kitploit
Strumenti/GitHubGitHub/abraxas/phpmyadmin-vqb-xss
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingLab e Pratica
GitHubabraxas/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

phpMyAdmin 5.2.3 - Alta - Remota - XSS - Designer Visual Query Builder

Vedi Repository
38 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

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

Classe: XSS memorizzato Portata: Remota

phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin

js/src/designer/history.js costruisce la cronologia delle query visuali con innerHTML. I nomi delle colonne passano attraverso $('<div/>').text(...).html(). I nomi delle tabelle no. TableName consente ancora < e >. Un account con privilegi limitati che dispone di CREATE TABLE su un database condiviso inserisce un identificatore HTML. Quando un utente con privilegi superiori apre Designer, getTableName() è presente nella pagina e DesignerHistory.display() lo scrive in #ab.

Un XSS memorizzato nell'origine di phpMyAdmin. Stessa classe di PMASA-2025-1, funzionalità diversa. Le intestazioni di check-tables erano state sottoposte a escape. Questo percorso no.

IDnessuna CVE al momento
ClasseXSS memorizzato
PortataRemota (CREATE TABLE autenticato; la vittima apre Designer)
CWECWE-79
CVSSAlto: 8.0 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
ProdottophpMyAdmin
Affetto5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
Authautenticato. L'attaccante necessita di CREATE TABLE su un database che la vittima apre in Designer
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1

Cosa può fare un attaccante

Inserire un nome di tabella HTML, poi attendere che un utente con privilegi superiori apra Designer su quel database e visualizzi la cronologia delle query visuali.

PrivilegioMetodo / sinkRicognizione / integrità / disponibilitàProvato in lab o dedotto
Iniettare markup nell'origine di phpMyAdminDesignerHistory.display() concatena getTab() nell'innerHTML di #abIntegrità dell'origine della vittimaProvato in lab. history.js attivo su phpmyadmin:5.2.3. <h3> conteneva <i id="pma-vqb">
Uscire da un attributo table_name di designerdatabase_tables.twig small_tab_pref_1 usa designerTable.getTableName()Ricognizione del nome MySQL grezzo nel DOM di DesignerProvato in lab, leggibile come identificatore grezzo
Leggere il cookie di sessione della vittima e il token CSRFScript same-origin una volta visualizzata la cronologiaRicognizione della sessione PMA della vittimaDedotto dall'XSS memorizzato nell'origine PMA. Questo lab usa un marcatore <i>, non uno script
Eseguire SQL, gestire utenti, esportare, come l'account MySQL della vittimaPOST /sql, /server/privileges, export con tokenIntegrità di tutto ciò che quell'account MySQL può toccareDedotto. Stessa classe di impatto di PMASA-2025-1
Modificare 2FA / userconfigPOST /config/set come la vittimaIntegrità dell'archivio delle preferenze della vittimaDedotto. Residuo affine, non di questo lab

Chiusi su questo residuo: accesso non autenticato, RCE sul sistema operativo e il percorso del pulsante OK di VQB. .small_tab_pref_click_opt applica già l'escape a table_name e Twig lo applica di nuovo automaticamente, quindi quel clic attualmente invia entità a getTab(). Non è una correzione di history.js. Le celle delle colonne restano con escape del testo (c<b id=pma-col>y, nessun nodo <b id="pma-col">).

Stesso pin: residuo WebAuthn CustomServer.

Come l'ho trovato

Ho fissato phpMyAdmin RELEASE_5_2_3. PMASA-2025-1/2/3 sono già in 5.2.2. Designer costruisce ancora manualmente l'HTML della cronologia VQB.

js/src/designer/history.js (distribuito come 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 controlla solo che non sia vuoto, max 64, nessuno spazio finale. < e > sono legali. MySQL li accetta in un identificatore tra virgolette.

templates/database/designer/database_tables.twig copia designerTable.getTableName() in table_name su .small_tab_pref_1. La cella dell'opzione VQB usa una copia pre-escapata dello stesso nome.

Vicoli ciechi già registrati: trattare l'attributo del pulsante opzione doppiamente escapato come la correzione (non lo è - small_tab_pref_1 espone ancora il nome grezzo, e history.js è il sink); trattare l'helper di colonna come se coprisse i nomi delle tabelle; sostenere XSS non autenticato; una reverse shell. Teatro.

Lab

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

Destinazione solo http://127.0.0.1:19250. Immagini phpmyadmin:5.2.3 e mysql:8.0. Progetto Compose phpmyadmin-vqb-xss. Playwright Chromium nel servizio poc. Lo stack viene smontato dopo l'esecuzione.

Due utenti, shareddb condiviso. L'utente con privilegi bassi creator esegue CREATE TABLE \tx` (`cy` INT). L'utente con privilegi più elevati victimaccede a phpMyAdmin e apre Designer conquery=1. Il file history.js live è la copia dal container (h3-unescaped=yes, helper di colonna presente). Chromium chiama DesignerHistory.display()con il nome della tabella dagetTableName()` sulla pagina.

Risultato: l'innerHTML di #ab h3.tiger è <a href="#">t<i id="pma-vqb">x</i></a>. Il testo della td della colonna è c<b id=pma-col>y senza alcun nodo b#pma-col.

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

La correzione

Esegui l'escape di getTab() con $('<div/>').text(temp).html() o Functions.escapeHtml prima di concatenarlo nell'<h3>. Non affidarti alla doppia codifica Twig di un singolo attributo. Mantieni l'helper per il nome della colonna come modello.

Riferimenti

  • github.com/phpmyadmin/phpmyadmin tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
  • js/src/designer/history.js
  • libraries/classes/Dbal/TableName.php
  • Corretto nelle vicinanze (non questo percorso): intestazioni Check-tables di PMASA-2025-1
  • Stesso pin: PMA-5.2.3-WebAuthn-2FA
  • CWE-79

Licenza

GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio su loopback. Nessuna garanzia.

Scarica lo strumento