Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
phpmyadmin-importldi — phpMyAdmin 5.2.3 - Alta - Remota - SQLi - ImportLdi TERMINATED BY leftover | Kitploit
Herramientas/GitHubGitHub/abraxas/phpmyadmin-importldi
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónLabs y Práctica
GitHubabraxas/phpmyadmin-importldi

phpmyadmin-importldi

phpMyAdmin 5.2.3 - Alta - Remota - SQLi - ImportLdi TERMINATED BY leftover

Ver Repositorio
2hace 8 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Abraxas Labs - phpmyadmin-importldi

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

Análisis: https://abraxaslabs.tech/research/phpmyadmin-importldi

phpmyadmin-importldi

Clase: SQLi Alcance: Remoto

phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin

ImportLdi.php construye LOAD DATA con FIELDS/LINES TERMINATED BY a partir de los POST ldi_terminated y ldi_new_line. Esas dos cadenas se concatenan en SQL entre comillas simples. ldi_enclosed y ldi_escaped pasan por escapeString. phpMyAdmin establece PMA_ENABLE_LDI en /import, por lo que MYSQLI_OPT_LOCAL_INFILE está activado.

Un usuario autenticado envía por POST format=ldi con una comilla en ldi_terminated. El LOAD DATA emitido contiene el POST sin procesar dentro de TERMINATED BY. Inyección SQL en la conexión del usuario, no en el usuario de control.

IDaún sin CVE
ClaseSQLi
AlcanceRemoto (inicio de sesión autenticado por cookie; importación de tabla, formato ldi)
CWECWE-89
CVSSMedio: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
ProductophpMyAdmin
Afectado5.2.3 etiqueta RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
Autenticacióninicio de sesión autenticado por cookie. Importación de tabla, formato ldi
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1

Qué puede hacer un atacante

Un usuario autenticado de phpMyAdmin que pueda abrir la importación de tabla puede inyectar SQL en LOAD DATA ... TERMINATED BY en su conexión MySQL.

PrivilegioMétodo / sinkReconocimiento / integridad / disponibilidadProbado en laboratorio o inferido
Romper el literal FIELDS TERMINATED BYPOST index.php?route=/import format=ldi ldi_terminated con una comillaIntegridad de la sentencia que construye PMAProbado en laboratorio. Caja SQL HTML: TERMINATED BY '',PMA-IMPORTLDI-WITNESS'
Mantener ENCLOSED BY en bandaMismo POST, comilla en ldi_enclosedControl negativoProbado en laboratorio. ENCLOSED BY está escapado
SQL adicional en la conexión del usuario (INTO OUTFILE / apilado si se permite)Mismo sink una vez cerrada la cadenaIntegridad de la conexión del usuarioInferido. El laboratorio se detiene en el delimitador roto. mysqli::query por defecto es de una sola sentencia
Lectura/escritura de archivos del lado de MySQLMismo LOAD DATA si la cuenta tiene FILE o LOCAL INFILE hacia el servidor webIntegridad de los archivos que mysqld puede tocarInferido. No concedido aquí. No se afirma

Descartado en este laboratorio: acceso no autenticado, usuario de control / pmadb, LFI de include del SO, y lectura/escritura condicionada por FILE. El usuario autenticado ya dispone de una caja SQL; este residuo es el delimitador sin escapar dentro de una sentencia que PMA construye para él.

Mismo pin: residuo de WebAuthn CustomServer.

Cómo lo encontré

Fijé phpMyAdmin RELEASE_5_2_3. Los plugins de importación que construyen LOAD DATA a mano son una auditoría de comillas. Dos de los cuatro campos de delimitador estaban escapados. Dos no lo estaban:

$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';

ldi_enclosed / ldi_escaped llaman a $dbi->escapeString. Common.php establece PMA_ENABLE_LDI en /import + format=ldi. Rutas GET|POST /import y GET|POST /table/import.

Errores ya registrados: afirmar LFI sin una concesión FILE; tratar el cuadro SQL como el hallazgo (lo que queda es el delimitador sin escapar que PMA concatena); afirmar control-user / pmadb; una reverse shell. Teatro.

Laboratorio

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

Dirígete solo a http://127.0.0.1:19290. Imágenes phpmyadmin:5.2.3 y mysql:8.0. Proyecto de Compose phpmyadmin-importldi. El stack se desmonta tras la ejecución.

Inicio de sesión por cookie. POST a /import con format=ldi y una comilla en ldi_terminated. Se emitió LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'. La misma comilla en ldi_enclosedse almacenó como unENCLOSED BYescapado. El código fuente fijado en la imagen 5.2.3 todavía contiene'.$ldi_terminated.'y$dbi->escapeString($ldi_enclosed)`.

SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS

La solución

escapeString en ldi_terminated y ldi_new_line, igual que en enclosed y escaped. Conversión a entero (int-cast) de skip_queries.

Referencias

  • github.com/phpmyadmin/phpmyadmin etiqueta RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
  • libraries/classes/Plugins/Import/ImportLdi.php
  • Mismo pin: PMA-5.2.3-WebAuthn-2FA
  • CWE-89

Licencia

GNU Affero GPL v3.0. Consulte LICENSE. Solo para laboratorio en loopback. Sin garantía.

Descargar herramienta