
CakePHP 5.4.2 - उच्च - रिमोट - SQLi - COLLATE कोलेशन एक कच्चा SQL फ्रैगमेंट है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
Class: SQLi Reach: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql स्ट्रिंग मान को बाइंड करता है और collation को जोड़ता है। IdentifierExpression भी वही करता है। कोई ensureSimpleString नहीं है। Postgres quoteIdentifier यह है '"' . trim($collation, '"') . '"', इसलिए एक एम्बेडेड कोट CAST को जल्दी बंद कर देता है।
एक ऐप जो request/locale collation को new StringExpression($term, $collation) में फॉरवर्ड करता है, वह उस स्ट्रिंग को COLLATE में डाल देता है। मान बाइंड रहता है। collation नहीं।
| ID | अभी तक कोई CVE नहीं |
| Class | SQLi |
| Reach | Remote (ऐप जो collation/locale को 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 |
| Product | CakePHP (cakephp/database) |
| Affected | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | ऐप जो collation/locale को उन कंस्ट्रक्टरों में फॉरवर्ड करता है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
इसके लिए एक ऐप चाहिए जो user/locale collation को उन कंस्ट्रक्टरों में पास करता हो। स्टॉक cakephp/app अपने आप किसी सार्वजनिक फॉर्म पर collation को उजागर नहीं करता।
| Privilege | Method / sink | Kind | Lab-proven या inferred |
|---|---|---|---|
COLLATE के बाद SQL जोड़ना | StringExpression::sql $this->collation को जोड़ता है | संकलित SQL की अखंडता | Lab-proven। रॉ SQL में payload अनबाउंड मौजूद है |
| identifiers पर वही splice | IdentifierExpression note COLLATE <payload> | संकलित SQL की अखंडता | Lab-proven। id_raw_sql में payload मौजूद है |
Postgres "..." रैप से बाहर निकलना | quoteIdentifier = '"' . trim($collation, '"') . '"' | संकलित SQL की अखंडता | Lab-proven। संकलित SQL है COLLATE "C" AS text)) || (SELECT ... |
| breakout को निष्पादित करना और दूसरी टेबल पढ़ना | CAST(... ) || (SELECT note FROM lab_secret ...) | DB की recon | Lab-proven। परिणाम xCAKEPHP-COLLATE-SQLI-WITNESS, कोई exec error नहीं |
| connection role के साथ पंक्तियाँ संशोधित करना / अधिक SQL | वही injection | DB की अखंडता | Inferred। Lab एक SELECT oracle है |
| Negative control | collation C | Closed | Lab-proven। परिणाम x, कोई witness नहीं, संकलित COLLATE "C" |
इस leftover पर बंद: बाउंड स्ट्रिंग मान (:c0 शाब्दिक x ही रहता है); ऐसा collation जो ensureSimpleString (^[a-zA-Z0-9]+$) पास कर दे, वह यह payload नहीं है। स्केलेटन ऐप पर unauthenticated RCE नहीं। शेल नहीं।
वही pin leftovers: window SQLi, attachment CRLF, cache unserialize।
FunctionsBuilder / filename= नोट्स के बाद मैंने 5.4.2 को pin किया। दस hunts। remaining-SQLi pass यही है। StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres quoteIdentifier ASCII quotes से रैप करता है और trim($collation, '"') करता है। एक एम्बेडेड " identifier को बंद कर देता है। -- उस बचे हुए closer को खा जाता है जिसे Cake अभी भी जोड़ता है।
पहले से दर्ज गलत रास्ते: SQLite को एकमात्र driver मानना (concat असली है, wrap-breakout Postgres है); बाउंड मान को injection मानना; यह दावा करना कि ensureSimpleString यहाँ पहले ही चल चुका है (यह नहीं चला); एक reverse shell। Theatre।
python3 cakephp-collate-sqli-Abraxas-Labs.py
या
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19450। cakephp/database 5.4.2 के साथ Postgres 16। छोटा ऐप ?collation= को StringExpression / IdentifierExpression में फॉरवर्ड करता है और CAST(... AS text) निष्पादित करता है। Secret टेबल में witness है।
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
collation argument पर ensureSimpleString() (या एक collation allowlist)। Postgres को identifiers को ठीक से quote करना चाहिए, न कि trim के साथ रैप।
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई वारंटी नहीं।