
CakePHP 5.4.2 - उच्च - रिमोट - SQLi - COLLATE कोलेशन एक कच्चा SQL फ्रैगमेंट है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-collate-sqli
राइट-अप: https://abraxaslabs.tech/research/cakephp-collate-sqli
वर्ग: SQLi पहुँच: रिमोट
CakePHP 5.4.2 (887b641) - Cake Software Foundation
StringExpression::sql स्ट्रिंग मान को बाइंड करता है और कोलेशन को संयोजित करता है। IdentifierExpression भी वही करता है। यहाँ कोई ensureSimpleString नहीं है। Postgres का quoteIdentifier यह है '"' . trim($collation, '"') . '"', इसलिए एक एम्बेडेड कोट CAST को जल्दी बंद कर देता है।
एक ऐप जो अनुरोध/लोकेल कोलेशन को new StringExpression($term, $collation) में अग्रेषित करता है, उस स्ट्रिंग को COLLATE में डाल देता है। मान बाइंड रहता है। कोलेशन नहीं।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | SQLi |
| पहुँच | रिमोट (ऐप जो कोलेशन/लोकेल को StringExpression / IdentifierExpression में अग्रेषित करता है) |
| CWE | CWE-89 |
| CVSS | उच्च: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| उत्पाद | CakePHP (cakephp/database) |
| प्रभावित | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| प्रमाणीकरण | ऐप जो कोलेशन/लोकेल को उन कंस्ट्रक्टरों में अग्रेषित करता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
इसके लिए एक ऐसे ऐप की आवश्यकता है जो उपयोगकर्ता/लोकेल कोलेशन को उन कंस्ट्रक्टरों में पास करता हो। स्टॉक cakephp/app अपने आप किसी सार्वजनिक फ़ॉर्म पर कोलेशन को उजागर नहीं करता।
| विशेषाधिकार | विधि / सिंक | प्रकार | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
COLLATE के बाद SQL जोड़ना | StringExpression::sql $this->collation को संयोजित करता है | संकलित SQL की अखंडता | लैब-प्रमाणित। रॉ SQL में पेलोड अनबाउंड होकर मौजूद है |
| पहचानकर्ताओं पर वही जोड़ | IdentifierExpression note COLLATE <payload> | संकलित SQL की अखंडता | लैब-प्रमाणित। id_raw_sql में पेलोड मौजूद है |
Postgres "..." रैप से बाहर निकलना | quoteIdentifier = '"' . trim($collation, '"') . '"' | संकलित SQL की अखंडता | लैब-प्रमाणित। संकलित SQL है COLLATE "C" AS text)) || (SELECT ... |
| ब्रेकआउट निष्पादित करना और दूसरी तालिका पढ़ना | CAST(... ) || (SELECT note FROM lab_secret ...) | DB की टोह | लैब-प्रमाणित। परिणाम xCAKEPHP-COLLATE-SQLI-WITNESS, कोई exec त्रुटि नहीं |
| कनेक्शन भूमिका के साथ पंक्तियाँ संशोधित करना / अधिक SQL | वही इंजेक्शन | DB की अखंडता | अनुमानित। लैब एक SELECT ओरेकल है |
| नकारात्मक नियंत्रण | कोलेशन C | बंद | लैब-प्रमाणित। परिणाम x, कोई विटनेस नहीं, संकलित COLLATE "C" |
इस अवशेष पर बंद: बाउंड स्ट्रिंग मान (:c0 शाब्दिक x ही रहता है); एक कोलेशन जो ensureSimpleString (^[a-zA-Z0-9]+$) पास कर देगा, वह यह पेलोड नहीं है। स्केलेटन ऐप पर अनप्रमाणीकृत RCE नहीं। शेल नहीं।
वही पिन अवशेष: window SQLi, attachment CRLF, cache unserialize।
FunctionsBuilder / filename= नोट्स के बाद मैंने 5.4.2 को पिन किया। दस खोजें। शेष-SQLi पास यही है। StringExpression::sql:
$placeholder = $binder->placeholder('c');
$binder->bind($placeholder, $this->string, 'string');
return $placeholder . ' COLLATE ' . $this->collation;
Postgres quoteIdentifier ASCII उद्धरणों के साथ लपेटता है और trim($collation, '"') करता है। एक अंतर्निहित " पहचानकर्ता को बंद कर देता है। -- बचे हुए क्लोज़र को खा जाता है जिसे Cake अभी भी जोड़ता है।
पहले से दर्ज गलत मोड़: SQLite को एकमात्र ड्राइवर मानना (concat वास्तविक है, wrap-breakout Postgres है); bound मान को injection मानना; यह दावा करना कि ensureSimpleString यहाँ पहले ही चल चुका है (यह नहीं चला); एक reverse shell। नाटक।
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) निष्पादित करता है। गुप्त तालिका में साक्ष्य रखा गया है।
SUCCESS cakephp-collate-sqli pin=5.4.2 raw=concat pg-wrap=breakout exec=yes CAKEPHP-COLLATE-SQLI-WITNESS
collation आर्ग्युमेंट पर ensureSimpleString() (या collation allowlist)। Postgres को identifiers को उचित रूप से quote करना चाहिए, न कि trim के साथ wrap करना।
887b641de9f7aba06071f98f17edcbc573cbcf63)StringExpression.php · IdentifierExpression.php · Postgres.phpensureSimpleString()GNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।