
CakePHP 5.4.2 - Alto - Remoto - SQLi - COLLATE collation è un frammento SQL grezzo
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
Classe: SQLi Reach: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql esegue il binding del valore stringa e concatena la collation. IdentifierExpression fa lo stesso. Non esiste ensureSimpleString. In Postgres quoteIdentifier è '"' . trim($collation, '"') . '"', quindi una virgoletta incorporata chiude CAST in anticipo.
Un'app che inoltra la collation di request/locale in new StringExpression($term, $collation) inserisce quella stringa in COLLATE. Il valore resta con binding. La collation no.
| ID | nessuna CVE al momento |
| Classe | SQLi |
| Reach | Remoto (app che inoltra collation/locale in StringExpression / IdentifierExpression) |
| CWE | CWE-89 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Prodotto | CakePHP (cakephp/database) |
| Affected | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | applicazione che inoltra collation/locale in quei costruttori |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Richiede un'applicazione che passi la collation di utente/locale in quei costruttori. Il cakephp/app standard non espone la collation su un form pubblico di per sé.
| Privilegio | Metodo / sink | Tipo | Provato in lab o dedotto |
|---|---|---|---|
Iniettare SQL dopo COLLATE | StringExpression::sql concatena $this->collation | Integrità dell'SQL compilato | Provato in lab. L'SQL raw contiene il payload senza binding |
| Stessa iniezione sugli identificatori | IdentifierExpression note COLLATE <payload> | Integrità dell'SQL compilato | Provato in lab. id_raw_sql contiene il payload |
Uscire dal wrapping "..." di Postgres | quoteIdentifier = '"' . trim($collation, '"') . '"' | Integrità dell'SQL compilato | Provato in lab. L'SQL compilato è COLLATE "C" AS text)) || (SELECT ... |
| Eseguire il breakout e leggere un'altra tabella | CAST(... ) || (SELECT note FROM lab_secret ...) | Ricognizione del DB | Provato in lab. Risultato xCAKEPHP-COLLATE-SQLI-WITNESS, nessun errore di esecuzione |
| Modificare righe / altro SQL con il ruolo della connessione | Stessa iniezione | Integrità del DB | Dedotto. Il lab è un oracolo SELECT |
| Controllo negativo | collation C | Chiuso | Provato in lab. Risultato x, nessun witness, compilato COLLATE "C" |
Chiuso su questo residuo: valore stringa con binding (:c0 resta il letterale x); una collation che passerebbe ensureSimpleString (^[a-zA-Z0-9]+$) non è questo payload. Non è RCE non autenticato su un'app skeleton. Non è una shell.
Altri residui dello stesso pin: window SQLi, attachment CRLF, cache unserialize.
Ho fissato 5.4.2 dopo le note su FunctionsBuilder / filename=. Dieci ricerche. Il passaggio sull'SQLi residuo è questo. StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
In Postgres quoteIdentifier avvolge con virgolette ASCII e trim($collation, '"'). Una " incorporata chiude l'identificatore. -- mangia il chiudente residuo che Cake aggiunge comunque.
Vicoli ciechi già registrati: SQLite come unico driver (la concatenazione è reale, il breakout del wrapping è Postgres); trattare il valore con binding come l'iniezione; sostenere che ensureSimpleString fosse già stato eseguito qui (non lo era); una reverse shell. Teatro.
python3 cakephp-collate-sqli-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19450. cakephp/database 5.4.2 più Postgres 16. Una piccola app inoltra ?collation= in StringExpression / IdentifierExpression ed esegue CAST(... AS text). La tabella segreta contiene il witness.
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
ensureSimpleString() (o una allowlist di collation) sull'argomento collation. Postgres deve quotare correttamente gli identificatori, non trim più wrapping.
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.