
CakePHP 5.4.2 - उच्च - रिमोट - कुकी - Http Client कुकी जार डोमेन को regex प्रत्यय के रूप में मिलाता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
राइट-अप: https://abraxaslabs.tech/research/cakephp-cookie-suffix
वर्ग: कुकी लीक / प्लांट पहुँच: रिमोट
CakePHP 5.4.2 (887b641) - Cake Software Foundation
CookieCollection::findMatchingCookies preg_match('/' . preg_quote($domain) . '$/', $host) का उपयोग करता है। यह एक स्ट्रिंग सफ़िक्स है, RFC 6265 डोमेन-मैच नहीं। api.partner.com के लिए एक कुकी evilapi.partner.com को भेजी जाती है। bank.com के लिए एक कुकी notbank.com को भेजी जाती है।
Cookie::createFromHeaderString() भी प्रतिक्रिया होस्ट के विरुद्ध बिना किसी जाँच के Set-Cookie Domain= को कॉपी करता है। attacker.test से Domain=victim.internal के साथ addFromResponse उस कुकी को संग्रहीत करता है और बाद में उसे victim.internal से जोड़ देता है।
एक ऐप जो एक से अधिक होस्ट पर डिफ़ॉल्ट जार के साथ Cake\Http\Client का उपयोग करता है, एक पार्टनर सत्र कुकी को सफ़िक्स-भ्रमित सहोदर को लीक कर सकता है, या हमलावर URL प्राप्त करने के बाद आंतरिक होस्ट पर एक कुकी प्लांट कर सकता है। other.com मेल नहीं खाता। यह ब्राउज़र कुकी बग नहीं है। स्टॉक cakephp/app स्वयं दूसरे होस्ट को कॉल नहीं करता।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | कुकी लीक / प्लांट (रेगेक्स सफ़िक्स डोमेन मैच) |
| पहुँच | रिमोट (ऐप होस्ट्स पर Http Client जार का उपयोग करता है) |
| CWE | CWE-565, CWE-201 |
| CVSS | उच्च: 8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N |
| उत्पाद | CakePHP |
| प्रभावित | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| प्रमाणीकरण | ऐप होस्ट्स पर डिफ़ॉल्ट कुकी जार के साथ Cake\Http\Client का उपयोग करता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
ऐसे एप्लिकेशन की आवश्यकता है जो एक से अधिक होस्ट पर Cake\Http\Client कुकीज़ रखता हो (OAuth, वेबहुक, उपयोगकर्ता-प्रदत्त URL, दूसरा API)।
| विशेषाधिकार | विधि / सिंक | लैब-प्रमाणित या अनुमानित |
|---|---|---|
| संग्रहीत कुकी को सफ़िक्स-भ्रमित सहोदर को लीक करना | api.partner.com डोमेन वाली कुकी के बाद https://evilapi.partner.com/ के लिए CookieCollection::addToRequest | लैब-प्रमाणित। अनुरोध Cookie sid=SECRET है। RFC 6265 मेल नहीं खाता |
| पंजीकरणीय सफ़िक्स के लिए समान लीक | कुकी डोमेन bank.com, अनुरोध होस्ट notbank.com | लैब-प्रमाणित। अनुरोध Cookie sid=SECRET है |
| नकारात्मक नियंत्रण | अनुरोध होस्ट other.com | लैब-प्रमाणित। कोई Cookie हेडर नहीं |
| आंतरिक होस्ट के लिए कुकी प्लांट करना | https://attacker.test/ से Set-Cookie: sid=x; Domain=victim.internal का addFromResponse | लैब-प्रमाणित। संग्रहीत डोमेन victim.internal है; उस होस्ट को अगला अनुरोध sid=x भेजता है |
| अगली Client कॉल पर सत्र फिक्सेशन / चोरी किया गया पार्टनर सत्र | प्लांट की गई या लीक हुई sid को API सत्र के रूप में उपयोग किया गया | अनुमानित। लैब Cookie हेडर ऑरेकल पर रुकती है |
| समान-होस्ट भेजना अभी भी काम करता है | कुकी डोमेन api.partner.com से होस्ट api.partner.com को | लैब-प्रमाणित। अपेक्षित, बग नहीं |
इस अवशेष पर बंद: other.com मेल नहीं खाता। ब्राउज़र कुकी जार यह बग नहीं हैं। कोई शेल नहीं। स्केलेटन ऐप पर अनप्रमाणित RCE नहीं।
मैंने GHSA-2qh5, GHSA-fxf7, GHSA-vjqc, और 5.4.2 filename= नोट के बाद cakephp/cakephp 5.4.2 को पिन किया। Http Client कुकी मिलान एक रेगेक्स सफ़िक्स है:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
addFromResponse अनुरोध होस्ट को केवल डिफ़ॉल्ट के रूप में पास करता है। Set-Cookie से आने वाला Domain= एट्रिब्यूट इसे ओवरराइट कर देता है और संग्रहीत हो जाता है।
पहले से दर्ज गलत मोड़: इसे ब्राउज़र कुकी बग मानना; यह दावा करना कि other.com भी मेल खाता है; किसी ऐसे ऐप के बिना Cookie हेडर ऑरेकल को ATO तक बढ़ा-चढ़ाकर पेश करना जो होस्ट्स के बीच jar का उपयोग करता हो। नाटक: एक रिवर्स शेल।
python3 cakephp-cookie-suffix-Abraxas-Labs.py
या
cd lab
./run.sh
Git clone टैग 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) PHP 8.3 में। Loopback oracle HTTP 127.0.0.1:19420 पर। किसी अतिरिक्त HTTP origin की आवश्यकता नहीं है; oracle pin से CookieCollection चलाता है।
sid=SECRET डोमेन api.partner.com जोड़ें। addToRequest https://evilapi.partner.com/ -> Cookie: sid=SECRET।https://other.com/ -> कोई Cookie हेडर नहीं।https://api.partner.com/ अभी भी sid=SECRET भेजता है।bank.com -> https://notbank.com/ sid=SECRET भेजता है।https://attacker.test/ से addFromResponse Set-Cookie: sid=x; Domain=victim.internal; Path=/ के साथ। अगला https://victim.internal/ sid=x भेजता है।SUCCESS cakephp-cookie-suffix suffix-leak=yes control-other=yes plant-domain=yes how=cakephp-5.4.2 CAKEPHP-COOKIE-SUFFIX-WITNESS
RFC 6265 डोमेन-मैच (host === domain || str_ends_with($host, '.' . $domain))। जब Domain छोड़ा गया हो तो होस्ट-ओनली कुकीज़। उस Domain को अस्वीकार करें जो अनुरोध होस्ट से डोमेन-मैच नहीं करता। सार्वजनिक सफ़िक्स को अस्वीकार करें।
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।