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-csrf-sql — phpMyAdmin 5.2.3 - Alta - Remota - CSRF - eliminación de token en /sql | Kitploit
Herramientas/GitHubGitHub/abraxas/phpmyadmin-csrf-sql
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónLabs y Práctica
GitHubabraxas/phpmyadmin-csrf-sql

phpmyadmin-csrf-sql

phpMyAdmin 5.2.3 - Alta - Remota - CSRF - eliminación de token en /sql

Ver Repositorio
hace 4 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-csrf-sql

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

phpmyadmin-csrf-sql

Clase: CSRF Alcance: Remoto

phpMyAdmin 5.2.3 (tag RELEASE_5_2_3, commit 962857e). Common.php construye la petición PSR-7 desde los globales antes de checkTokenRequestParam. En caso de discrepancia, Sanitize::removeRequestVars limpia $_POST y $_GET pero no esa instantánea. $sql_query se copia entonces desde $request->getParsedBodyParam('sql_query'). Las peticiones POST AJAX se abortan ante una discrepancia de token. Las peticiones POST no AJAX continúan. SqlController prefiere el $_POST['sql_query'] eliminado y, en caso contrario, conserva el global.

Basta con una víctima con la cookie de sesión de phpMyAdmin. Envía un POST a index.php?route=/sql con sql_query y sin un token válido, y sin ajax_request. El SELECT se ejecuta como ese usuario de MySQL. El valor predeterminado CookieSameSite=Strict en 5.2.3 bloquea muchos navegadores entre sitios. Same-site, Lax, None o autenticación HTTP siguen siendo vulnerables. En cualquier caso, se trata de un control CSRF roto.

IDaún sin CVE
ClaseCSRF
AlcanceRemoto. El valor predeterminado CookieSameSite=Strict bloquea muchos navegadores entre sitios. Same-site / Lax / None / autenticación HTTP permanecen.
CWECWE-352
CVSSAlto: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
ProductophpMyAdmin
Afectado5.2.3 tag RELEASE_5_2_3 (962857e)
AutenticaciónCookie de sesión de phpMyAdmin de la víctima (o autenticación HTTP). Sin token CSRF válido.
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1:19240

Qué puede hacer un atacante

Cualquiera que pueda hacer que el navegador de la víctima envíe un POST a phpMyAdmin sin ajax_request puede ejecutar SQL como ese usuario de MySQL.

PrivilegioMétodo / rutaProbado en laboratorio o inferido
Ejecutar SQL del atacante como la cuenta MySQL de la víctima (integridad + reconocimiento de esa caja SQL)POST index.php?route=/sql sql_query=... db=... sin token, sin ajax_requestProbado en laboratorio. El cuerpo de resultados contenía PMA-CSRF-SQL-WITNESS. El registro general mostró el SELECT como appuser
Abortar el mismo manejador en AJAXMismo POST con ajax_request=1Probado en laboratorio. Token mismatch. Fila marcadora INSERT ausente. El registro general no ejecutó ese INSERT
Omitir manejadores que solo leen el $_POST eliminadoPOST /database/structure/drop-table sin tokenProbado en laboratorio. keepme sigue presente
Misma brecha en export (SaveDir), DROP/TRUNCATE de partición, bloqueo de cuenta, /config/set, creación de pmadbCualquier manejador que lea el cuerpo PSR-7 después de la eliminaciónInferido. No ejercitado

Cerrado en este laboratorio: PMA no autenticado (se requiere primero inicio de sesión con cookie), rutas AJAX (salen ante discrepancia), drop-table sin token, shell del SO. El valor predeterminado Strict SameSite significa que un formulario clásico entre sitios a menudo no enviará la cookie; lo que queda sigue siendo una comprobación CSRF fallida en same-site y en despliegues Lax/None.

Cómo lo encontré

Ocho búsquedas paralelas en el código fuente de RELEASE_5_2_3. Common.php crea $request = createFromGlobals() antes de checkTokenRequestParam(). En caso de discrepancia, Sanitize::removeRequestVars() limpia solo $_POST/$_GET. Las peticiones no AJAX continúan. SqlController usa el global $sql_query si $_POST está vacío. Ruta GET|POST /sql.

Caminos equivocados: tratar el AJAX /sql como el residuo (aborta con Token mismatch); tratar drop-table como el residuo (ese manejador solo lee el $_POST eliminado); tratar el Strict SameSite predeterminado como "CSRF está cerrado" (el control sigue roto; same-site / Lax / None permanecen).

Laboratorio

python3 phpmyadmin-csrf-sql-Abraxas-Labs.py

o

cd lab
./run.sh

Solo loopback: http://127.0.0.1:19240. Imágenes phpmyadmin:5.2.3 y mysql:8.0. Proyecto Compose phpmyadmin-csrf-sql. El PoC es un POST loopback same-site (Strict SameSite aún envía la cookie). Testigo PMA-CSRF-SQL-WITNESS.

SUCCESS phpmyadmin-csrf-sql sql-ran=yes ajax-abort=yes drop-held=yes PMA-CSRF-SQL-WITNESS

La solución

En caso de discrepancia, reemplazar la petición por un cuerpo vacío, o rechazar todas las peticiones POST, no solo las AJAX. No copiar sql_query de una petición obsoleta. Fallar de forma segura como en el cierre de sesión.

Referencias

  • github.com/phpmyadmin/phpmyadmin tag RELEASE_5_2_3 (962857e)
  • libraries/classes/Common.php instantánea de la petición antes de la eliminación del token
  • Sanitize::removeRequestVars limpia solo $_POST/$_GET
  • SqlController global $sql_query
  • Otros residuos del mismo pin: phpmyadmin-webauthn · phpmyadmin-pmadb-central-sqli · phpmyadmin-designer-json-sqli · phpmyadmin-setup-validate
  • CWE-352

Licencia

GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio loopback. Sin garantía.

Descargar herramienta