
CakePHP 5.4.2 - Élevé - À distance - SQLi - La collation COLLATE est un fragment SQL brut
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
Classe : SQLi Portée : Distante
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql lie la valeur de chaîne et concatène la collation. IdentifierExpression fait de même. Il n'y a pas de ensureSimpleString. Le quoteIdentifier de Postgres est '"' . trim($collation, '"') . '"', donc un guillemet intégré ferme CAST prématurément.
Une application qui transmet la collation de la requête/locale dans new StringExpression($term, $collation) place cette chaîne dans COLLATE. La valeur reste liée. La collation, non.
| ID | pas encore de CVE |
| Classe | SQLi |
| Portée | Distante (application qui transmet la collation/locale dans StringExpression / IdentifierExpression) |
| CWE | CWE-89 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produit | CakePHP (cakephp/database) |
| Affecté | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | application qui transmet la collation/locale dans ces constructeurs |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Nécessite une application qui transmet la collation utilisateur/locale dans ces constructeurs. Le cakephp/app standard n'expose pas la collation sur un formulaire public en soi.
| Privilège | Méthode / sink | Type | Prouvé en lab ou déduit |
|---|---|---|---|
Injecter du SQL après COLLATE | StringExpression::sql concatène $this->collation | Intégrité du SQL compilé | Prouvé en lab. Le SQL brut contient la charge utile non liée |
| Même injection sur les identifiants | IdentifierExpression note COLLATE <payload> | Intégrité du SQL compilé | Prouvé en lab. id_raw_sql contient la charge utile |
Sortir du wrap Postgres "..." | quoteIdentifier = '"' . trim($collation, '"') . '"' | Intégrité du SQL compilé | Prouvé en lab. Le SQL compilé est COLLATE "C" AS text)) || (SELECT ... |
| Exécuter l'évasion et lire une autre table | CAST(... ) || (SELECT note FROM lab_secret ...) | Reconnaissance de la base | Prouvé en lab. Résultat xCAKEPHP-COLLATE-SQLI-WITNESS, aucune erreur d'exécution |
| Modifier des lignes / plus de SQL avec le rôle de connexion | Même injection | Intégrité de la base | Déduit. Le lab est un oracle SELECT |
| Contrôle négatif | collation C | Fermé | Prouvé en lab. Résultat x, aucun témoin, compilé COLLATE "C" |
Fermé sur ce reliquat : valeur de chaîne liée (:c0 reste le littéral x) ; une collation qui passerait ensureSimpleString (^[a-zA-Z0-9]+$) n'est pas cette charge utile. Pas de RCE non authentifiée sur une application squelette. Pas de shell.
Autres reliquats du même pin : window SQLi, attachment CRLF, cache unserialize.
J'ai épinglé 5.4.2 après les notes FunctionsBuilder / filename=. Dix chasses. La passe SQLi restante est celle-ci. StringExpression::sql :
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Le quoteIdentifier de Postgres entoure de guillemets ASCII et fait trim($collation, '"'). Un " intégré ferme l'identifiant. -- mange le fermant restant que Cake ajoute encore.
Fausses pistes déjà consignées : SQLite comme seul driver (la concaténation est réelle, l'évasion du wrap est Postgres) ; traiter la valeur liée comme l'injection ; prétendre que ensureSimpleString s'était déjà exécuté ici (ce n'était pas le cas) ; un reverse shell. Du théâtre.
python3 cakephp-collate-sqli-Abraxas-Labs.py
ou
cd lab
./run.sh
Cible uniquement http://127.0.0.1:19450. cakephp/database 5.4.2 plus Postgres 16. Une petite application transmet ?collation= dans StringExpression / IdentifierExpression et exécute CAST(... AS text). La table secrète contient le témoin.
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
ensureSimpleString() (ou une liste blanche de collations) sur l'argument de collation. Postgres doit citer correctement les identifiants, pas faire trim plus wrap.
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.