
CakePHP 5.4.2 - उच्च - रिमोट - Unserialize - कैश इंजन बिना किसी क्लास allowlist के ऑब्जेक्ट्स को unserialize करते हैं
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cache-unserialize
राइट-अप: https://abraxaslabs.tech/research/cakephp-cache-unserialize
वर्ग: ऑब्जेक्ट इंजेक्शन पहुँच: रिमोट (Redis/Memcached राइट) / लोकल (FileEngine)
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.3.7 ने इसी कारण से Redis allowedClasses जोड़ा और बैकवर्ड कम्पैटिबिलिटी के लिए डिफ़ॉल्ट को true (सभी की अनुमति) पर छोड़ दिया। RedisEngine अब भी सीधा unserialize() कॉल करता है जब वह डिफ़ॉल्ट लागू होता है। FileEngine में कोई allowlist ही नहीं है। MemcachedEngine अब भी serialize को डिफ़ॉल्ट रूप से php पर रखता है।
जो कोई Redis पर cake_ कुंजी SET कर सकता है, या कैश फ़ाइल लिख सकता है, वह एक सीरियलाइज़्ड ऑब्जेक्ट रख देता है। अगला Cache::read (या कोई CacheSession लोड) उसे PHP वर्कर में चला देता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | ऑब्जेक्ट इंजेक्शन |
| पहुँच | रिमोट जब Redis या Memcached हमलावर से लिखने योग्य हो। tmp/cache पर FileEngine के लिए लोकल। |
| CWE | CWE-502 |
| CVSS | उच्च: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (कैश स्टोर में लिखने की आवश्यकता है)। FileEngine AV:L है। |
| उत्पाद | CakePHP |
| प्रभावित | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| प्रमाणीकरण | कैश स्टोर में लिखना (Redis SET, Memcached set, या कैश फ़ाइल)। लॉक-डाउन किए गए localhost Redis पर अनधिकृत HTTP नहीं। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
ऐप कैश में एक सीरियलाइज़्ड ऑब्जेक्ट रखें। अगला रीड वर्कर में PHP चला देता है। यह लैब एक witness फ़ाइल पर रुकती है। यह गैजेट चेन या शेल प्रदर्शित नहीं करती।
लैब-प्रमाणित (इंटीग्रिटी)
cake_<key> फिर Cache::read। डिफ़ॉल्ट प्रीफ़िक्स cake_ है। RedisEngine unserialize() सीधा unserialize($value) का उपयोग करता है जब allowedClasses डिफ़ॉल्ट true हो। एक रखा गया LabMarker ऑब्जेक्ट जिसे LabMarker के रूप में इंस्टैंशिएट किया गया और __wakeup ने witness फ़ाइल को PHP UID के रूप में लिखा।{expiry}\n{serialize($obj)} रखता है। FileEngine::get() अब भी सीधा unserialize($data) कॉल करता है। वही मार्कर, वही witness। फ़ाइलनाम prefix प्लस कुंजी (cake_labfile) है।allowedClasses => false ऑब्जेक्ट्स को अस्वीकार करता है। वही Redis पेलोड __PHP_Incomplete_Class के रूप में वापस आया। __wakeup नहीं चला। witness फ़ाइल अनुपस्थित थी।अनुमानित (यहाँ प्रयोग नहीं किया गया)
CacheSession::read वही सिंक है जब सत्र defaults => cache हो। प्रत्येक सत्र लोड हमलावर-नियंत्रित कैश बाइट्स का एक unserialize बन जाता है।serialize => php उसी प्रकार का बग है। इस लैब ने Memcached शुरू नहीं किया।बंद / यह अवशेष नहीं
cakephp/app पर अनधिकृत HTTP जो Redis को उजागर नहीं करता।allowedClasses => false (या एक सख्त सूची) पहले से ही ऑब्जेक्ट्स को ब्लॉक करता है जब कोई ऑपरेटर इसे सेट करता है। यह डिफ़ॉल्ट नहीं है।वही पिन अवशेष: window SQLi, collate SQLi, attachment CRLF.
2026 FunctionsBuilder / jsonValue / Smtp CRLF / View element लहर के बाद मैंने cakephp/cakephp 5.4.2 को पिन किया। RedisEngine विकल्प का दस्तावेज़ीकरण करता है और फिर भी इसे डिफ़ॉल्ट रूप से खुला रखता है:
* - `allowedClasses` ... Defaults to `true` (allow all) for backwards compatibility.
...
'allowedClasses' => true,
पढ़ने का पथ:
protected function unserialize(string $value): mixed
{
if (preg_match('/^[-]?\d+$/', $value)) {
return (int)$value;
}
$allowedClasses = $this->getConfig('allowedClasses');
if ($allowedClasses !== true) {
return unserialize($value, ['allowed_classes' => $allowedClasses]);
}
return unserialize($value);
}
FileEngine में इसका कोई समतुल्य विकल्प नहीं है:
if ($data !== '' && !empty($this->_config['serialize'])) {
$data = unserialize($data);
गलत मोड़ जो पहले से दर्ज हैं: लॉकडाउन किए गए localhost Redis को unauth HTTP RCE मानना; एक gadget chain भेजना; FileEngine को remote होने का दावा करना; एक reverse shell। नाटक। Oracle एक मार्कर __wakeup है जो एक flag फ़ाइल लिखता है।
python3 cakephp-cache-unserialize-Abraxas-Labs.py
or
cd lab
./run.sh
लक्ष्य केवल 127.0.0.1:19470। Docker के अंदर टैग 5.4.2 से लाइव CakePHP 5.4.2। Redis 7 protected-mode बंद के साथ ताकि होस्ट SET कर सके। PHP 8.3 ext-redis के साथ। मार्कर क्लास LabMarker जिसमें __wakeup है जो /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS लिखता है। कोई शेल नहीं।
SUCCESS cakephp-cache-unserialize redis-default-wakeup=yes redis-denied-wakeup=no file-wakeup=yes pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 how=live CAKEPHP-CACHE-UNSERIALIZE-WITNESS
Redis के allowedClasses को डिफ़ॉल्ट रूप से false करें, या ऐप वास्तव में जिन क्लासेस को संग्रहीत करता है उनकी एक सीमित सूची पर सेट करें। FileEngine में भी यही विकल्प जोड़ें और get() में इसका पालन करें। Memcached के serialize को डिफ़ॉल्ट रूप से json करें। यह दस्तावेज़ित करें कि CacheSession कैश इंजन की unserialize नीति को विरासत में लेता है।
887b641de9f7aba06071f98f17edcbc573cbcf63)RedisEngine.php · FileEngine.phpGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।