
CakePHP 5.4.2 – Hoch – Remote – SQLi – COLLATE-Kollation ist ein rohes SQL-Fragment
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
Klasse: SQLi Reichweite: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql bindet den String-Wert und konkateniert die Collation. IdentifierExpression macht dasselbe. Es gibt kein ensureSimpleString. Postgres quoteIdentifier ist '"' . trim($collation, '"') . '"', sodass ein eingebettetes Anführungszeichen CAST vorzeitig schließt.
Eine App, die Request-/Locale-Collation in new StringExpression($term, $collation) weiterleitet, setzt diesen String in COLLATE. Der Wert bleibt gebunden. Die Collation nicht.
| ID | noch keine CVE |
| Klasse | SQLi |
| Reichweite | Remote (App, die Collation/Locale in StringExpression / IdentifierExpression weiterleitet) |
| CWE | CWE-89 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produkt | CakePHP (cakephp/database) |
| Betroffen | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | Anwendung, die Collation/Locale in diese Konstruktoren weiterleitet |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Erfordert eine Anwendung, die Benutzer-/Locale-Collation in diese Konstruktoren übergibt. Das Standard-cakephp/app stellt Collation nicht von sich aus in einem öffentlichen Formular bereit.
| Berechtigung | Methode / Sink | Art | Lab-belegt oder abgeleitet |
|---|---|---|---|
SQL nach COLLATE einschleusen | StringExpression::sql konkateniert $this->collation | Integrität des kompilierten SQL | Lab-belegt. Rohes SQL enthält die Payload ungebunden |
| Gleiches Einschleusen bei Identifikatoren | IdentifierExpression note COLLATE <payload> | Integrität des kompilierten SQL | Lab-belegt. id_raw_sql enthält die Payload |
Aus der Postgres-"..."-Umhüllung ausbrechen | quoteIdentifier = '"' . trim($collation, '"') . '"' | Integrität des kompilierten SQL | Lab-belegt. Kompiliertes SQL ist COLLATE "C" AS text)) || (SELECT ... |
| Den Ausbruch ausführen und eine andere Tabelle lesen | CAST(... ) || (SELECT note FROM lab_secret ...) | Recon der DB | Lab-belegt. Ergebnis xCAKEPHP-COLLATE-SQLI-WITNESS, kein Exec-Fehler |
| Zeilen ändern / mehr SQL mit der Verbindungsrolle | Dieselbe Injection | Integrität der DB | Abgeleitet. Lab ist ein SELECT-Oracle |
| Negativkontrolle | Collation C | Geschlossen | Lab-belegt. Ergebnis x, kein Witness, kompiliert COLLATE "C" |
Geschlossen bei diesem Überbleibsel: gebundener String-Wert (:c0 bleibt das Literal x); eine Collation, die ensureSimpleString (^[a-zA-Z0-9]+$) passieren würde, ist nicht diese Payload. Kein unauthentifiziertes RCE auf einer Skeleton-App. Keine Shell.
Gleiche Pin-Überbleibsel: window SQLi, attachment CRLF, cache unserialize.
Ich habe 5.4.2 nach den FunctionsBuilder-/filename=-Notizen gepinnt. Zehn Jagden. Der Remaining-SQLi-Durchgang ist dieser. StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres quoteIdentifier umhüllt mit ASCII-Anführungszeichen und trim($collation, '"'). Ein eingebettetes " schließt den Identifikator. -- frisst den übrig gebliebenen Closer, den Cake weiterhin anhängt.
Bereits festgehaltene Irrwege: SQLite als einziger Treiber (Concat ist real, der Wrap-Breakout ist Postgres); den gebundenen Wert als die Injection behandeln; behaupten, ensureSimpleString sei hier bereits gelaufen (ist es nicht); eine Reverse Shell. Theater.
python3 cakephp-collate-sqli-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19450. cakephp/database 5.4.2 plus Postgres 16. Winzige App leitet ?collation= in StringExpression / IdentifierExpression weiter und führt CAST(... AS text) aus. Secret-Tabelle enthält den Witness.
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
ensureSimpleString() (oder eine Collation-Allowlist) auf das Collation-Argument. Postgres muss Identifikatoren korrekt quoten, nicht trim plus Umhüllung.
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.