
CakePHP 5.4.2 - उच्च - रिमोट - Unserialize - कैश इंजन बिना किसी क्लास allowlist के ऑब्जेक्ट्स को unserialize करते हैं
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cache-unserialize
Class: Object injection Reach: Remote (Redis/Memcached write) / Local (FileEngine)
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.3.7 ने इसी कारण से Redis allowedClasses जोड़ा और बैकवर्ड कम्पैटिबिलिटी के लिए डिफ़ॉल्ट को true (सभी की अनुमति) पर छोड़ दिया। RedisEngine अब भी उस डिफ़ॉल्ट के लागू रहने पर सादा unserialize() कॉल करता है। FileEngine में कोई allowlist ही नहीं है। MemcachedEngine अब भी serialize को डिफ़ॉल्ट रूप से php पर रखता है।
जो कोई Redis पर cake_ key SET कर सकता है, या cache फ़ाइल लिख सकता है, वह एक serialized object रोपित करता है। अगला Cache::read (या कोई CacheSession लोड) उसे PHP worker में चलाता है।
| ID | अभी कोई CVE नहीं |
| Class | Object injection |
| Reach | Remote जब Redis या Memcached हमलावर से लिखने योग्य हो। tmp/cache पर FileEngine के लिए Local। |
| CWE | CWE-502 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (cache store में लिखने की आवश्यकता है)। FileEngine AV:L है। |
| Product | CakePHP |
| Affected | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | cache store में लिखना (Redis SET, Memcached set, या कोई cache फ़ाइल)। लॉक-डाउन localhost Redis पर unauth HTTP नहीं। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
ऐप cache में एक serialized object रोपित करें। अगला read worker में PHP चलाता है। यह lab एक witness फ़ाइल पर रुक जाता है। यह gadget chain या shell प्रदर्शित नहीं करता।
Lab-प्रमाणित (integrity)
cake_<key> फिर Cache::read। डिफ़ॉल्ट prefix cake_ है। RedisEngine unserialize() सादा unserialize($value) उपयोग करता है जब allowedClasses डिफ़ॉल्ट true हो। एक रोपित LabMarker object जिसे LabMarker के रूप में instantiate किया गया और __wakeup ने witness फ़ाइल को PHP UID के रूप में लिखा।{expiry}\n{serialize($obj)} रोपित करें। FileEngine::get() अब भी सादा unserialize($data) कॉल करता है। वही marker, वही witness। फ़ाइलनाम prefix प्लस key (cake_labfile) है।allowedClasses => false objects को अस्वीकार करता है। वही Redis payload __PHP_Incomplete_Class के रूप में वापस आया। __wakeup नहीं चला। witness फ़ाइल अनुपस्थित थी।अनुमानित (यहाँ अभ्यास नहीं किया गया)
CacheSession::read वही sink है जब session defaults => cache हो। प्रत्येक session लोड हमलावर-नियंत्रित cache bytes का unserialize बन जाता है।serialize => php वही श्रेणी का bug है। इस lab ने Memcached शुरू नहीं किया।बंद / यह leftover नहीं
cakephp/app पर unauthenticated HTTP जो Redis को उजागर नहीं करता।allowedClasses => false (या कोई सख़्त सूची) पहले से ही objects को रोकता है जब कोई operator इसे सेट करता है। यह डिफ़ॉल्ट नहीं है।वही pin leftovers: window SQLi, collate SQLi, attachment CRLF.
मैंने 2026 FunctionsBuilder / jsonValue / Smtp CRLF / View element लहर के बाद cakephp/cakephp 5.4.2 pin किया। RedisEngine विकल्प का दस्तावेज़ीकरण करता है और अब भी इसे खुला डिफ़ॉल्ट रखता है:
* - `allowedClasses` ... Defaults to `true` (allow all) for backwards compatibility.
...
'allowedClasses' => true,
Read path:
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 एक marker __wakeup है जो एक flag फ़ाइल लिखता है।
python3 cakephp-cache-unserialize-Abraxas-Labs.py
या
cd lab
./run.sh
लक्ष्य केवल 127.0.0.1:19470। Docker के अंदर tag 5.4.2 से लाइव CakePHP 5.4.2। Redis 7 protected-mode off के साथ ताकि host SET कर सके। PHP 8.3 ext-redis के साथ। Marker class LabMarker जिसमें __wakeup है जो /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS लिखता है। कोई shell नहीं।
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 करें, या उन classes की सख़्त सूची पर जो ऐप वास्तव में संग्रहीत करता है। वही विकल्प FileEngine में जोड़ें और इसे get() में मानें। Memcached serialize को डिफ़ॉल्ट रूप से json करें। दस्तावेज़ित करें कि CacheSession cache engine की unserialize नीति विरासत में लेता है।
887b641de9f7aba06071f98f17edcbc573cbcf63)RedisEngine.php · FileEngine.phpGNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई वारंटी नहीं।