
CakePHP 5.4.2 - Alta - Remota - SQLi - La intercalación COLLATE es un fragmento SQL sin procesar
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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.
| ID | sin CVE todavía |
| Clase | SQLi |
| Alcance | Remoto (aplicación que reenvía colación/locale a StringExpression / IdentifierExpression) |
| CWE | CWE-89 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | CakePHP (cakephp/database) |
| Afectado | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Autenticación | aplicación que reenvía colación/locale a esos constructores |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
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.
| Privilegio | Método / sink | Tipo | Probado en laboratorio o inferido |
|---|---|---|---|
Inyectar SQL después de COLLATE | StringExpression::sql concatena $this->collation | Integridad del SQL compilado | Probado en laboratorio. El SQL en bruto contiene el payload sin vincular |
| Misma inyección en identificadores | IdentifierExpression note COLLATE <payload> | Integridad del SQL compilado | Probado en laboratorio. id_raw_sql contiene el payload |
Escapar del envoltorio "..." de Postgres | quoteIdentifier = '"' . trim($collation, '"') . '"' | Integridad del SQL compilado | Probado en laboratorio. El SQL compilado es COLLATE "C" AS text)) || (SELECT ... |
| Ejecutar el escape y leer otra tabla | CAST(... ) || (SELECT note FROM lab_secret ...) | Reconocimiento de la BD | Probado en laboratorio. Resultado xCAKEPHP-COLLATE-SQLI-WITNESS, sin error de ejecución |
| Modificar filas / más SQL con el rol de la conexión | Misma inyección | Integridad de la BD | Inferido. El laboratorio es un oráculo SELECT |
| Control negativo | colación C | Cerrado | Probado 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.
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.
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
ensureSimpleString() (o una lista blanca de colaciones) sobre el argumento de colación. Postgres debe citar los identificadores correctamente, no trim más envoltorio.
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.