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
cakephp-collate-sqli — CakePHP 5.4.2 - Alta - Remota - SQLi - La intercalación COLLATE es un fragmento SQL sin procesar | Kitploit
Herramientas/GitHubGitHub/abraxas/cakephp-collate-sqli
Escáneres de VulnerabilidadesAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónSeguridad de Bases de Datos
GitHubabraxas/cakephp-collate-sqli

cakephp-collate-sqli

CakePHP 5.4.2 - Alta - Remota - SQLi - La intercalación COLLATE es un fragmento SQL sin procesar

Ver Repositorio
hace 3 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 - cakephp-collate-sqli

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  cakephp-collate-sqli

cakephp-collate-sqli

Clase: SQLi Alcance: Remoto

CakePHP 5.4.2 (887b641) - Cake Software Foundation

StringExpression::sql vincula el valor de cadena y concatena la colación. IdentifierExpression hace lo mismo. No existe ensureSimpleString. En Postgres, quoteIdentifier es '"' . trim($collation, '"') . '"', por lo que una comilla incrustada cierra el CAST antes de tiempo.

Una aplicación que reenvía la colación de la solicitud/locale a new StringExpression($term, $collation) coloca esa cadena en COLLATE. El valor permanece vinculado. La colación no.

IDsin CVE todavía
ClaseSQLi
AlcanceRemoto (aplicación que reenvía colación/locale a StringExpression / IdentifierExpression)
CWECWE-89
CVSSAlto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
ProductoCakePHP (cakephp/database)
Afectado5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Autenticaciónaplicación que reenvía colación/locale a esos constructores
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1

Qué puede hacer un atacante

Requiere una aplicación que pase la colación del usuario/locale a esos constructores. El cakephp/app estándar no expone la colación en un formulario público por sí solo.

PrivilegioMétodo / sinkTipoProbado en laboratorio o inferido
Inyectar SQL después de COLLATEStringExpression::sql concatena $this->collationIntegridad del SQL compiladoProbado en laboratorio. El SQL en bruto contiene el payload sin vincular
Misma inyección en identificadoresIdentifierExpression note COLLATE <payload>Integridad del SQL compiladoProbado en laboratorio. id_raw_sql contiene el payload
Escapar del envoltorio "..." de PostgresquoteIdentifier = '"' . trim($collation, '"') . '"'Integridad del SQL compiladoProbado en laboratorio. El SQL compilado es COLLATE "C" AS text)) || (SELECT ...
Ejecutar el escape y leer otra tablaCAST(... ) || (SELECT note FROM lab_secret ...)Reconocimiento de la BDProbado en laboratorio. Resultado xCAKEPHP-COLLATE-SQLI-WITNESS, sin error de ejecución
Modificar filas / más SQL con el rol de la conexiónMisma inyecciónIntegridad de la BDInferido. El laboratorio es un oráculo SELECT
Control negativocolación CCerradoProbado en laboratorio. Resultado x, sin testigo, compilado COLLATE "C"

Cerrado en este remanente: el valor de cadena vinculado (:c0 permanece como el literal x); una colación que pasaría ensureSimpleString (^[a-zA-Z0-9]+$) no es este payload. No es RCE no autenticado en una aplicación esqueleto. No es una shell.

Otros remanentes del mismo pin: window SQLi, attachment CRLF, cache unserialize.

Cómo lo encontré

Fijé 5.4.2 después de las notas de FunctionsBuilder / filename=. Diez búsquedas. La pasada de SQLi restante es esta. StringExpression::sql:

$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;

En Postgres, quoteIdentifier envuelve con comillas ASCII y trim($collation, '"'). Una " incrustada cierra el identificador. -- se come el cierre sobrante que Cake sigue añadiendo.

Caminos equivocados ya registrados: SQLite como único driver (la concatenación es real, el escape del envoltorio es de Postgres); tratar el valor vinculado como la inyección; afirmar que ensureSimpleString ya se ejecutó aquí (no lo hizo); una reverse shell. Teatro.

Laboratorio

python3 cakephp-collate-sqli-Abraxas-Labs.py

o

cd lab
./run.sh

Objetivo solo http://127.0.0.1:19450. cakephp/database 5.4.2 más Postgres 16. Una aplicación mínima reenvía ?collation= a StringExpression / IdentifierExpression y ejecuta CAST(... AS text). La tabla secreta contiene el testigo.

SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS

La solución

ensureSimpleString() (o una lista blanca de colaciones) sobre el argumento de colación. Postgres debe citar los identificadores correctamente, no trim más envoltorio.

Referencias

  • github.com/cakephp/cakephp tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • StringExpression.php · IdentifierExpression.php · Postgres.php
  • Parcheado cercano: CVE-2026-79752 ensureSimpleString()
  • Mismo pin: cakephp-window-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

Licencia

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

Descargar herramienta